Processing math: 100%

cs231n Assignment1 笔记

Posted by Packy on April 9, 2018

入坑cs231n卷积神经网络入门,好多数学公式,赶快记起来。

标签(空格分隔): Python cs231n


智能单元笔记翻译 github参考1 github参考2

compute_distances_no_loops

主要是一个数学公式推导问题,也体现了numpy broadcast功能的强大~ 好好利用broadcast可以写出vectorized code。当我们对一个标量或者向量进行broadcast时,一定是指按元素(elementwise)操作,不像矩阵乘法那样的操作。

  1. 假设测试集矩阵P大小为M×D, 训练集矩阵C 大小为N×D
  2. PiPiCjCj
Pi=[Pi1Pi2PiD] Cj=[Cj1Cj2CjD]
  1. 计算一下PiCj的距离:
d(Pi,Cj)=(Pi1Pj1)2+(Pi2Pj2)2++(PiDPjD)2=(P2i1+P2i2++P2iD)+(C2j1+C2j2++C2jD)2(Pi1Cj1+Pi2Cj2++PiDCjD)=||Pi||2+||Cj||22PiCj
  1. 结果矩阵的每行元素:
Res(i)=(||Pi||2||Pi||2||Pi||2)+(||C1||2||C2||2||CN||2)2Pi(C1C2CN)=(||Pi||2||Pi||2||Pi||2)+(||C1||2||C2||2||CN||2)2PiC
  1. 结果矩阵为:
Res=(||P1||2||P1||2||P1||2||P2||2||P2||2||P2||2||PM||2||PM||2||PM||2)+(||C1||2||C2||2||CN||2||C1||2||C2||2||CN||2||C1||2||C2||2||CN||2)2PC=(||P1||2||P2||2||PM||2)M×1(111)1×N+(111)M×1(||C1||2||C2||2||CN||2)1×N2PM×DCN×D

python代码可以这样写:

M = np.dot(X, self.X_train.T)
te = np.square(X).sum(axis = 1) #水平延伸,对3072维数据进行平方后求和
tr = np.square(self.X_train).sum(axis = 1)
dists = np.sqrt(-2*M+tr+np.matrix(te).T)

其中最后一步公式转换成相同维度可以相加的过程,被broadcast特性给省略了。

矩阵大小为:

    ('X.type', <type 'numpy.ndarray'>)
    ('X.shape = ', (500L, 3072L))
    ('self.X_train.shape = ', (5000L, 3072L))
    ('M.shape = ', (500L, 5000L))
    ('te.shape = ', (500L,))
    ('tr.shape = ', (5000L,))
    ('dists.shape = ', (500L, 5000L))

Logs

  1. 2018-2-16 入坑,完成了knn算法的学习,了解了基本原理。
  2. 2018-2-26 完成了knn算法的实践。
  3. 2018-3-15 重新开始~~了解了一下broadcasting机制。

Loading comments...