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) \]

看训练效果

image-20201209232637919.png
image-20201209232637919.png

这是把训练和测试曲线放在一起,同时看准确率和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,所以在全连接层搞就行

image-20201209233058152
image-20201209233058152

代码

一层的simplest model

image-20201209224614996
image-20201209224614996
image-20201209225643852
image-20201209225643852

tf.matmul是matrix multiply

image-20201209230244362
image-20201209230244362

用的Gradient Descent是梯度下降啦

image-20201209230715571
image-20201209230715571

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

image-20201209231158567
image-20201209231158567

回顾所有代码

多层的全连接model

全连接就是数据1维嘛,扁平的,丢失了像图片这种2维数据的形状等信息

image-20201209231606387
image-20201209231606387

过去sigmoid是中间层最常用的激活函数,简单地给一个0-1之间的结果

现在有了relu,都用它: 超简单,负值舍弃为0,正值原封不动。它为啥效果更好?不知道,人们试了,它更好,仅此而已。有传说说是生物学家说现在人脑中更接近relu,计算机人就用了,真的更好。

用relu往往模型收敛得更sharply。有时候在很深的神经网络里,它俩优劣分明,用sigmoid的话模型甚至不收敛

image-20201209231908137
image-20201209231908137
image-20201209231624774
image-20201209231624774
image-20201209231649554
image-20201209231649554

卷积神经网络

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

image-20201209234526249
image-20201209234526249
image-20201209235119829
image-20201209235119829

truncated_normal is just complicated way of saying ramdom

image-20201209235327646
image-20201209235327646

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