1. 程式人生 > >『計算機視覺』mini深度學習框架實現

『計算機視覺』mini深度學習框架實現

margin 誤差 函數 ima for循環 cos 池化層 arc rate

一、項目簡介

手動實現mini深度學習框架,主要精力不放在運算優化上,僅體會原理。

地址見:miniDeepFrame

相關博客

『TensorFlow』卷積層、池化層詳解
『科學計算』全連接層、均方誤差、激活函數實現

文件介紹

Layer.py 層 class,已實現:全連接層,卷積層,平均池化層
Loss.py 損失函數 class,已實現:均方誤差損失函數
Activate.py 激活函數 class,已實現:sigmoid、tanh、relu
test.py 訓練測試代碼

主流框架對於卷積相關層的實現都是基於矩陣乘法運算,而非這裏的多層for循環,這裏僅僅是最直觀的演示原理,並非最優實現。

二、測試輸出

我們此時不對層函數進行封裝,僅僅實現了最簡單的前向傳播、反向傳播、參數獲取幾個功能,利用這些功能,我們已經可以實現一個最簡單的神經網絡,

聲明並初始化各層class的實例,這會使得各個實例初始化可學習參數

(【註】一般的框架會在運行時,即第一次前向傳播時才初始化參數,本demo由於是動態的,所以沒必要這樣寫)

進入循環體:

  獲取數據,向前傳播,計算損失函數&損失函數的梯度

  向後傳播,獲取各個參數的梯度

  對參數循環,利用參數梯度更新參數

在test.py中,我們使用tensorflow的接口,下載並讀取mnist數據集,然後訓練一個10分類的分類器,觀察收斂過程。

mnist = input_data.read_data_sets(‘../../Mnist_data/‘, one_hot=True)
X_train,y_train = mnist.train.next_batch(BARCH_SIZE)
X_train = np.reshape(X_train, [4, 1, 28, 28])

conv1 = Layer.Conv2D([8, 1, 2, 2])
pool1 = Layer.MeanPooling([2, 2])
relu1 = Activate.Relu()

conv2 = Layer.Conv2D([16, 8, 2, 2])
pool2 = Layer.MeanPooling([2, 2])
relu2 = Activate.Relu()

conv3 = Layer.Conv2D([8, 16, 2, 2])
pool3 = Layer.MeanPooling([2, 2])
relu3= Activate.Relu()

dense1 = Layer.Dense(128, 10)
sigmoid = Activate.Sigmoid()

loss = Loss.MSECostLayer()

loss_line = []
for i in range(1000):
    # 正向傳播
    x = conv1.forward(X_train, 1)
    x = pool1.forward(x, 2)
    x = relu1.forward(x)
    x = conv2.forward(x, 1)
    x = pool2.forward(x, 2)
    x = relu2.forward(x)
    x = conv3.forward(x, 1)
    x = pool3.forward(x, 2)
    x = relu3.forward(x)
    shape = x.shape
    x = x.reshape([x.shape[0], -1])
    x = dense1.forward(x)

    l_val = loss.loss(x, y_train)
    print("損失函數值為:", l_val)
    loss_line.append(l_val)

    # 反向傳播
    l = loss.loss_grad(x, y_train)
    l = dense1.backward(l)
    l = l.reshape(shape)
    l = relu3.backward(l)
    l = pool3.backward(l)
    l = conv3.backward(l)
    l = relu2.backward(l)
    l = pool2.backward(l)
    l = conv2.backward(l)
    l = relu1.backward(l)
    l = pool1.backward(l)
    l = conv1.backward(l)

    for layer in [conv1, conv2, conv3, dense1]:
        for param, param_grad in zip(layer.params(), layer.params_grad()):
            param -= LEARNING_RATE * param_grad

實際運行test.py,會輸出loss函數結果,並繪制成圖,左圖展示了整個loss函數收斂過程,

技術分享圖片

下圖則截掉了前四次叠代輸出的Loss,因為初始四次損失函數過大,收斂速度極快,影響後面的結果展示:

技術分享圖片

『計算機視覺』mini深度學習框架實現