上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如:
这里表示有两个输入,一个输出。
现在我们已经不能采用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); }
12-24 16:43