CS231n assignment1 -- Two-layer neural network

   作业地址:https://github.com/donghaiyu233/cs231n,欢迎fork~。 

   接近assignment1的尾声了,这次我们要完成的是一个两层的神经网络,要求如下:


   RELU使用np.maximum()即可;

   Softmax与作业上个part相同,可以直接照搬。

   不同的地方在求导,两个全连接层,共有W1 b1 W2 b2四个参数。对于它们具体的计算过程下面根据代码讨论.

    1.前向传播

out1 = X.dot(W1) + b1
relu = np.maximum(0, out1)
scores = relu.dot(W2) + b2 
#N为num_train
correct_class_score = scores[np.arange(N), y].reshape(N,1)
exp_sum = np.sum(np.exp(scores), axis = 1).reshape(N, 1)
loss = np.sum(np.log(exp_sum) - correct_class_score)
loss /= N
loss += 0.5 * reg * np.sum(W1 * W1) + 0.5 * reg * np.sum(W2 * W2)

    2.反向传播

    首先是第二层的dW2 db2。先说b的导数,由于使用线性模型y = Wx + b,对b求偏导结果为1,因此把上游传下来的值sum以下就行,无论那一层都是如此,因此db2就是对loss直接sum,dW2可直接套用Softmax结果。

p2 = np.exp(scores) / exp_sum
p2[np.arange(N), y] += -1
p2 /= N  #(N, C)
dW2 = relu.T.dot(p2)
dW2 += reg * W2
grads['W2'] = dW2
grads['b2'] = np.sum(p2, axis = 0)

     然后是第一层的dW1 db1。db1依然为上游传的值求sum;然后利用链式法则,dW1的计算如下(真正的计算顺序为X1PW2),再注意中间加上relu层即可。

         

p1 = p2.dot(W2.T)
p1[relu <= 0] = 0
dW1 = X.T.dot(p1)
dW1 += reg * W1
grads['W1'] = dW1
grads['b1'] = np.sum(p1, axis = 0)

至此,neural_net.py基本完成,其余部分比较简单,之前也做过,这里不再讨论。

3.验证与调参

验证模型:①输入给定值,计算与理论结果的误差;②使用很小的数据集训练,正常情况下loss可减小到0。

验证正确后,根据题目给定的数据进行训练,得到训练结果如下:


      看loss的曲线,发现learning_rate还太低,可以提高;训练集与验证集的gap很小,可以在不过拟合的情况下考虑适当增大hidden layer的尺寸来得到更好的学习能力。还有可以考虑的超参数是epochs、regularization strength,此外一般来说增加迭代的次数会训练得到更好的结果。最后,在使用默认learning rate decay也可获得较好效果后,我们也可以尝试进行调整。

       以下是我调整的参数 

input_size = 32 * 32 * 3
hidden_size = 280
num_classes = 10
net = TwoLayerNet(input_size, hidden_size, num_classes)
# Train the network
stats = net.train(X_train, y_train, X_val, y_val,
            num_iters=3000, batch_size=400,
            learning_rate=1.6e-3, learning_rate_decay=0.9,
            reg=0.5, verbose=True)

       最终测试集的结果为:

                               

       嘻嘻,拿到了3分的bonus.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值