这里需要一步步从零开始(也不完全是0)建立神经网络,自己造一个弱化版的TensorFlow,能够更好的理解神经网络的原理。
虽然以后可能自己也不会再自己写搭建神经网络的代码,但是深入理解了神经网络的构造之后,就能更好的分析自己的输入和得到的输出,来发现可能会出现的问题(比如有些点一直都被激活或者一直都不会被激活,训练的时候需要关注这样是否会产生误差)
所以在Python中,我们首先定义Node这个Object,它具有输入节点,输出节点,值和梯度4个properties,并且有forward和backward这2个method。
然后建立subclass,就是具体Node的类型,有Input,Linear,Sigmoid,MSE,除了Input只有反馈没有前馈(因为没啥好计算的)之外大家都有前馈和反馈的method,并且每种Node的计算方法不一样,properties也不一样(类似function的输入)。
最后是MiniFlow自己的Method,topological_sort(), forward_and_backward(), sgd_update()。
topological_sort():把一个表图变换成线性流程
forward_and_backward():对每一个节点各自调用前馈和反馈函数
sgd_update():根据weight,bias,learning_rate计算新的weight和bias
还涉及到batch_size,就是指一次循环中取的样本数量,越多越精确,因为如果数据集很大的话用gd内存会不够,所以就用速度快精度也不太差的sgd。
扩展阅读:
- Yes you should understand backprop by Andrej Karpathy
- Vector, Matrix, and Tensor Derivatives by Erik Learned-Miller.
至此MiniFlow就建好了,完全可以用在MNIST上了!