[matDL框架開發直播:1]matDL概述和基本使用
=====================================
往期:用微信控制深度學習訓練:中國特色的keras插件 - 知乎專欄
[matDL框架開發直播:0]深度學習水平考試:手寫一個輕量級框架! - 知乎專欄
=====================================
GitHub地址:QuantumLiu/matDL
什麼是matDL
matDL是一個輕量級的MATLAB平台的深度學習框架,目標是開發一個高效的、原生的、代碼可讀、High-level的深度學習框架(API)。
matDL的設計原則是
用戶友好:matDL是面向使用MATLAB的群體開發的API,用戶中很多不是專業的計算機從業者還有很多是在校理工科學生。如何使用戶能更輕鬆的使用matDL完成自己的模型是我們首先考慮的。matDL提供簡潔的模型定義方法, 能夠極大減少一般應用下用戶的工作量。同時,matDL的開發過程是同步直播的,用戶可以見證一個框架從無到有、從小到大的過程,而不是像其他框架一樣在發布之時就擁有龐大、晦澀的代碼庫,用戶只能按照文檔被動地學習。
模塊化設計:模型可理解為由一個層的序列定義的對數據進行操作的「流圖」。模型、網路層、損失函數、優化器、激活函數都是獨立的模塊,你可以使用它們來構建自己的模型。
代碼可讀性:現有開源框架雖然是開源的,但是核心代碼多由c++/cuda寫成,數量龐大、較為晦澀,很難通過從外向內地閱讀源碼掌握框架的每一個細節。matDL基於MATLAB平台,代碼可讀性高。即使未來將調用cudnn庫實現部分演算法,仍會保留手寫版本的演算法實現供用戶選擇與借鑒。
原生中文:開源框架無中文文檔可讀,只能「啃」英文文檔是國內深度學習入門者遇到的一大困難。良好的中文文檔將減少入門深度學習的學習成本。(挖個坑,要寫雙語文檔的節奏)
高效性:手寫的演算法每處都經過了反覆推敲、優化,充分利用了MATLAB向量化的語言特色,接近性能最優。未來將直接調用cudnn完成常見層的計算,速度有望媲美主流框架。
截止到4月10日,版本為0.42,框架結構已經基本完整,接下來的工作是優化速度和豐富各個模塊的功能。目前支持的Layer有,全連接層(dense)、RNN層(LSTM)、Dropout、激活層(activation)
matDL結構
matDL目前分為Model、Layer、Function三個模塊。
Model模塊實現模型層次的操作。包括模型的定義(init)、訓練(train)、預測(predict)、評估(evaluate)以及保存和重載(save&load)。目前,Optimizer(優化器)包含在Model模塊里,未來可能會獨立為一個模塊。
Layer模塊實現層(layer)層次的操作。包括層的定義(init)、前向傳播(Feedforward,ff)、反向傳播(Backward/Backpropagation,bp)。
Function模塊定義了激活函數(activation)和損失函數(loss function)以及他們的導數。需要特別注意的是,為了提高效率,matDL利用了tanh、sigmoid等常見激活函數的導數往往是fx=g(f(x))的形式這個特點,將導數的輸入參數定為f(x)而非理論上的x。
matDL中的張量(Tensor)
張量(Tensor),是深度學習中經常出現的一個辭彙,在此稍作解釋。
張量可以看作是向量、矩陣的自然推廣,我們用張量來表示廣泛的數據類型。
一個2D張量數據,我們可以想像為一個長方形或一張畫;一個3D張量數據可以想像為一個立方體或者一本畫冊,比2D張量多出來的一個維度可以用來描述高度或者頁數。4D及以上的張量人腦是無法做出形象的想像的,可以不嚴謹的想像為「葡萄串」(4D就是一串3D,5D就是一串4D,不過葡萄串不是連續的)。
主流框架一般按照(batchsize,(timestep),(image shape),in/output dim)來排列不同維度。根據MATLAB的矩陣排列及存儲特點,我們把in/output dim放在第一維,batchsize放在最後一維。即:[input_dim,timestep,batchsize]
快速開始
安裝
確保你的MATLAB和設備支持GPU(並行工具箱,Pascal顯卡最好使用MATLAB2017a及以上版本)
從GitHub clone此項目
git clone https://github.com/QuantumLiu/matDL.gitn
將項目文件夾及其子文件夾添加到MATLAB路徑
保存路徑
OK!安裝完畢!搭建第一個模型
我們用短短行代碼實現一個全連接模型,開啟matDL使用之旅。
input_dim=512;nbatch_size=256;ninput_shape=[input_dim,batch_size];%定義輸入數據的tensor形狀n
我們定義了這樣一個輸入張量:在每一個batch,它有256個樣本,每個樣本是一個長度512的向量。
optimizer.learningrate=0.01;noptimizer.momentum=0.5;noptimizer.opt=sgd;n
接下來,我們用一個結構體(struct)定義一個優化器。這個優化器採用動量sgd演算法,學習率0.01,動量因子0.5
hiddensize=[512,512,512,512];nl=1;nfor i=1:length(hiddensize)nconfigs{l}.type=dense;configs{l}.hiddensize=hiddensize(i);nl=l+1;nconfigs{l}.type=activation;configs{l}.act_fun=Relu;nl=l+1;nconfigs{l}.type=dropout;configs{l}.drop_rate=0.5;nendnconfigs{l+1}.type=activation;configs{l+1}.act_fun=softmax;configs{l+1}.loss=categorical_cross_entropy;n
我們先定義了一個指定每層隱含節點數的hiddensize向量,接著,我們用循環的方式來為每一層配置configs 。configs是一個長度和模型層數相同的cell類型數據,每一個元素是一個結構體,擁有若干參數,一一對應每層的配置。在以上代碼中,我們定義了四個全連接層(dense),每個全連接層擁有512個隱含層節點。在每個全連接層後面連接一個Relu激活層和一個drop rate 為0.5的dropout層。
最後,我們定義了模型的最後一次也是輸出層(output layer),特別的,我們要為輸出層指定一個loss。這裡我們選的是和softmax多分類對應的多分類交叉熵。
model=model_init(input_shape,configs,1,optimizer);n
好了,我們用model_init()定義了我們的第一個模型。model_init()接受至多4個參數:input_shape即輸入tensor的形狀,configs定義了每一層的配置參數。第三個參數是一個flag,如果是0就是預測模式,如果是1就是訓練模式。第四個參數是優化器optimizer,只在flag=1時有效。模型定義完成後會在命令窗口列印每一層的信息
至此,所有的對於模型的定義已經完成,相當於生成流水線(類似計算圖)建設完成,等待原料(數據)輸入進行生產。
nb_batch=100;nx=rand(input_dim,batch_size*nb_batch);ny=(zeros(hiddensize(end),batch_size*nb_batch));ny(1,:,:)=1;n
x即輸入數據,第一維度要和我們定義的input_shape第一維保持一致,同理y要與輸出層維度保持一致。共100*256=25600個樣本。
nb_epoch=10;nmodel=model.train(model,x,y,nb_epoch,3,0);%not saven
我們在所有數據上迭代10輪。我們使用model.train()來訓練模型,函數接受最多6個參數。第5個參數為verbose,定義信息反饋,為0的話將沒有任何反饋,1為只有進度條,2為每個epoch更新loss圖像,3為每個batches更新loss圖像。第6個參數為保存模型文件的文件名filename,如果為0則不保存模型。
開始訓練後,會創建一個事實更新的進度條和兩個分別代表batch和epoch級別loss的圖表。
如圖,我們還可以讓圖錶停靠在窗口內
最後,我們評估一下模型並進行預測loss=model.evaluate(model,x,y);ndisp(loss);ny_pred=model.predict(model,x);n
Thats all!你已經成功的用matDL搭建了第一個模型,並進行了訓練、評估和預測!
========================
開發計劃:
4.10~4.17:完善框架,evaluate方法加入metrics(指標),添加新的優化器(目前只有動量sgd);改用cudnn的RNN替代現有函數,現有函數作為備用和演算法常式保留
4.17~4.24:用cudnn的CNN、pooling實現CNN類型的層
4.24~5.1:實現merge、多輸出/輸入模型構建,將layer、model統一為「節點」
直播計劃:
4.10~4.17:
[matDL框架開發直播:1]matDL概述和使用
[matDL框架開發直播:2]全連接層:dense的實現和優化
[matDL框架開發直播:3]LSTM層的實現和優化
4.17~
[matDL框架開發直播:4]Activation激活函數和激活層
[matDL框架開發直播:5]Loss損失函數及求導
[matDL框架開發直播:6]Optimizer優化器
[matDL框架開發直播:7]Layer層
[matDL框架開發直播:8]Model模型
推薦閱讀:
※【Matlab基礎】04. 自定義函數
※理工科女生筆記本選購諮詢?
※[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(1)
※MATLAB圖像處理:把照片變成動漫風格
TAG:深度学习DeepLearning | 编程 | MATLAB |