CS231n笔记-Assignment1

Convolutional Neural Networks for Visual Recognition

Posted by Pekary on August 9, 2017 , views

1.KNN

遇到的问题

本质上都可以通过自己写循环解决,不过使用numpy会方便很多。

  • numpy中如何用数组索引数组?

    只要两个元素都是numpy.array类型的就可以用过[ ]直接索引。

  • 如何统计数组中各个元素出现的次数?

    使用np.bincount方法,不过需要注意数组元素都需要大于0。

  • 不使用循环来计算测试集的每个元素与训练集的每个元素的l2值

    $(x_1 - x_2)^2 = x_1^2 - 2x_1x_2 + x_2^2$,分别计算这三项就可以,这个思想很好。

获得经验

  • python中用*接收元组,**接收字典。

  • 交叉验证时做数据划分

    设原始数据为X_train,标签为y_train

    • 第一种方法:用 np.array_split方法

      1
      2
      3
      4
      5
      6
      7
      
      X_train_folds = np.array_split(X_train, num_folds)
      y_train_folds = np.array_split(y_train, num_folds)
      # 得到第j折数据
      cv_X_train = np.hstack(X_train_folds[0:j] + X_train_folds[j+1:])
      cv_X_test = X_train_folds[j]
      cv_y_train = np.hstack(y_train_folds[0:j] + y_train_folds[j+1:])
      cv_y_test = y_train_folds[j]
      
    • 第二种方法:用range做mask

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
      num_training = 49000
      num_validation = 1000
      num_test = 1000
      
      mask = range(num_training, num_training+num_validation)
      X_val = X_train[mask]
      y_val = y_train[mask]
      
      mask = range(num_training)
      X_train = X_train[mask]  # 注意到这里把原始训练集覆盖了,不过后面要用的就是现在的训练集,所
                               # 以没关系
      y_train = y_train[mask]
      

  • 通过字典来计算平均值、标准差,用来画errorbar

    1
    2
    3
    
    # x为一字典
    [np.mean(v) for k, v in sorted(x.items())]
    [np.std(v) for k, v in sorted(x.items())]
    

2.SVM

获得经验

  • numpy二维数组使用列索引,取所有行的操作不能用slice操作 :,要有一个所有行号的显示表达才能使用列所有,实验中采用的range做行索引去取得所有行。
  • 查找数组或矩阵符合条件元素的下标,用np.where(xxx)[1]

3.Softmax

获得经验

  • 由于$\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$存在指数操作,我们可以把计算出来的所有$f$值减去$f$中最大的值,这样所得的$f$值均为负数,不会上溢。

  • $L_i = -\log \frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$ , 梯度计算:$\frac{\partial L_i}{\partial f_k} = P_k - \mathcal{I}(k =y_i)$

  • 变量名一定要有意义,不然很容易出错