『計算機視覺』mini深度學習框架實現
阿新 • • 發佈:2018-11-15
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深度學習框架實現