目标检测之手撕神经网络——猛男才不用tensorflow

怎么样?看到标题是不是感到很新奇。我最近看一个同济大学的博士不用tensorflow,只用python和numpy就搭出了处理mnist手写数据集的两层神经网络,感觉非常有意思,我把他的代码复现了,现在我来一点一点解释给大家。

1、先调用需要的包

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

2、定义激活函数。很简单的两层神经网络,第一层的激活函数用tanh,第二层的激活函数用softmax,d_tan和d_softmax分别是tanh和sotfmax的导函数,用于反向传播的时候计算梯度。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

3、一些变量定义。dimension表示第一层有784个神经元,第二层有10个神经元。activation是激活函数,differential表示激活函数集其求导函数,distribution设定w,b的计算范围。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

4、参数初始化。初始化W和b,偏置b全部可以初始化为0,W初始化为以0为中心的分布。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

5、定义正向传播。正向传播就是图片(784,)经过两层神经网络计算得到预测值(10,)

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

6、获取训练集(train set)、验证集(validation set)、测试集(test set)。训练集,54000张,验证集,6000张,测试集有10000张。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

7、设置one-hot编码,后面会需要将label转成one-hot编码

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

8、定义损失函数。损失函数非常简单,真值减去预测值的平方。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

9、定义验证集损失和验证集精度的计算方式。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

10、定义梯度的计算方式。计算b0、b1、w1的梯度,并输出

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

11、按照batch计算梯度。一般训练集数据比较多,不会一次全部计算,要分批(batch)进行计算,算出每一批的梯度然后输出。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

12、更新梯度。参数减去计算得到的梯度乘以学习率,从而得到更新后的梯度。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

13、进行训练。设置batch为100,epoch为5,每个epoch都进行验证集验证精度和损失。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow

14、训练结果。代码写完了,可以开心地进行训练啦!训练结果如图,验证集上的精度可以达到0.92以上,很不错了,感兴趣的朋友可以使用matplotlib把训练结果可视化,我就不做了,哈哈哈,睡觉去了。

深度学习/目标检测之手撕神经网络——猛男才不用tensorflow


分享到:


相關文章: