cs231n assignment1(Two_Layer_Net)
两层网络(code)
首先来回顾一下我们的网络结结构:
输入层($D$个神经元),全连接层-ReLu($H$),softmax($C$)。
输入:$X [N\times{D}]$,输出 $y [N\times{1}]$
网络参数:$W1[D×H],b1[1×H],W2[H×C],b2[1×C]$
Propagation
$Z2 \color{Blue}{[N\times{C}]}$就是每个样本在每个类别下的分数(score)
$A2 \color{Blue}{[N\times{C}]}$就是每个样本在每个类别下的概率(prob)
关键代码如下:
(Propagation中计算的值,Backpropogation的计算中要用到)
1 | Z1 = np.dot(X, W1) + b1 |
loss
关键代码如下:
1 | # 最大似然项 |
Backpropogation
反向传播的推导,主要还是依据链式法则,从后至前进行推导。
MaskMat参见softmax_no_loop梯度推导
关键代码:
1 | # softmax函数求导 |
训练
train函数
还是采用stochastic gradient descent (SGD)进行优化。
具体操作与前面的线性学习器相同。每次迭代随机一小部分样本进行梯度下降:
1 | for it in range(num_iters): |
值得一提的是,随着优化的进行,我们离最小点越来越近,所以希望learning rate也越来越小,这样更可能不错过最小点的位置。
所以设置一个decay rate,每次Echo后与学习率相乘,使其相应变小。
1 |
|
train a network
先用默认的参数,训练一个网络
1 | input_size = 32 * 32 * 3 |
debug the training
可以看到我们用默认参数训练出的模型只有0.287的准确度。
一种方法就是,画出优化中损失函数和准确度的变化(可能每隔100次梯度下降就记录一下,然后画出来),找一下问题。
1 | # Plot the loss function and train / validation accuracies |
代码中的loss_history
、train_acc_history
、val_acc_history
都是在模型训练中,每隔100次迭代记录下来的。目的就是为了这时候,可以将梯度下降的过程可视化。
- 损失曲线下降趋势有点直,问题应该是learning rate太小了。
- train_acc和val_acc相差不大而且都挺低的,可能就是模型太小了,没有很好的拟合,应该增加模型的容量。
- 如果train_acc和val_acc相差挺大的话,可能是过拟合了。(当然这里没有)
另一个方法就是,把第一层的权重W1可视化。大多数网络中,W1可以看到一些直观的结构。
表现不好的$W1$:
表现较好的$W1$:
好吧,这个是要培养些直觉?
调参
和之前差不多,超参数有隐层神经元个数、学习率、正则化参数、梯度下降次数、dacayrate等等。
代码和之前差不多
1 | best_net = None # store the best model into this |