前言
大家好,我是Kay,小白一个。以下是我完成斯坦福 cs231n-assignment2-FullyConnectedNets 这份作业的做题过程、思路、踩到的哪些坑、还有一些得到的启发和心得。希望下面的文字能对所有像我这样的小白有所帮助。
在之前我们有训练过一个两层的全连接网络,但是我们把求损失函数和求梯度放在同一个 function 里了,这不够“模块化”,等以后遇到更大型的网络这样的操作效率不高。在这份练习里,我们即将对每一层网络都分开构建前播和后播函数,再组装成一个 fully-connected nets。优化的事就交给接下来的几份训练吧。
(结尾有我个人对“神经网络”的学习心得!)
然而,首先一上来我就遇到了报错:
run the following from the cs231n directory and try again:
python setup.py build_ext --inplace
You may also need to restart your iPython kernel
后来发现核心的 bug 是:
running build_ext
building 'im2col_cython' extension
error: Unable to find vcvarsall.bat
这个错误怎么解决自行百度吧。哎,搞配置是一件特别令人沮丧的事情。
TODO1:完成全连接层和 ReLUs 的前播和后播函数
【思路】前播思路类似求 score 函数,后播就是 back propagation。四段代码见下,成功通过。
affine_forward:
x_re = np.reshape(x, (x.shape[0], -1))
out = np.dot(x_re, w) + b
affine_backward:
db = np.sum(dout, axis = 0)
x_re = np.reshape(x, (x.shape[0], -1))
dw = np.dot(x_re.T, dout)
dx = np.reshape(np.dot(dout, w.T), x.shape)
relu_forward:
out = np.maximum(0, x)
relu_backward:
dx = (x > 0) * dout
TODO2:利用"模块化"的函数,重构两层神经网络
【思路】其实还是一样的,先定义参数,然后求 scores,然后求 loss,然后求 gradient。
【开始Debug】这里和之前的作业不一样的是,W,b 和 reg 都是“全局变量”,要写成诸如 self.params['W1'] 的形式才能通过!
init:
self.params['W1'] = weight_scale * np.random.randn(input_dim, hidden_dim)