TensorFlow搭建手写识别网络
TensorFlow搭建手写识别网络
b站看的爱可可老师上传的公开课《不用博士学位玩转Tensorflow深度学习》。
话说爱可可-爱生活老师真·神仙老师,我从微博关注到b站。上次宣姐问我居然也关注他们老师,我才知道是北邮的老师。羡慕!!
理解
每层神经网络的公式:
\[ softmax(X.W + b) \]
X是输入的量,假如有100张图片,每张图片784像素,那么X就是100*784
W是权重向量,假如有10个神经单元,要给784个输入的值赋权,W就是784*10
b是bias,感觉类似一个常数。它会给没一张图片的结果最后加一个同样的b
那么得到的X.W + b就是100*10, 是给100张图片分别计算的10个output,如果对应手写数字识别的最后一层,就可以理解成对应数字0-9的预测值了。用softmax针对每张图片的结果,转换成一个总合为1的概率值,其中概率最高的那个就值对应的位置(比如第六个值是98%),就是预测结果了(手写数字6)
(后边还有讲,中间层不用softmax,用sigmoid,用relu)
cross entropy损失函数
\[ cross\_entropy=-\sum Y\_{true} * \log (Y) \]
看训练效果

这是把训练和测试曲线放在一起,同时看准确率和loss。
当噪声很大,像training curve那样,那说明learning rate太大了。调小点,或者让它自动下降,很ok的trick。
当出现loss图那样,training loss不断下降,test loss反升,这就是过拟合。解决方法是正则化。具体的方法其实叫dropout。
过拟合的本质:
给了模型太多自由的空间,想象它太大了,可以把训练集中每一张图都存进去,那它肯定不是在学习可以generalize的feature,而是一些easy treaty
dropout:解决过拟合
就是在每一轮训练的时候随机shoot掉一些neoron,让它值变成0。
对于CNN来说,在卷积层搞dropout,it hurts too much,所以在全连接层搞就行

代码
一层的simplest model


tf.matmul是matrix multiply

用的Gradient Descent是梯度下降啦

概念上,前面几步只是定义要用哪些公式,是formal的,是graph的;定义好了公式之后,也方便在多gpu里跑代码。现在这一步,才是让它动起来

回顾所有代码
多层的全连接model
全连接就是数据1维嘛,扁平的,丢失了像图片这种2维数据的形状等信息

过去sigmoid是中间层最常用的激活函数,简单地给一个0-1之间的结果
现在有了relu,都用它: 超简单,负值舍弃为0,正值原封不动。它为啥效果更好?不知道,人们试了,它更好,仅此而已。有传说说是生物学家说现在人脑中更接近relu,计算机人就用了,真的更好。
用relu往往模型收敛得更sharply。有时候在很深的神经网络里,它俩优劣分明,用sigmoid的话模型甚至不收敛



卷积神经网络
本质上就是保持2维的信息量嘛。它跟全连接网络有个概念上的不同,就是每层layer的4个维度(channels), 每个维度的所有神经单元用的权重向量是一样的。


truncated_normal is just complicated way of saying ramdom

tf的conv2d函数可以方便地让你指定步长之后,自动在图片的长和宽2维上走