231n assignment 1

小Tips:

32bit的Python 用户空间只有2GB,所以只好装了64bit版本的。 一个数据集30M,6个读入是180M,然后估计是重复存了几个矩阵 , 就Memory Error了。 

numpy.reshape 如果将某个参数设为-1, 则会自动计算那一维度的长度,例如想把一个矩阵变成列向量,就reshape(-1,1)。

在numpy中,可以这样访问矩阵元素,array[a,b], 也可以这样 array[[1,2,3]],反正当成matlab用就好了

enumerate( list ) 函数的用法

np.flatnonzeros( array == x) 函数 把array中元素等于x的下标返回。 flat表示下标是扁平的,也就是说如果是一个矩阵,就返回转换成行向量时的下标。  nonzero表示 若参数为array时,返回非零元的下标。

另外终于弄清楚了 array中,shape = (3,)和(3,1)的区别。 (3,)是1维的[x,y,z],而(3,1)是二维的[[x,y,z]]

np.bincount(array) , 若array中最大元素为m,则会统计 [0,m]中每个整数在array中出现的次数,存放在返回数组中的第i项。例如返回为c,则c[3]就是3出现的次数。

import past包错误,安装 future包......

np.dot 和 @ 都是矩阵乘法。 *是数乘 

 

第一题KNN的详解:

https://blog.csdn.net/zhyh1435589631/article/details/54236643

 

第二题SVM:

Tips:

plt.imshow(mean_image.reshape((32,32,3)).astype('uint8')) 可以显示图片

hstack()是按列排列来组合,比如hstack((a,b)),结果是[a,b] 。 而vstack((a,b))结果是

[ [a]

[b] ]   .

 

margins[margins > 0] = 1  这种操作 

scores_correct = scores[np.arange(num_train), y] # 1 by N  这种操作 , 注意得到的是扁平的array。 这个原理好像是,如果你给的下标的维度是一样的,那就会成对的取。而不是对于行下标的每一项,都取遍列下标。

 

注意在numpy中,你把一列或一行像这样提取出来 a[1] 或 a[:,1] , 它的维度会降成1维。 所以这种语句才能用:

dW[:, j] += X[i]

题解,简直不要太清楚:

https://blog.csdn.net/alexxie1996/article/details/79184596

至于后面向量化的操作其实原理一样,稍微理解一下就行

 

最后的权重矩阵的可视化: 除了车还挺像的....

231n assignment 1_第1张图片

 

第三题softmax:

注意要给分数加个C ,就是每行分数最大的数

题解:https://blog.csdn.net/yc461515457/article/details/51924604 

 

第四题 two layer neural net:

这个比较详细:https://www.cnblogs.com/daihengchen/p/5754383.html

直到这里我才大概弄懂bp是怎么算的。因为之前上课的时候没认真听(是小姐姐讲的)全连接层的梯度,然后自己推了一下:

比如 X*W = Z . 现在我们有了Z的上游梯度矩阵 dZ 。 那么局部梯度 dZ / dW = X.T * dZ 。 dZ / dX = dZ * W.T 。 理解的方法就是把X行向量化,把W列向量化。然后看看这个结果发现刚好就是这样的。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(231n assignment 1)