上一篇文章,《神经网络训练一次函数》属于入门级的基础,是比较简单的。它相当于只用了一个神经元,用单个的神经元来进行误差反馈调节,且没有激励函数。那么构建多层的包含多个神经元的网络,应该怎么做呢?
下午,我们利用一元二次函数随机生成训练数据,然后构建单层(包含多个神经元)神经网络对输入的数据进行拟合。
代码如下:
Tensorflow的理念是一种计算流图,我们很多的工作都是在构建系统的graph,代码并没有生效,只有当启动Session后,系统才会运行起来。
我们用tf.placeholder设置形参,类似声明变量,先定义好形参的类型和属性。后面建立session执行的时候再利用feed_dict字典传入对应的实参,由TensorFlow通过计算流图的方式,优化整个session需要执行的代码。
我认为这里比较重要的是理清楚数据在每层神经网络间传递时,数据的结构是怎么变化的,这样才好去设置in_size和out_size。大概是这样:上一层输出矩阵的列数等于下一层权重矩阵的行数,权重矩阵的列数等于当前网络层的神经元个数。
这一段主要是训练效果的可视化,可以观察到拟合曲线的动态变化过程哦,挺不错的。
训练结果:
训练初期,误差比较大。
训练后期,误差逐渐收敛,拟合效果较好。
这是学习速率=0.1,迭代5000次的训练结果,效果还算是不错的。
通过设置不同的学习速率,迭代5000次的结果。可以看到0.1和0.5的效果都挺不错的。所以,针对单个模型,训练效果和学习速率并不是总会呈现某种规律(比如上一篇拟合一次函数那样),需要多次尝试不同的学习速率。
这里固定学习速率为0.1,通过设置不同的神经元个数,观察训练的效果。在神经元个数=10的时候,可以得到较小的误差,但不一定会是最好的。因为当均方差过小的时候,容易产生过拟合,当有新的数据产生的时候,再用这个网络去预测就不一定准确了。
最后,大家如果需要源码,传送门:https://github.com/zhenshi123me/neural-network-learing.git
See you next time!
今天的背景音乐很欢快,我认为还不错,大家记得点一下~
领取专属 10元无门槛券
私享最新 技术干货