cs231n之Assignment2全連接網絡上

  • 2019 年 10 月 6 日
  • 筆記

cs231n之Assignment2全連接網絡上

——光城

0.說在前面

在上次作業中,已經實現了兩層神經網絡,但是有些問題,比如程序不夠模塊化,耦合度不高等問題,所以本節引出神經網絡的層與層結構。本節主要實現一種模塊化的神經網絡架構,將各個功能封裝為一個對象,包括全連接層對象,仿射層,Relu層等,在各層對象的前向傳播函數中,將由上一層傳來的數據和本層的相關參數,經過本層的激活函數,生成輸出值,並將在後面反向傳播需要的額外參數,進行緩存處理,將根據後面層次的提取與緩存值計算本層各參數的梯度,從而實現反向傳播。

1.仿射層

仿射層前向傳播

目標:

– 計算實現一個仿射層的前向傳播

輸入:

– x: (N, d_1, …, d_k)

– w: (D, M)

– b: (M,)

返回:

– out: (N, M)

– cache: (x, w, b)

實現

仿射層反向傳播

目標:

計算仿射層的後向傳播

輸入:

– dout: (N, M)

– cache:

x: (N, d_1, … d_k)

w: (D, M)

b: (M,)

返回:

– dx: (N, d1, …, d_k)

– dw: (D, M)

– db: (M,)

實現:

首先獲得上面前向傳播的輸出值與cache,緊接着計算反向傳播。

cache解開得到前面仿射層的前向傳播參數,接着計算梯度即可!

實現

2.RELU層

Relu層前向傳播

目標:

計算Relu的前向傳播

輸入:

– x: 任意shape的輸入

返回:

– out: 輸出同x一樣的shape

– cache: x

實現:

上面目標很明確,這裡直接來實現,不多解釋,這裡用到了一個布爾矩陣運算,如果覺得疑惑,請看作業詳解knn中的解釋!

實現

Relu層後向傳播

目標:

計算Relu的後向傳播

輸入:

– dout: 任何shape的前向輸出(這裡疑惑的看英文原文)

– cache:同dout相同shape的x

返回:

– dx: x的梯度

實現:

Relu只有矩陣中大於0的數有效,所以x>0篩選得出一個布爾矩陣,直接相乘就是最後的結果。因為如果x<0,求導肯定為0,所以有效值,就是x>0的結果!

實現

3.兩層組合

組合前向傳播

目標:

完成仿射層與Relu層組合

輸入:

– x: 仿射層的輸入

– w, b: 仿射層的權重

返回:

– out: ReLU層輸出

– cache: 後向傳播的緩存

實現

組合反向傳播

目標:

實現反向傳播

輸入:

– dout

– cache

返回:

– dx: x梯度

– dw: w梯度

– db: b梯度

實現:

直接調用剛才的方法。

4.兩層神經網絡

類封裝

目標:

實現affine – relu – affine – softmax架構

輸入:

– input_dim: 輸入層尺寸

– hidden_dim: 隱藏層尺寸

– num_classes: 類別數

– dropout: 隨機失活強度 0~1

– weight_scale: 權重範圍

– reg: 正規化

實現:

封裝全局參數

實現

損失函數

輸入:

– X: (N, d_1, …, d_k)

– y: (N,)

返回:

If y is None

test-time forward

– scores: (N, C)

If y is not None,

training-time forward

backward pass

– loss

– grads

實現

5.Solver訓練

概要

使用這個訓練之前,需要補充optim.py!

此文件實現了常用的各種一階更新規則用於訓練神經網絡。每個更新規則接受當前權重和相對於那些權重的損失梯度併產生下一組權重!

SGD

SGD公式

這個被稱為樸素sgd(Vanilla SGD)

公式中四個參數分別對應為:下一次的權重w,當前權重w,學習率,當前權重的梯度!

實現

Momentum

Momentum公式

這個被稱為結合動量的sgd(最常用)。

阿爾法代表學習率!

實現

RMSProp

RMSProp公式

實現

Adam

Adam公式

實現

訓練

實現

訓練結果