上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如:

这里表示有两个输入,一个输出。

现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量存在几次方的分量,所以我们采用一个神经网络去定义一个函数。

我们假设只有一个输入、一个输出,神经网络模型结构类似上图,其中蓝色的路径仍为线性模型,红色路径为阶跃函数,是非线性模型。

以上模型只有三个神经元,设输入为x,隐藏层为h,激活函数输出为a,最终输出为y,整个数据计算流情况如下:

以上共有6+3+1个变量,整个训练的过程就是要解出这些变量。官方教程内有自定义神经网络模型的求解代码,和解线性模型的流程一致,大致以下几个步骤:

1、默认所有k=1,b=0;

2、将x代入模型,求得pred_y,通过pred_y和y计算损失函数,在通过损失函数来计算梯度;

3、通过梯度调整k、b的值

4、重复上述2、3过程,直到损失函数足够小。

具体代码请参看官方示例代码。

我们这篇文章将采用Keras封装好的方法来进行神经网络的训练和应用。

整个程序包括:创建模型、训练模型和应用模型三个过程。

主线程代码:

        public void Run()
{
//1、创建模型
Model model = BuildModel();
model.compile(loss: keras.losses.MeanSquaredError(),
optimizer: keras.optimizers.SGD(0.02f),
metrics: new[] { "mae" });
model.summary(); //2、训练模型
(NDArray train_x, NDArray train_y) = PrepareData(1000);
model.fit(train_x, train_y, batch_size: 64, epochs: 100); //3、应用模型(消费)
test(model);
}

1、创建模型

BuildModel方法定义如下:
        /// <summary>
/// 构建网络模型
/// </summary>
private Model BuildModel()
{
// 网络参数
int num_features = 1; // data features
int n_hidden_1 = 16; // 1st layer number of neurons.
int num_out = 1; // total output . var model = keras.Sequential();
model.add(keras.Input(num_features));
model.add(keras.layers.Dense(n_hidden_1));
model.add(keras.layers.LeakyReLU(0.2f));
model.add(keras.layers.Dense(num_out)); return model;
}

以上:Input为输入层,Dense为全连接层,激活函数可选包括:Sigmod、ReLu、LeakyReLu、tanh

model.compile方法定义该模型的训练方式:

loss: keras.losses.MeanSquaredError()表示损失函数采用均方差公式(MSE),这个公式上一篇文章介绍过
optimizer: keras.optimizers.SGD(0.02f)表示参数更新采用随机梯度下降法(SGD),学习率为0.02
metrics: new[] { "mae" }表示要显示的模型评价方法为平均绝对误差(Mean absolute Error),另外此处还有一个选项为acc,表示准确性( accuracy),后面在进行分类学习时将采用这种评价方法。

model.summary()方法将打印出该模型的摘要信息。

2、训练模型

(NDArray train_x, NDArray train_y) = PrepareData(1000);

model.fit(train_x, train_y, batch_size: 64, epochs: 100);

首先要加载学习数据,然后将学习数据提供给fit方法进行学习,batch_size 表示每次运算取的数据量,epochs表示循环迭代的次数。所有学习数据用完一次就表示一个epoch,1000除以64等于15.625,所以每计算16次就表示一个epoch。

整个训练过程中将打印出下列信息:

PrepareData方法:

        /// <summary>
/// 加载训练数据
/// </summary>
/// <param name="total_size"></param>
private (NDArray, NDArray) PrepareData(int total_size)
{
float[,] arrx = new float[total_size, 1];
float[] arry = new float[total_size]; for (int i = 0; i < total_size; i++)
{
float x = (float)random.Next(-400, 400) / 100;
float y = x * x; arrx[i, 0] = x;
arry[i] = y;
} NDArray train_X = np.array(arrx);
NDArray train_Y = np.array(arry); return (train_X, train_Y);
}

该方法生成1000个符合y=x*x的标准数据。

3、应用模型

学习完成以后,该模型就可以用于实际应用了。我们随机生成一下数据,将模型计算的结果和理论实际的数值进行比较,可以判断模型是否有效。

        /// <summary>
/// 消费模型
/// </summary>
private void test(Model model)
{
int test_size = 10; for (int i = 0; i < test_size; i++)
{
float x = (float)random.Next(-300, 300) / 100;
float y = x * x; var test_x = np.array(new float[1, 1] { { x } });
var pred_y = model.Apply(test_x); Console.WriteLine($"{i}:x={(float)test_x:0.00}\ty={y:0.0000} Pred:{(float)pred_y[0].numpy():0.0000}");
}
}

运行结果如下:

看结果情况,基本像那么一回事。

【相关资源】

源码:Git: https://gitee.com/seabluescn/tf_not.git

项目名称:NonlinearRegressionWithKeras

目录:查看TensorFlow.NET机器学习入门系列目录

TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归的更多相关文章

  1. TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题

    上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...

  2. TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST)

    从这篇文章开始,终于要干点正儿八经的工作了,前面都是准备工作.这次我们要解决机器学习的经典问题,MNIST手写数字识别. 首先介绍一下数据集.请首先解压:TF_Net\Asset\mnist_png. ...

  3. TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST

    "如果一个算法在MNIST上不work,那么它就根本没法用:而如果它在MNIST上work,它在其他数据上也可能不work". -- 马克吐温 上一篇文章我们实现了一个MNIST手 ...

  4. TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST

    本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...

  5. TensorFlow.NET机器学习入门【8】采用GPU进行学习

    随着网络越来约复杂,训练难度越来越大,有条件的可以采用GPU进行学习.本文介绍如何在GPU环境下使用TensorFlow.NET. TensorFlow.NET使用GPU非常的简单,代码不用做任何修改 ...

  6. TensorFlow.NET机器学习入门【0】前言与目录

    曾经学习过一段时间ML.NET的知识,ML.NET是微软提供的一套机器学习框架,相对于其他的一些机器学习框架,ML.NET侧重于消费现有的网络模型,不太好自定义自己的网络模型,底层实现也做了高度封装. ...

  7. TensorFlow.NET机器学习入门【1】开发环境与类型简介

    项目开发环境为Visual Studio 2019 + .Net 5 创建新项目后首先通过Nuget引入相关包: SciSharp.TensorFlow.Redist是Google提供的TensorF ...

  8. TensorFlow.NET机器学习入门【2】线性回归

    回归分析用于分析输入变量和输出变量之间的一种关系,其中线性回归是最简单的一种. 设: Y=wX+b,现已知一组X(输入)和Y(输出)的值,要求出w和b的值. 举个例子:快年底了,销售部门要发年终奖了, ...

  9. 45、Docker 加 tensorflow的机器学习入门初步

    [1]最近领导天天在群里发一些机器学习的链接,搞得好像我们真的要搞机器学习似的,吃瓜群众感觉好神奇呀. 第一步 其实也是最后一步,就是网上百度一下,Docker Toolbox,下载下来,下载,安装之 ...

随机推荐

  1. AI剪辑和自定义UI,打造更智能的剪辑体验

    为满足开发者构建高效的应用内视频编辑能力,7月的HMS Core 6.0 推出了视频编辑服务(Video Editor Kit),一站式的视频处理能力获得了积极反响.同时,我们也关注到开发者需要集成丰 ...

  2. [省选联考 2021 A/B 卷] 宝石

    大概是一眼看出来是这个给定序列在树上序列上按顺序跑最大匹配. 然后考虑维护向上和向下的链的值. 大概的做法是用倍增维护,考虑\(f_{u,i}\)是\(c_u\)在序列里的位置向后匹配\(2^i\)位 ...

  3. 洛谷 P7879 -「SWTR-07」How to AK NOI?(后缀自动机+线段树维护矩乘)

    洛谷题面传送门 orz 一发出题人(话说我 AC 这道题的时候,出题人好像就坐在我的右侧呢/cy/cy) 考虑一个很 naive 的 DP,\(dp_i\) 表示 \([l,i]\) 之间的字符串是否 ...

  4. NFLSOJ 1072 - 【2021 六校联合训练 NOIP #1】异或(FWT+插值)

    题面传送门 一道非常不错的 FWT+插值的题 %%%%%%%%%%%% 还是那句话,反正非六校的看不到题对吧((( 方便起见在下文中设 \(n=2^d\). 首先很明显的一点是这题涉及两个维度:异或和 ...

  5. 洛谷 P1224 - [NOI2013] 向量内积(随机化)

    洛谷题面传送门 一道很神的随机化. 首先由于我们要求向量点乘 \(\bmod k\) 的值,因此我们可以将所有 \(x_{i,j}\) 都模上 \(k\),显然该操作不影响结果正确性. 注意到这里的 ...

  6. RNA-seq 生物学重复相关性验证

    根据拿到的表达矩阵设为exprSet 1.用scale 进行标准化 数据中心化:数据集中的各个数字减去数据集的均值 数据标准化:中心化之后的数据在除以数据集的标准差. 在R中利用scale方法来对数据 ...

  7. 63. Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal II My Submissions QuestionEditorial Solution Total Accepted: 79742 ...

  8. nrf 51802 和 nrf51822 的区别于联系

    51802QFAA与51822QFAA在FLASH 跟RAM的容量没有差别:区别在于:a,接收灵敏度 51802是-91dBm;51822是-93dBm,这个差异导致接收距离有差异:b,Tx Powe ...

  9. MybatisPlus的CRUD及拓展

    创建一个简单的MybatisPlus项目在上一篇博客:MybatisPlus入门程序 一.CRUD 1. select 1.1 查找全部用户 //查 @Test public void select( ...

  10. PowerToys插件扩展(类似Alfred)

    在mac系统除了自带的Spotlight还有一个很好用的工具叫Alfred image 在windows系统也有一个很好用的工具叫PowerToys,是微软的一个开源项目 image https:// ...