前言
很多小夥伴還在爲弄不懂深度學習整個流程而煩惱,比如圖像數據如何讀入?數據在網絡之間如何傳遞?如何前向計算?如何反向計算?如何更新權重?如何預測輸出?博主利用每天晚上的時間,歷經兩個星期,爲大家帶來這款爲理解深度學習而生的學習框架,命名爲LazyNet,爲什麼呢?因爲此框架真的很簡單,動動手指頭就能明白整個深度學習流程了!
LazyNet優勢
- 不依賴GPU,任何CPU均可
- 除OpenBLAS、OpenCV外,不依賴任何第三方
- 純C++代碼
- 代碼簡介明瞭,數據流簡單易懂
- 相關原理在代碼裏面做了詳細說明
LazyNet傳送門
- 傳送門(若對您有幫助,歡迎star和fork)
LazyNet簡介
一、支持系統
- Windows7/10(強烈推薦,因爲可以直觀調試)
- Linux(可自己寫簡易makefile)
- Mac(暫未嘗試)
二、環境搭建
- CPU
- VS2015(Windows強烈推薦)
三、示例數據
- mnist400(train200-0,train200-1,test20-0,test20-1)
四、示例網絡
Layers | channel | Kernel_size | stride | pad | Input_size | Output_size |
Conv1 | 16 | 3 | 1 | 0 | 28x28 | 26x26 |
Relu1 | 16 | - | - | - | 26x26 | 26x26 |
Maxpool1 | 16 | 2 | 2 | 0 | 26x26 | 13x13 |
Conv2 | 32 | 3 | 1 | 0 | 13x13 | 11x11 |
Relu2 | 32 | - | - | - | 11x11 | 11x11 |
Maxpool2 | 32 | 2 | 2 | 0 | 11x11 | 6x6 |
Conv3 | 64 | 3 | 1 | 0 | 6x6 | 4x4 |
Relu3 | 64 | - | - | - | 4x4 | 4x4 |
Ip1 | 128 | - | - | - | 4x4 | 1x1 |
Relu4 | 128 | - | - | - | 1x1 | 1x1 |
Ip2 | 2 | - | - | - | 1x1 | 1x1 |
softmax | - | - | - | - | 1x1 | 1x1 |
五、示例代碼
#include "lazy_net.h"
int main()
{
//data information
string data_path = "data/";
int data_batch = 20;
int data_channel = 3;
int data_size = 28;
//hyperparameter
int max_iter = 1000;
int disp_iter = 10;
float weight_decay = 0.0005;
float base_lr = 0.01;
float momentum = 0.9;
string lr_policy = "inv";
float power = 0.75;
float gamma = 0.0001;
int test_iter = 50;
LazyNet lazy_net(data_path, data_batch, data_channel,
data_size, max_iter, disp_iter,
weight_decay, base_lr, momentum,
lr_policy, power, gamma, test_iter);
lazy_net.TrainNet();
return 0;
}
六、示例結果
尾註
雖然這款學習框架很好理解,有利於梳理整個深度學習流程,但是也有幾點不足之處,後面有時間會做相應調整
- 網絡重塑性不好,網絡已嵌入代碼,後面考慮用文本的形式寫入
- 訓練數據靈活性不好,數據形式已嵌入代碼,後面考慮利用random複寫
- 主要layers基於caffe修改而成,後面考慮去除OpenBLAS
任何問題請加唯一QQ2258205918(名稱samylee)!