導航:首頁 > 編程大全 > caffe訓練網路初始化

caffe訓練網路初始化

發布時間:2023-02-01 08:54:37

1. 如何調用caffe已經訓練好的net

文件夾裡面,然後寫一個main函數調用這個類就可以了,比如:復制,保存到caffe/examples/myproject/net_operator.hpp,然後同目錄下寫一個main.cpp,在main函數裡面#include "net_operator.hpp",就可以使用這個類了:const string net_prototxt = "..."; // 你的網路的prototxt文件,用絕對路徑,下面同理const string pre_trained_file = "..."; // 你訓練好的.caffemodel文件const string img_path = "..."; // 你要測試的圖片路徑// 創建NetOperator對象NetOperator net_operator(net_prototxt, pre_trained_file);Blob<float> *blob = net_operator.processImage(img_path);// blob就得到了最後一層的輸出結果,至於blob裡面是怎麼存放數據的,你需要去看看官網對它的定義寫完main.cpp之後,到caffe目錄下,make,然後它會編譯你寫的文件,對應生成的可執行文件。比如按我上面寫的那樣,make之後就會在caffe/build/examples/myproject文件夾裡面生成一個main.bin,執行這個文件就可以了。因為生成的可執行文件並不是直接在代碼目錄下,所以前面我建議你寫的路徑用絕對路徑另外如果你要獲取的不是最後一層的輸出,你需要修改一下processImage函數的返回值,通過NetOperator的成員變數net_來獲取你需要的blob,比如有個blob名稱為"label",你想獲取這個blob,可以通過net_->blob_by_name("label")來獲取,當然獲取到的是shared_ptr<Blob<float> >類型的,搜一下boost shared_ptr就知道跟普通指針有什麼不同了好了,接下來是貼代碼了:#include <caffe/caffe.hpp>#include <opencv2/core/core.hpp>#include <opencv2/highgui www.hbbz08.com /highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <iosfwd>#include <memory>#include <string>#include <utility>#include <vector>using namespace caffe; // NOLINT(build/namespaces)using std::string;class NetOperator{public: NetOperator(const string& net_prototxt); NetOperator(const string& net_prototxt, const string& trained_file); ~NetOperator() { } int batch_size() { return batch_size_; } Blob<float>* processImage(const string &img_path, bool is_color = true); Blob<float>* processImages(const vector<string> &img_paths, bool is_color = true);private: void createNet(const string& net_prototxt); // read the image and store it in the idx position of images in the blob void readImageToBlob(const string &img_path, int idx = 0, bool is_color = true); shared_ptr<Net<float> > net_; cv::Size input_geometry_; int batch_size_; int num_channels_; Blob<float>* input_blob_; TransformationParameter transform_param_; shared_ptr<DataTransformer<float> > data_transformer_; Blob<float> transformed_data_;};NetOperator::NetOperator(const string& net_prototxt) { createNet(net_prototxt);}NetOperator::NetOperator(const string& net_prototxt, const string& trained_file) { createNet(net_prototxt); net_->CopyTrainedLayersFrom(trained_file);}void NetOperator::createNet(const string& net_prototxt) {#ifdef CPU_ONLY Caffe::set_mode(Caffe::CPU);#else Caffe::set_mode(Caff www.hnne.com e::GPU);#endif net_.reset(new Net<float>(net_prototxt, TEST)); CHECK_EQ(net_->num_inputs(), 1) << "Network should have exactly one input."; CHECK_EQ(net_->num_outputs(), 1) << "Network should have exactly one output."; Blob<float>* input_layer = net_->input_blobs()[0]; batch_size_ = input_layer->num(); num_channels_ = input_layer->channels(); CHECK(num_channels_ == 3 || num_channels_ == 1) << "Input layer should have 1 or 3 channels."; input_geometry_ = cv::Size(input_layer->width(), input_layer->height()); // reshape the output shape of the DataTransformer vector<int> top_shape(4); top_shape[0] = 1; top_shape[1] = num_channels_; top_shape[2] = input_geometry_.height; top_shape[3] = input_geometry_.width; this->transformed_data_.Reshape(top_shape);}Blob<float>* NetOperator::processImage(const string &img_path, bool is_color) { // reshape the net for the input input_blob_ = net_->input_blobs()[0]; input_blob_->Reshape(1, num_channels_, input_geometry_.height, input_geometry_.width); net_->Reshape(); readImageToBlob(img_path, 0, is_color); net_->ForwardPrefilled(); return net_->output_blobs()[0];}Blob<float>* NetOperator::processImages(const vector<string> &img_paths, bool is_color) { int img_num = img_paths.size(); // reshape the net for the input input_blob_ = net_->input_blobs()[0]; input_blob_->Reshape(img_num, num_channels_, input_geometry_.height, input_geometry_.width); net_->Reshape(); for (int i=0; i<img_num; i++) { readImageToBlob(img_paths[i], i, is_color); } net_->ForwardPrefilled(); return net_->output_blobs()[0];}void NetOperator::readImageToBlob(const string &img_path, int idx, bool is_color) { // read the image and resize to the target size cv::Mat img; int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); cv::Mat cv_img_origin = cv::imread(img_path, cv_read_flag); if (!cv_img_origin.data) { LOG(ERROR) << "Could not open or find file " << img_path; return ; } if (input_geometry_.height > 0 && input_geometry_.width > 0) { cv::resize(cv_img_origin, img, input_geometry_); } else { img = cv_img_origin; } // transform the image to a blob using DataTransformer // create a DataTransformer using default TransformationParameter (no transformation) data_transformer_.reset( new DataTransformer<float>(transform_param_, TEST)); data_transformer_->InitRand(); // set the output of DataTransformer to the idx image of the input blob int offset = input_blob_->offset(idx); this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data() + offset); // transform the input image data_transformer_->Transform(img, &(this->transformed_data_));

2. caffe中怎麼固定前面的網路參數,訓練後面層的參數

1、會更新,finetune的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候:
a. 直接訓練是按照網路定義指定的方式初始化(如高斯隨機初始化)
b. finetune是用你已經有的參數文件來初始化(就是之前訓練好的caffemodel)
2、嗯,這個問題有兩種情況:比如有4個全連接層A->B->C->D
a. 你希望C層的參數不會改變,C前面的AB層的參數也不會改變,這種情況也就是D層的梯度不往前反向傳播到D層的輸入blob(也就是C層的輸出blob 沒有得到梯度),你可以通過設置D層的propagate_down為false來做到。
propagate_down的數量與輸入blob的數量相同,假如你某個層有2個輸入blob,那麼你應該在該layer的Param裡面寫上兩行:
propagate_down : 0 # 第1個輸入blob不會得到反向傳播的梯度
propagate_down : 0 # 第2個輸入blob不會得到反向傳播的梯度
這樣的話,你這個layer的梯度就不會反向傳播啦,前面的所有layer的參數也就不會改變了
b. 你希望C層的參數不會改變,但是C前面的AB層的參數會改變,這種情況,只是固定了C層的參數,C層得到的梯度依然會反向傳播給前面的B層。只需要將對應的參數blob的學習率調整為0:
你在layer裡面加上param { lr_mult: 0 }就可以了,比如全連接層裡面:
layer {
type: "InnerProct"
param { # 對應第1個參數blob的配置,也就是全連接層的參數矩陣的配置
lr_mult: 0 # 學習率為0,其他參數可以看caffe.proto裡面的ParamSpec這個類型
}
param { # 對應第2個參數blob的配置,也就是全連接層的偏置項的配置
lr_mult: 0 # 學習率為0
}
}
不知道這樣說你能不能理解

3. Caffe中權值是怎麼更新的

1、會更新,finetune的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候內: a. 直接訓練容是按照網路定義指定的方式初始化(如高斯隨機初始化) b. finetune是用你已經有的參數文件來初始化(就是之前訓練好的caffemodel)

4. 如何利用Caffe訓練ImageNet分類網路

1.下載好來自ImageNet的training和validation數據集合;分別存放在如下的格式:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG

/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
2. 進行一些預處理操作:
cd $CAFFE_ROOT/data/ilsvrc12/

./get_ilsvrc_aux.sh

3.訓練數據和測試數據分別放在train.txt和val.txt中,裡面有他們的文件和相對應的標簽;
4. 最後作者把1000類的類名用0--999表示,他們相對應的類別名稱則用synset_words.txt 來存儲他們之間的映射。

5.作者提到怎麼去是否應該先把圖像都歸一化到256*256中,作者提到用Maprece去加快這種過程;

也可以直接這么做:
for name in /path/to/imagenet/val/*.JPEG; do

convert -resize 256x256\! $name $name

Done

6.在 create_imagenet.sh中設置訓練的參數,並在裡面指定訓練和測試的資料庫路徑,如果圖像沒有提前歸一化到相同的大小,則需要加」RESIZE=true「,設置」GLOG_logtostderr=1 「表示了可以參考更多的信息,
在執行 ./create_imagenet.sh 之後會有新的數據文件生成:
ilsvrc12_train_leveldb 和 ilsvrc12_val_leveldb
7. 因為模型需要我們減去圖像的均值,所以我們需要計算圖像均值,在工具
tools/compute_image_mean.cpp 實現了這種操作,

或者可以直接用:
./make_imagenet_mean.sh 腳本來進行計算圖像均值,並生成:
data/ilsvrc12/imagenet_mean.binaryproto 文件

8.定義網路的結構:imagenet_train_val.prototxt .
裡面有兩行指定了資料庫和圖像的路徑
source: "ilvsrc12_train_leveldb"

mean_file:"../../data/ilsvrc12/imagenet_mean.binaryproto"
並且指定了 include { phase: TRAIN } or include { phase: TEST } .來區分訓練和測試

9.關於輸入層的不同:
訓練數據中,,data項來自 ilsvrc12_train_leveldb 並且進行了隨機鏡像操作,測試數據中data項來自於ilsvrc12_val_leveldb 而沒有進行隨機鏡像操作;

10.輸出層的不同:
輸出層都為 softmax_loss 層,在訓練網路當中,用來計算損失函數,並且用來初始化BP過程,測試網路同樣有一個第二個輸出層,accuracy,它用來報告測試的精度,在訓練的過程中,測試網路將實例化並且測試准確率,產成的命令行為:Test score #0: xxx and Test score #1: xxx 等。

11.運行網路,其中設置
每批batch為256個,運行450000次迭代,接近90次epoch;
每1000次迭代,就在用測試集進行測試;
設置初始的學習率為0.01,並且每100000次迭代中進行學習率下降,大概進行20次epoch;
每20次epoch就顯示出一些數據信息;
網路訓練的動量為0.9,權重衰減因子為0.0005,
每10000次迭代中,就生成當前狀態的快照;
這些設置在 examples/imagenet/imagenet_solver.prototxt .中進行設置,並且同樣我們需要指定文件的路徑:
net: "imagenet_train_val.prototxt"

12.開始訓練網路:
./train_imagenet.sh
13. 在K20中,每20個迭代花費36s,所以,一幅圖像的一次前饋+反饋(FW+BW)大概需要7ms,前饋花費2.5ms,剩下的是反饋,
可以在 examples/net_speed_benchmark.cpp 中進行時間的查看;

14.因為我們有保存了快照,所以我們可以通過
./resume_training.sh 來進行resume恢復,腳本caffe_imagenet_train_1000.solverstate 保留了要恢復的所有信息,
15.總結,Caffe可以很方便進行通過設置文件的方式來進行設置不同的網路結構。

5. Caffe訓練自己的imagenet,ubuntu提示killed

1、准備數據。
假設已經下載好數據集和驗證集,存儲路徑為:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
首選需要創建一個txt文件,列舉出所有圖像以及對應的lable,caffe包「Python/caffe/imagenet/ilsvrc_2012_train.txt」和「ilsvrc_2012_val.txt」兩個文件分別是標好的訓練集和驗證集的文件,共分為1000類。
還需要注意的是,所有的圖像都需要歸一到同樣的尺寸。

2、轉化生成訓練集。
運行下面的命令:
GLOG_logtostderr=1 examples/convert_imageset.bin /path/to/imagenet/train/ python/caffe/imagenet/ilsvrc_2012_train.txt /path/to/imagenet-train-leveldb
生成文件存儲在「/path/to/imagenet-train_leveldb」路徑下。

3、計算圖像均值。
執行命令:
examples/demo_compute_image_mean.bin /path/to/imagenet-train-leveldb /path/to/mean.binaryproto
第一個參數是執行腳本代碼,第二個參數是上一步生成的數據集,第三個參數是存儲圖像均值的目錄路徑。

4、定義網路。
ImageNet的網路定義在「examples/imagenet.prototxt」文件中,使用時需要修改裡面source和meanfile變數的值,指向自己文件的路徑。
仔細觀察imagenet.prototxt和imagenet_val.prototxt文件可以發現,訓練和驗證的參數大部分都相同,不同之處在於初始層和最後一層。訓練時,使用softmax_loss層來計算損失函數和初始化後向傳播,驗證時,使用accuracy層來預測精確度。
在文件「examples/imagenet_solver.prototxt」中定義solver協議,同樣需要修改train_net和test_net的路徑。

5、訓練網路。
執行命令:
GLOG_logtostderr=1 examples/train_net.bin examples/imagenet_solver.prototxt

6、在python中使用已經訓練好的模型。
Caffe只提供封裝好的imagenet模型,給定一副圖像,直接計算出圖像的特徵和進行預測。首先需要下載模型文件。
Python代碼如下:

[python] view plain print?
from caffe import imagenet
from matplotlib import pyplot
# Set the right path to your model file, pretrained model
# and the image you would like to classify.
MODEL_FILE = 'examples/imagenet_deploy.prototxt'
PRETRAINED = '/home/jiayq/Downloads/caffe_reference_imagenet_model』
IMAGE_FILE = '/home/jiayq/lena.png'

net = imagenet.ImageNetClassifier(MODEL_FILE, PRETRAINED)
#預測
prediction = net.predict(IMAGE_FILE)
#繪制預測圖像
print 'prediction shape:', prediction.shape
pyplot.plot(prediction)
prediction shape: (1000,)
[<matplotlib.lines.Line2D at 0x8faf4d0>] #結果如圖所示

圖上的橫軸表示的label,縱軸表示在該類別上的概率,有圖我們看到,lena.jpg被分到了」sombrero」這組,結果還算準確。

6. caffe ssd 里的resize是怎麼實現的

環境為caffe下以imagenet為樣本集訓練resnset網路。
在初始化生成lmdb的create_imagenet.sh腳本中,resize參數分別設置為256*256和512*512。

閱讀全文

與caffe訓練網路初始化相關的資料

熱點內容
密碼查看器哪個好 瀏覽:482
文件發到中轉站在哪裡找 瀏覽:608
net連接字元串在哪個文件中 瀏覽:296
文件夾怎麼發QQ 瀏覽:521
文件夾鎖頭 瀏覽:145
迪士尼在哪個網站買票 瀏覽:329
gho文件如何轉成iso文件下載 瀏覽:650
安卓隱藏運行程序圖標 瀏覽:849
數控車床編程和磨刀哪個難學 瀏覽:158
win10綁定賬號正版 瀏覽:861
計算機網路實驗系統 瀏覽:656
符號表文件格式pdb 瀏覽:623
聯想win10怎麼做bat文件 瀏覽:611
手機編程軟體哪個好處 瀏覽:49
信號與系統視頻教程哪個好 瀏覽:366
51aspx下載的源碼要打開那些文件 瀏覽:221
自家的網路被改了怎麼辦 瀏覽:151
手機版ygopro聯機工具 瀏覽:259
為什麼斐訊網站登不上 瀏覽:420
查閱系統中的部門文件 瀏覽:213

友情鏈接