我们在上一次学习了使用飞桨对手写数字的图片进行数据处理。
最重要的便是数据格式转换,以及随机排序。
接下来我们讨论使用什么样的网络结构模型。
我们会发现,在前面的波士顿房价预测模型中,是一个线性回归问题,但手写数字识别显然不是,我们需要更复杂的网络去进行识别。
所以我们选择多层神经网络
配置网络:普通的多层神经网络
- 基础模型:神经网络
输入层+隐含层+输出层,非线性变换Sigmoid。
输出层:单一输出。
层数相对较多,且在其中加入一些非线性的激活函数,可以使网络表达更加复杂的关系。
隐含层的数量可以逐层尝试,数量越多,模型表达能力更强。
sigmoid、relu都是激活函数。
我们这里用sigmoid(s型曲线),可以增加模型的非线性能力。
import matplotlib.pyplot as pltdef sigmoid(x):# 直接返回sigmoid函数return 1. / (1. + np.exp(-x))# param:起点,终点,间距x = np.arange(-8, 8, 0.2)y = sigmoid(x)plt.plot(x, y)plt.show()
2. 以类的方式组建网络
_init_函数:定义每层
声明输入、输出、隐含层
输入层:输入784维,输出10(为了和隐含层链接),激活函数sigmoid
隐含层:输入10*10,输出10,激活函数sigmoid
输出层:输入10,输出1,激活函数不设置,输出数字
forward函数:串联上述几个层
# 多层全连接神经网络实现class MNIST(fluid.dygraph.Layer):def __init__(self):super(MNIST, self).__init__()# 定义两层全连接隐含层,输出维度是10,激活函数为sigmoidself.fc1 = Linear(input_dim=784, output_dim=10, act=\'sigmoid\') # 隐含层节点为10,可根据任务调整self.fc2 = Linear(input_dim=10, output_dim=10, act=\'sigmoid\')# 定义一层全连接输出层,输出维度是1,不使用激活函数self.fc3 = Linear(input_dim=10, output_dim=1, act=None)# 定义网络的前向计算def forward(self, inputs, label=None):inputs = fluid.layers.reshape(inputs, [inputs.shape[0], 784])outputs1 = self.fc1(inputs)outputs2 = self.fc2(outputs1)outputs_final = self.fc3(outputs2)return outputs_final
批次计算与之前相同,但要加一个维度,大小为batchsize。
配置网络:卷积神经网络
卷积神经网络专门为图像设计。
虽然使用经典的全连接神经网络可以提升一定的准确率,但对于计算机视觉问题,效果最好的模型仍然是卷积神经网络。卷积神经网络针对视觉问题的特点进行了网络结构优化,更适合处理视觉问题。
但是,转换是有损失的
卷积层核心设计:局部视野、参数共享
池化层:保留主要特征
使用卷积核去扫整个图片。
使用Conv2D,Pool2D直接实现。
最后:我们会发现,卷积网络的损失值下降更快,且损失值更小。