【caffe-Windows】新层添加——LSTM
前言
原始的【caffe-Windows】是沒有LSTM層的,維護以后的caffe的windows版本也懶得配置了,因為大部分文章的代碼還是基于老版caffe。其實大部分的添加層方法都可以參考本博客,僅限Windows。
需要的文件有:
1. 原始的caffe-Windows:這個第一個博客有寫網盤地址,戳這里或者
caffe-windows官方:https://github.com/BVLC/caffe/tree/windows
caffe-windows舊網盤:鏈接:http://pan.baidu.com/s/1bPZHoi 密碼:gzc0
2. 具有LSTM對應代碼文件的caffe版本,此處我們使用caffe的Linux版本
caffe-linux官方:https://github.com/BVLC/caffe
caffe-linux網盤:鏈接:http://pan.baidu.com/s/1eR8W9Lw 密碼:c7hv
【注】官網新版的caffe編譯方法變了,但是如果依舊按照VS的配置方法,可能和老版的并沒有什么區別,這里的原始caffe-Windows也可以直接去官網下載。
在進行第一步之前,請確保已按照博客配置好了caffe的無GPU版本。且本博客是添加新層,而非對caffe添加新工程。下面的參考博客介紹的是一個自定義的層的添加方法,主要還是在此基礎上研究如何添加LSTM的,道理基本一樣
參考博客:http://blog.csdn.net/u014565333/article/details/54017025
一定一定要注意proto中新添加的ID不要重復,否則會出現問題,切記切記
第一步
檢查一下檢查一下Linux中的caffe和Windows中的caffe有什么區別,主要核對一下兩類文件夾:
1. E:\caffe-linux\caffe-master\include\caffe\layers與E:\CaffeDev\caffe-master\include\caffe\layers的對比
2. E:\caffe-linux\caffe-master\src\caffe\layers與E:\CaffeDev\caffe-master\src\caffe\layers的對比
這里我主要發現了windows下的caffe缺少了以下文件:
在include文件中缺少:lstm_layer.hpp、parameter_layer.hpp、recurrent_layer.hpp、rnn_layer.hpp
在src文件中缺少:lstm_layer.cpp、lstm_unit_layer.cpp、parameter_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp
可以先把這些文件全部都拷貝到caffe-windows的對應位置,即1和2分別的layers文件夾內部
每一層的意義Google或者在caffe的官網的namespace目錄都有介紹。
第二步
2.1 添加parameter_layer層
此層作用:add parameter layer for learning any bottom
(1)先添加頭文件libcaffe->include->layers->添加->現有項
添加第一步拷貝到E:\CaffeDev\caffe-master\include\caffe\layers中的parameter_layer.hpp
(2)再添加提供實現的源文件libcaffe->src->layers->添加->現有項
添加第一步拷貝到E:\CaffeDev\caffe-master\src\caffe\layers中的parameter_layer.cpp
(3)嘗試編譯一下cpp
會出現類似這樣的錯誤
主要原因就在于我們常聽到的prototxt的用戶接口,它與第三方包protobuf有關,簡單的說這個工具就是一個序列化和反序列化工具,具體可以搜索這兩個詞。在caffe中,這個接口一般需要在E:\CaffeDev\caffe-master\src\caffe\proto\caffe.proto中聲明,名稱與每一個實現的cpp的末尾所注冊的名字相同
★★★★此處為自己實現cpp所需要注意的一個細節,一定要添加注冊★★★★
INSTANTIATE_CLASS(ParameterLayer); REGISTER_LAYER_CLASS(Parameter);知道了錯誤原因,那么就在caffe.proto中添加對應的描述。說一下題外話,因為我還沒嘗試自己寫層添加,所以調試的時候,參考的就是Linux下的caffe.proto的寫法,MATLAB中有一個對比工具叫做 “比較”,比如我在學習如何加層的時候就是這樣折騰的
閑話不多說,繼續添加caffe.proto對應的東西:
在382行下面添加一個ID,注意此ID與內部的其它ID不能重復
optional ParameterParameter parameter_param = 145; 【注】這里的行可以隨便選定,但是一定要注意在message LayerParameter 的內部,與后面的兩個message V1LayerParameter 、message V0LayerParameter 區分開來,聽說后兩個部分已經棄用了。以后凡是見到下面這句話 this->layer_param_.parameter_param(). ★★ ★★ 它后面所指向的參數也需要在caffe.proto中指定出來,此為caffe自定義層的第二個注意事項 ★★ ★★
指定的方法是將下面這句話添加到caffe.proto的第873行以后
message ParameterParameter {optional BlobShape shape = 1; }(4)接下來的是一個是容易忽視的細節:當ID和參數都添加到caffe.proto以后,需要對libcaffe重新生成一次,而非直接對著cpp右鍵編譯。可能這一步與E:\CaffeDev\caffe-master\windows\scripts下的ProtoCompile.cmd有關
如果彈出一個窗口XXX已在外部改動什么的,點擊全是就好。
最后重新右鍵編譯一次parameter_layer.cpp,就會無錯誤直接通過。
2.2添加LSTM層
(1)添加頭文件lstm_layer.hpp、recurrent_layer.hpp、rnn_layer.hpp到libcaffe->include->layers->添加->現有項
(2)添加源文件lstm_layer.cpp、lstm_unit_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp到libcaffe->src->layers->添加->現有項
觀察注冊部分
lstm_layer層的注冊
此兩圖顯示了caffe的每一層即caffe::layer的組成情況,可以發現LSTMUnitLayer是單獨成一層的。
(3)編譯嘗試一下。
發現lstm_unit_layer.cpp無需添加到caffe.proto中便可直接編譯成功,但是其使用方法還有待斟酌,因為沒有添加到caffe.proto中,那么使用是如何序列化的呢?以后學習。
先解決當下問題,其它的層都無法直接編譯成功,那么就得添加到caffe.proto中了。
在caffe.proto的387行添加對應recurrent層的ID(因為它是由LSTM和RNN層組成的,因而給一個ID即可,在參數中進行區分)
optional RecurrentParameter recurrent_param = 146; (4)添加對應參數描述 // Message that stores parameters used by RecurrentLayer message RecurrentParameter {// The dimension of the output (and usually hidden state) representation --// must be explicitly set to non-zero.optional uint32 num_output = 1 [default = 0];optional FillerParameter weight_filler = 2; // The filler for the weightoptional FillerParameter bias_filler = 3; // The filler for the bias// Whether to enable displaying debug_info in the unrolled recurrent net.optional bool debug_info = 4 [default = false];// Whether to add as additional inputs (bottoms) the initial hidden state// blobs, and add as additional outputs (tops) the final timestep hidden state// blobs. The number of additional bottom/top blobs required depends on the// recurrent architecture -- e.g., 1 for RNNs, 2 for LSTMs.optional bool expose_hidden = 5 [default = false]; }最后一行注釋解釋了RNN和LSTM的代號。具體使用方法后續學習到了再寫入博客。(5)添加完畢ID和參數描述,不要忽略了對libcaffe重新生成一次,然后嘗試對lstm_layer.cpp、recurrent_layer.cpp、rnn_layer.cpp重新編譯試試。
第三步
關于如何搭建一個LSTM網絡,本文就不介紹了,在下面這個博客中有三個實例,有興趣可以配置一下試試
(Caffe)LSTM層分析:http://blog.csdn.net/mounty_fsc/article/details/53114698
當然在后面的博客還是需要繼續探索LSTM的使用的,下一篇博客將介紹如何配置caffe-recurrent訓練coco數據集。
【注】一定要細心做每一步,因為每一步都可能導致各種錯誤,不然這個十分鐘不到就能配置好的東東怎么會折騰我一天呢。如果需要自己手寫層,添加方法與本文一樣,但是一定要注意先分析自帶的代碼,比如parameter_layer.h和其實現就很簡單,關鍵在于寫法結構。
最后:細節決定成敗,耐心成就未來
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【caffe-Windows】新层添加——LSTM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HER COFFEE夜场代金券【1折】_
- 下一篇: java信息管理系统总结_java实现科