CS231n Assignment
CS231n
课程作业,记录自己弄懂和没弄懂的地方。第一个作业难度不大,感觉都是在练习numpy
的使用(相关函数的总结可以看 Frequently-used-Numpy-functions),特别是矩阵运算(广播等)。
因为在代码中相应部分都有注释(基本就相当于在代码里直接进行讲解了),感觉这里没有必要写个博客详细讲解,所以这里只是随便记录一些感觉还算重要的东西,以便日后复习。
具体代码可以见github
的 CS231n。
CS231n Assignment 1
Q1: k-Nearest Neighbor classifier
与大多数分类器一样,
KNN
分为两个步骤:train
和predict
。但不同的是,严格来说KNN
没有train
的过程(KNN
的train
过程就是“记住”所有的数据),在实际代码中通常按照下面的做(在 knn.ipynb 的第6
个cell
中也有提到):train
过程:载入所有的训练数据和测试数据,由于需要全部保存在内存中(比较消耗内存),所以称为“记住”。predict
过程:首先,计算每个测试数据与所有训练数据的距离矩阵;然后,返回每个测试数据对应距离矩阵中前k
小的训练数据的label
(有点绕,可以看代码);最后,把这k
个label
中出现次数最多的label
,作为这个测试数据的label
。
上面的
predict
过程适用于分类任务,如果是回归,在得出前k
小的训练数据(这里不再是label
,直接就是训练数据)后,进行求平均或者其它方式求得这个测试数据的回归(预测)值。可以用
cross-validation
选择合适的k
值,具体做法可以参考 knn.ipynb 的第14
个cell
。注意
validation set
与cross validation
是不同的。前者是固定一个dataset
,一般是整个training dataset
的20%
(这个比例根据算法中有多少hyperparameter
,以及这些hyperparameter
对于算法的预期影响来决定);后者是为了解决数据集太小的问题,一般是通过把数据集平均分的方法,只留一个做validation dataset
,其它的做training dataset
。hyperparameter
的确定是通过validation dataset
搜索得到的,当数量较少时就使用cross validation
Q2: Training a Support Vector Machine
思路比较简单,同样分为下面两个过程。
train
过程:计算loss
和gradient
,根据gradient
更新权重W
。predict
过程:用训练好的权重W
对测试数据进行预测。
所有的数据集都要减去
X_train
的图片的平均值(可见 svm.ipynb的第7
个cell
)?
注意:
要注意是要减去
X_train
的平均值这里减去的是
channel
的平均值:np.mean(X_train, axis=0)
,而不是每个图片减去各自的平均值(VGGNet
中也是这么做的)。AlexNet
中减去的是各自的平均值:np.mean(X_train, axis=1)
。可见 Lecture 5 的35分钟处。
Q3: Implement a Softmax classifier
- 同上面,两者只是
loss
和gradient
计算不一样。
Q4: Two-Layer Neural Network
gradient
的计算没弄懂。取
batch
进行训练:
1 | indices = np.random.choice(num_train, batch_size) |
Q5: Higher Level Representations: Image Features
- 没有太多代码要写,就是说明
feature extraction
对提高模型的性能能起到很好的作用。
CS231n Assignment 2
Q1: Fully-connected Neural Network
- 的代码不是很好,耦合度比较高,这里对其进行解耦,把代码模块化。整个作业的代码都很规范,可以直接拿来用,也很值得学习。
Q2: Batch Normalization
- BatchNormalization.ipynb 的最后一个问题怎么回答?
Q3: Dropout
BatchNormalization
与Dropout
在train
与test
的过程中都是不同的。BatchNormalization
在ReLU
的前面,Dropout
在ReLU
的后面:BatchNormalization --> ReLU --> Dropout
Dropout
- 让激活值(就是
WX + b
的结果)以一定的概率随机失活(就是设置成0
),目的是降低不同神经元之间的联系,从而减轻overfitting
现象的程度。
- 让激活值(就是
Maxout
Q4: ConvNet on CIFAR-10
CS231n Assignment 3
Q1: Image Captioning with Vanilla RNNs
rnn_forward(x, h0, wx, wh, b)
中batch为什么是(N, T, D)
?因为取
N
个example训练,每个都有T
个长度的时间维度,每个维度都是D
。比如取N个句子,每个句子都有T
个单词(不够长度的填充),每个单词的word embedding维度都是D
。为什么
rnn_forward(x, h0, wx, wh, b)
的计算方式与temporal_affine_forward(x, w, b)
的不一样,后者可以reshape
后相乘?