原帖:向日葵智能
本节再介绍一个实例,
对二次函数进行非线性回归
,并且使用 python 的matplotlib
库使训练结果动起来。
生成二次函数模拟数据
首先,创建一个等差数列,作为二次函数的自变量,然后按照 y = x^2 - 0.5
生成数据组。
xdata[:, np.newaxis],是将数据转成矩阵形式。
>> x = np.arange(3)
array([0, 1, 2])
>> x.shape
(3,)
>> x[:, np.newaxis]
array([[0],
[1],
[2]])
>> x[:, np.newaxis].shape
(3, 1)
为了让数据看起来更像是真实数据,加入随机噪声:
利用 matplotlib 库将生成的数据绘制成散点图(matplotlib 库的使用,可参考:python基础,安装并使用matplotlib库画图),添加代码:
执行,得到:
构建网络模型
输入 x 和实际值 y_ 使用占位符
,权值和偏置使用变量
(关于占位符和变量的使用可参考placeholder 和 variable op的使用)。
隐藏层我们使用 10 个神经元,那么隐藏层的权重w1
的形状就是[1,10],偏置b1
的形状为[1,10]。权重初始化为随机值,偏置初始化为一个较小的值,这是参考官方文档的。隐藏层的输出,使用ReLU
激活函数,否则网络将无法提供非线性信息,效果肯定不好。关于这一点,第八节说的非常清楚。
每次训练,我们只需输出 1 个值,所以输出层权重w2
的形状为[10,1],偏置形状[1,1]。
接下来,定义好损失函数和训练方法,就可以训练网络了。
训练网络,并且使结果可视化
初始化后,就可以在 session 里训练网络了。这里共训练 1001 次,每 50 次打印一次损失,并且描点作图一次,因此我们可以动态的看到训练结果。
最终,全部代码如下:
运行之,可在终端里看到损失不断减小。
而且,训练的曲线也在不断往参考数据靠近,如下图,整个训练结果的变化,清晰的显示了出来。