参考:书籍《TensorFlow实战》第四章
在完成第三章softmax regression后,发现无隐藏层只能根据像素点来学习特征,故通过加入一层隐藏层来实现多层感知机,来通过隐藏层学习更多特征。
1.虽然Sigmoid最接近概率分布输出,但在反向传播时会出现gradient vanishment。Relu函数max(0,x)从正面解决了梯度弥散的问题,而不需要通过无监督的逐层初始化权重来绕行。Relu特点如下:(1)单边抑制(x < 0为0)(2)相对宽阔的兴奋边界(3)稀疏激活性
实践中大部分情况下,将隐藏层的激活函数从Sigmoid替换成ReLU都可以带来训练速度及模型准确率的提升。当然神经网络的输出层一般都还是Sigmoid函数,因为它最接近概率输出分布,这也是为什么再输出层经常初始化W,b为0,因为sigmoid在0附近最敏感,梯度最大。
2.创建以个Tensorflow默认的InteractiveSession,这样后面执行各项操作就无须制定Session了。
3.在神经网络中,因为参数众多,经常出现参数比数据还多的情况,就非常容易出现只是记忆了训练集特征的情况,可以用Dropout解决。本次训练就是用到了dropout方法每次随机选取百分之75的隐藏层神经元来训练,以防overfitting。
4.函数tf.truncated_normal()
5.tf.reduce_sum()
函数名的前缀为什么是reduce_其实也就很容易理解了,reduce就是“对矩阵降维”的含义,下划线后面的部分就是降维的方式,在reduce_sum()中就是按照求和的方式对矩阵降维。那么其他reduce前缀的函数也举一反三了,比如reduce_mean()就是按照某个维度求平均值,等等。其中参数reduction_indices为1时是对每行各列元素求和,为0时是对每列各行元素求和。
总结:全连接神经网络(Fully Connected Network,FCN,MLP的另一种说法)也是有局限的,即使我们使用很深的网络,很多的隐藏结点,很大的迭代论述,也很难再mnist数据集上达到99以上的准确率。
代码见ubuntu中pycharmprojects的test_tensorflow的test2-multilayer perception