日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【caffe-Windows】新层添加——LSTM

發布時間:2023/12/13 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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層的注冊

INSTANTIATE_CLASS(LSTMLayer); REGISTER_LAYER_CLASS(LSTM);lstm_unit_layer層的注冊

INSTANTIATE_CLASS(LSTMUnitLayer); REGISTER_LAYER_CLASS(LSTMUnit);rnn_layer層的注冊

INSTANTIATE_CLASS(RNNLayer); REGISTER_LAYER_CLASS(RNN);注意一下這幾層的結構區別

此兩圖顯示了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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。