1. 程式人生 > >CS231n-2017 Assignment2 NN、BP、SGD、BN、CNN

CS231n-2017 Assignment2 NN、BP、SGD、BN、CNN

一、全連線神經網路

在上一次作業中,已經實現了兩層神經網路的架構。但該實現有個問題,即程式不夠模組化,比如在loss()函式中,同時計算了損失函式和各引數的梯度。這種耦合,使得擴充套件網路深度時,需要做大量修改。另外,神經網路的層與層的結構也類似,這意味著樸素實現的方式中存在著程式碼重複。而本作業中,將要實現一種模組化的神經網路架構:將各個功能層封裝為一個物件,如全連線層物件、ReLU層物件;在各層物件的前向傳播函式中,將由上層傳來的資料和本層的係數,產生本層的啟用函式輸出值,並快取計算梯度時所必需的引數;在各層物件的後向傳播函式中,將由下層傳來的各個啟用值的梯度和本層的快取值,計算本層各引數的梯度值。

1. 仿射層的前向傳播

前向傳播的實現非常直白,與上次作業中的實現相比,這次還需快取計算本層引數的梯度時,所需的中間計算結果。
layers檔案中的affine_forward()函式:

def affine_forward(x, w, b):
    out = None
    
    # TODO: Implement the affine forward pass. 
    batch_size = x.shape[0]
    x_oneline = x.reshape(batch_size, -1)
    out = x_oneline.dot(w) + b

    cache =
(x, w, b) return out, cache
2. 仿射層的後向傳播

相比於上次作業中的實現,這裡只是將具體邏輯抽離出來,並封裝為單獨的函式。
layers檔案中的affine_backward()函式:

def affine_backward(dout, cache):
    x, w, b = cache
    x_shape = x.shape
    batch_size = x_shape[0]
    sample_shape = x_shape[1:]
    M = w.shape[1]

    # TODO: Implement the affine backward pass.
x_oneline = x.reshape(batch_size, -1) dx, dw, db = None, None, None dx = dout.dot(w.T).reshape(batch_size, *sample_shape) dw = x_oneline.T.dot(dout) db = np.sum(np.ones(M) * dout, axis=0) return dx, dw, db
3. ReLU層的前向傳播

layers檔案中的relu_forward()函式:

def relu_forward(x):
    out = None

    # TODO: Implement the ReLU forward pass.
    out = np.maximum(0, x)

    cache = x
    return out, cache
4. ReLU層的後向傳播

在計算圖的後向傳播結構中,啟用層就像一個門開關。
layers檔案中的relu_backward()函式:

def relu_backward(dout, cache):
    dx, x = None, cache
    # TODO: Implement the ReLU backward pass.
    dx = dout*(x>0)
    return dx
5. 利用層物件重新實現兩層神經網路

fc_net檔案中的TwoLayerNet物件:

class TwoLayerNet(object):
    def __init__(self, input_dim=3*32*32, hidden_dim=100, num_classes=10,
                 weight_scale=1e-3, reg=0.0):
        self.params = {}
        self.reg = reg
        # TODO: Initialize the weights and biases of the two-layer net.
        self.params["W1"] = weight_scale * np.random.randn(input_dim, hidden_dim)
        self.params["b1"] = np.zeros(hidden_dim)
        self.params["W2"] = weight_scale * np.random.randn(hidden_dim, num_classes)
        self.params["b2"] = np.zeros(num_classes)

    def loss(self, X, y=None):
        
        scores = None
        # TODO: Implement the forward pass for the two-layer net.
        layer1_relu_out, layer1_relu_cache = affine_relu_forward(X, self.params["W1"], self.params["b1"])
        layer2_out, layer2_cache = affine_forward(layer1_relu_out, self.params["W2"], self.params["b2"])
        
        scores = layer2_out

        # If y is None then we are in test mode so just return scores
        if y is None:
            return scores

        loss, grads = 0, {}

        # TODO: Implement the backward pass for the two-layer net. 
        loss, dloss = softmax_loss(layer2_out, y)
        loss += 0.5 * self.reg * (np.sum(np.square(self.params["W1"])) + np.sum(np.square(self.params["W2"])))
        dlayer2_out, dW2, db2 = affine_backward(dloss, layer2_cache)
        _, dW1, db1 = affine_relu_backward(dlayer2_out, layer1_relu_cache)

        grads["W1"] = dW1 + self.reg * self.params["W1"]
        grads["b1"] = db1
        grads["W2"] = dW2 + self.reg * self.params["W2"]
        grads["b2"] = db2

        return loss, grads
6. 封裝訓練過程

下述引數可以使得在測試集上的準確率約為53%:

# TODO: Use a Solver instance to train a TwoLayerNet.
model = TwoLayerNet(reg=0.2)
solver = Solver(model, data,
                update_rule='sgd',
                optim_config={
                  'learning_rate': 1e-3,
                },
                lr_decay=0.95,
                num_epochs=20, batch_size=500,
                print_every=500)
solver.train()
7. 層數任意的全連線網路

依據傳入的hidden_dims引數,決定網路層數。
fc_net檔案中的FullyConnectedNet物件:

class FullyConnectedNet(object):
    def __init__(self, hidden_dims, input_dim=3*32*32, num_classes=10,
                 dropout=0, use_batchnorm=False, reg=0.0,
                 weight_scale=1e-2, dtype=np.float32, seed=None):

        self.use_batchnorm = use_batchnorm
        self.use_dropout = dropout > 0
        self.reg = reg
        self.num_layers = 1 + len(hidden_dims)
        self.dtype = dtype
        self.params = {}

        # TODO: Initialize the parameters of the network.
        param_dims = [input_dim] + hidden_dims + [num_classes]
        for indx in range(1, len(param_dims)):
            self.params["W"+str(indx)] = weight_scale * np.random.randn(param_dims[indx-1], param_dims[indx])
            self.params["b"+str(indx)] = np.zeros(param_dims[indx])
        if self.use_batchnorm:
            for indx in range(1, len(param_dims) - 1):
                self.params["gamma"+str(indx)] = np.ones(param_dims[indx])
                self.params["beta" +str(indx)] = np.zeros(param_dims[indx])
        
        self.dropout_param = {}
        if self.use_dropout:
            self.dropout_param = {'mode': 'train', 'p': dropout}
            if seed is not None:
                self.dropout_param['seed'] = seed

        self.bn_params = []
        if self.use_batchnorm:
            self.bn_params = [{'mode': 'train'} for i in range(self.num_layers - 1)]

        # Cast all parameters to the correct datatype
        for k, v in self.params.items():
            self.params[k] = v.astype(dtype)


    def loss(self, X, y=None):
        
        X = X.astype(self.dtype)
        mode = 'test' if y is None else 'train'

        # Set train/test mode for batchnorm params and dropout param since they
        # behave differently during training and testing.
        if self.use_dropout:
            self.dropout_param['mode'] = mode
        if self.use_batchnorm:
            for bn_param in self.bn_params:
                bn_param['mode'] = mode

        # TODO: Implement the forward pass for the fully-connected net
        layer_relu_out = X
        layer_cache_dict = {}
        if self.use_batchnorm:
            for i in range(1, self.num_layers):
                layer_relu_out, layer_relu_cache = affine_norm_relu_forward(layer_relu_out, self.params["W"+str(i)],\
                                                    self.params["b"+str(i)], self.params["gamma"+str(i)], 
                                                    self.params["beta"+str(i)], self.bn_params[i-1])
                if self.use_dropout:
                    layer_relu_out, dropout_cache = dropout_forward(layer_relu_out, self.dropout_param)
                    layer_cache_dict["dropout"+str(i)] = dropout_cache
                layer_cache_dict[i] = layer_relu_cache
        else:
            for i in range(1, self.num_layers):
                layer_relu_out, layer_relu_cache = affine_relu_forward(layer_relu_out, self.params["W"+str(i)], self.params["b"+str(i)])

                if self.use_dropout:
                    layer_relu_out, dropout_cache = dropout_forward(layer_relu_out, self.dropout_param)
                    layer_cache_dict["dropout"+str(i)] = dropout_cache
                layer_cache_dict[i] = layer_relu_cache
        
        final_layer_out, final_layer_cache = affine_forward(layer_relu_out, self.params["W" + str(self.num_layers)], self.params["b"+str(self.num_layers)])
        layer_cache_dict[self.num_layers] = final_layer_cache
        
        scores = final_layer_out
        
        if mode == 'test':
            return scores

        loss, grads = 0.0, {}
        # TODO: Implement the backward pass for the fully-connected net.
        loss, dloss = softmax_loss(final_layer_out, y)
        for i in range(self.num_layers):
            loss += 0.5 * self.reg * (np.sum(np.square(self.params["W"+str(i+1)])))

        dx, final_dW, final_db = affine_backward(dloss, layer_cache_dict[self.num_layers])
        grads["W"+str(self.num_layers)] = final_dW + self.reg * self.params["W"+str(self.num_layers)]
        grads["b"+str(self.num_layers)] = final_db
        if self.use_batchnorm:
            for i in range(self.num_layers-1, 0, -1):
                if self.use_dropout:
                    dx = dropout_backward(dx, layer_cache_dict["dropout"+str(i)])
                dx, dw, db, dgamma, dbeta = affine_norm_relu_backward(dx, layer_cache_dict[i])
                grads["W"+str(i)] = dw + self.reg * self.params["W"+str(i)]
                grads["b"+str(i)] = db
                grads["gamma"+str(i)] = dgamma
                grads["beta" +str(i)] = dbeta
        else:
            for i in range(self.num_layers-1, 0, -1):
                if self.use_dropout:
                    dx = dropout_backward(dx, layer_cache_dict["dropout"+str(i)])
                dx, dw, db = affine_relu_backward(dx, layer_cache_dict[i])
                grads["W"+str(i)] = dw + self.reg * self.params["W"+str(i)]
                grads["b"+str(i)] = db

        return loss, grads

8. 隨機梯度下降法的改良:SGD+MomentumRNSPropAdam
  • SGD+Momentum

v t + 1 = ρ v t f ( x t ) , x t + 1 = x t + α v t + 1 v_{t+1} = \rho v_t - \nabla f(x_t), \quad x_{t+1} = x_t + \alpha v_{t+1}
所以 t + 1 t+1 次時,引數的更新方向為:

v t + 1 = f ( x t ) ρ f ( x t 1 ) ρ t f ( x 0 ) v_{t+1} = - \nabla f(x_t) - \rho \nabla f(x_{t-1}) - \cdots - \rho^t\nabla f(x_0)

相關推薦

CS231n-2017 Assignment2 NNBPSGDBNCNN

一、全連線神經網路 在上一次作業中,已經實現了兩層神經網路的架構。但該實現有個問題,即程式不夠模組化,比如在loss()函式中,同時計算了損失函式和各引數的梯度。這種耦合,使得擴充套件網路深度時,需要做大量修改。另外,神經網路的層與層的結構也類似,這意味著樸素實現的方式中存在著程式碼重複

CS231n-2017 Assignment3 RNNLSTM風格遷移

一、RNN 所需完成的步驟記錄在RNN_Captioning.ipynb檔案中。 本例中所用的資料為Microsoft於2014年釋出的COCO資料集。該資料集中和影象標註想拐的圖片包含80000張訓練圖片和40000張驗證圖片。而這些圖片的特徵已通過VGG-16網路獲得,儲存在tr

CS231n-2017 Assignment1 k-近鄰方法SVMSoftmax兩層神經網路

一、k近鄰方法 1. 使用兩層迴圈計算距離矩陣 訓練資料X_train和測試資料X中每一行是一個樣本點。距離矩陣dists中每一行為X中的一點與X_train中各個點的距離。 k_nearest_neighbor檔案中的compute_distances_two_loops()

調試大叔V1.0.1(2017.09.01)|http/s接口調試數據分析程序員輔助開發神器

分享 開發 ges 下載地址 unicode 保存 nic 常用符號 src 2017.09.01 - 調試大叔 V1.0.1*支持http/https協議的get/post調試與反饋;*可保存請求協議的記錄;*內置一批動態參數,可應用於URL、頁頭、參數;*可自由管理co

2017.11.12 第三章 字符串向量和數組

bsp 使用 個數 初始 == 一行 位置 hello ostream 3.1 命名空間的using聲明 std::cin 表示從標準輸入中讀取內容。此處使用作用域操作符(::)表示:編譯器從操作符左側名字所示的作用域中尋找右側那個名字。 而使用using聲明是最安全的一種

2017-12-28 3周4次課 df du磁盤分區

df du 磁盤分區 4.1 df命令查看文件系統使用情況:[root@localhost ~]# df 文件系統 1K-塊 已用 可用 已用% 掛載點 /dev/sda3 18658304 940660 17717644 6% / devtmpfs

2017中國城市綜合發展指標出爐 北京上海深圳 冠亞季軍

質量 保持 重慶 天津 空氣 社會 排行 教授 post 2017年,北京、上海、深圳的城市綜合發展指標不僅蟬聯綜合排名冠亞季軍,還各自蟬聯了社會、經濟、環境3個大項的全國榜首。記者23日獲悉,由國家發改委發展規劃司與雲河都市研究院共同編制的《中國城市綜合發展指標2017》

深度學習 --- BP演算法詳解(流程圖BP主要功能BP演算法的侷限性)

上一節我們詳細推倒了BP演算法的來龍去脈,請把原理一定要搞懂,不懂的請好好理解BP演算法詳解,我們下面就直接把上一節推匯出的權值調整公式拿過來,然後給出程式流程圖,該流程圖是嚴格按照上一節的權值更新過程寫出的,因此稱為標準的BP演算法,標準的BP演算法中,每輸入一個樣本,都要回傳誤差並調整權值,

Oracle 補丁那些事兒(PSPSUCPUSPUBPDBBP…)

play 找問題 bugs 11.2.0.3 inux 授權 uri memory jdb 當前ORACLE數據庫提供兩種方式的補丁一種是主動的Proactive Patches和另一種被動的Reactive Patches,其中Reactive Patches是指過去的O

山東大學軟體學院2017-18學年大二資料結構實驗五

注:實驗程式碼均為自己編寫,均能滿足實驗要求,但實現方法不唯一僅供參考。 實驗五 二叉樹操作 1.實驗內容(題目內容,輸入要求,輸出要求) 輸入一個完全二叉樹的層次遍歷字串,建立這個二叉樹,輸出這個二叉樹的前序遍歷字串、中序遍歷字串、後序遍歷字串、結點數目、二叉樹高度(

tf.nn.conv2d函式padding型別SAME和VALIDtf.nn.max_pool函式tf.nn.dropout函式tf.nn.softmax函式tf.reduce_sum函式

tf.nn.conv2d函式: 該函式是TensorFlow裡面實現卷積的函式。 函式形式: tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None,

【Log】android手機除錯AP側(mainkernel)BP側和ANRhcidump的log抓取方法

AP的log抓取   主要有main log和kernel log兩種。 1、Main log   註釋:     Main log為應用程式的log,也是最常用的一種。提交功能性bug時,一般都要提供Main log。   方法1:     在手機後臺裡開一個程

2017 6-5 關於創業團隊的人心管理運營節奏的感悟

這短時間隨著經歷和觀察了一些事情,感覺公司在運營管理當中如何收攏人心,公司的CEO或者管理層如何使得公司的員工能夠法子內心的為公司發展努力,使得公司員工擁有主人公的心態,是非常關鍵和重要的。通過一些媒體渠道會看到國外的一些好的創業公司如Space X 、Goog

2017年 GitHub最受歡迎的機器學習影象處理等開源專案

      最近,Mybridge釋出了一篇文章,對比了過去一年中機器學習領域大約8800個開源專案後,選出30個2017年度優秀的開源專案,包含機器學習開源庫、資料庫以及其他應用程式,這些專案差不多都是在2017年1-12月釋出。MybridgeAI通過受歡迎度、參與度以及

機器學習之深入理解神經網路理論基礎BP演算法及其Python實現

  人工神經網路(Artificial Neural Networks,ANN)系統是 20 世紀 40 年代後出現的。它是由眾多的神經元可調的連線權值連線而成,具有大規模並行處理、分散式信 息儲存、良

七週第三次課 2017.11.29 Linux網路相關firewalld和netfilternetfilter5表5鏈介紹iptables語法

10.11 Linux網路相關 ifconfig檢視網絡卡ip(需要安裝net-tools包)ip add也可以檢視網絡卡ip 當你的網絡卡沒有ip的時候是不顯示的,但是加上-a就可以檢視到。 關閉網絡卡(如果你正在連線這個網絡卡使用該命令會斷開連線,所以不要用該命令關閉正

DeepLearning:四BP神經網路

目錄: 基本原理 BP演算法演算法 cost function 求引數 BP演算法推導 參考資料   前面簡單的認識了一下神經網路,這裡我要與大家分享的是神經網路中的大明星:BP

2017-02-11 構造可靠資料傳輸協議滑動視窗協議位元交替協議回退N步協議選擇重傳協議

2017-02-11構造可靠資料傳輸協議、滑動視窗協議、位元交替協議、回退N步協議、選擇重傳協議 1:冗餘資料分組(duplicate data packet)、2:倒計數定時器(countdown timer)、3:位元交替協議(alternating-bit pr

CS231n課程學習筆記(七)——資料預處理批量歸一化和Dropout

資料預處理 均值減法 它對資料中每個獨立特徵減去平均值,從幾何上可以理解為在每個維度上都將資料雲的中心都遷移到原點。 #numpy X -= np.mean(X, axis=0) 歸一化 是指將資料的所有維度都歸一化,使其數值範圍都

機器學習總結(七):基本神經網路BP演算法常用啟用函式對比

1.   神經網路 (1)為什麼要用神經網路? 對於非線性分類問題,如果用多元線性迴歸進行分類,需要構造許多高次項,導致特徵特多學習引數過多,從而複雜度太高。 (2)常用的啟用函式及其優缺點 階