GitHub地址:https://github.com/ZJUFangzh/cs231n
作业2主要是关于搭建卷积神经网络框架,还有tensorflow的基本应用。
首先先搭建一个全连接神经网络的基本框架。
之前搭建的2层神经网络都是比较简单的,但是一旦模型变大了,代码就变得难以复用。因此搭建一个神经网络框架是很有必要的。
一般都会分为两部分forward
和backward
,一层一层来,因此两个函数成对出现就可以了。
1 | def layer_forward(x, w): |
1 | def layer_backward(dout, cache): |
Affine layer: foward
在cs231n/layers.py
中修改affine_forward
函数,也就是简单的全连接层的前向传播。
1 | def affine_forward(x, w, b): |
而后修改affine_backward
函数
1 | def affine_backward(dout, cache): |
然后是relu_foward
和relu_backward
函数。
1 | def relu_forward(x): |
1 | def relu_backward(dout, cache): |
然后它定义了一个三明治层,意思是将affine和relu连接在一起。在layer_utils.py
中。
1 | def affine_relu_forward(x, w, b): |
1 | def affine_relu_backward(dout, cache): |
在完成这些基本的函数之后,就可搭建一个简单的神经网络了。在fc_net.py
中:
先完成初始化,然后在loss中调用这些基本函数,得到loss,然后再计算梯度。
1 | class TwoLayerNet(object): |
回到notebook中,调用了已经为我们写好的solver类,model用的就是TwoLayerNet()
1 | model = TwoLayerNet() |
完成之后,我们就可以类似的,搭建一个多层的神经网络了,同样是在fc_net.py
的FullyConnectedNet
类中。这时候先不要去在意batchnorm和dropout,后面会来实现这些函数。
1 | class FullyConnectedNet(object): |
然后构建了三层的model
1 | # TODO: Use a three-layer Net to overfit 50 training examples. |
五层的:
1 | # TODO: Use a five-layer Net to overfit 50 training examples. |
而后用上了Momentum的优化方法,在optim.py
中
1 | def sgd_momentum(w, dw, config=None): |
然后再尝试另外两种优化的梯度下降法RMSprop和Adam
1 | def rmsprop(x, dx, config=None): |