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 --> DropoutDropout
- 让激活值(就是
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后相乘?