[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 |