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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > Caffe >内容正文

Caffe

Caffe官方教程翻译(3):Siamese Network Training with Caffe

發(fā)布時(shí)間:2025/3/21 Caffe 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Caffe官方教程翻译(3):Siamese Network Training with Caffe 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近打算重新跟著官方教程學(xué)習(xí)一下caffe,順便也自己翻譯了一下官方的文檔。自己也做了一些標(biāo)注,都用斜體標(biāo)記出來(lái)了。中間可能額外還加了自己遇到的問(wèn)題或是運(yùn)行結(jié)果之類的。歡迎交流指正,拒絕噴子!
官方教程的原文鏈接:http://caffe.berkeleyvision.org/gathered/examples/siamese.html

Siamese Network Training with Caffe

這個(gè)示例將會(huì)展示給你如何使用權(quán)重分享和對(duì)比損失函數(shù),來(lái)學(xué)習(xí)在Caffe中使用一個(gè)siamese網(wǎng)絡(luò)。

我們默認(rèn)你已經(jīng)成功編譯了caffe的源碼。如果沒有,請(qǐng)查Installation page。這個(gè)例子是在MNIST tutorial的基礎(chǔ)之上做的,所以在閱讀這篇教程之前最好先看下那篇教程。

我們指定所有的路徑并假設(shè)所有的命令都是在caffe的根目錄下的。

準(zhǔn)備數(shù)據(jù)集

首先你需要從MNIST網(wǎng)站下載并轉(zhuǎn)換數(shù)據(jù)集格式。為了做到這個(gè),運(yùn)行下面的命令:

./data/mnist/get_mnist.sh ./examples/siamese/create_mnist_siamese.sh

在運(yùn)行這些腳本后你會(huì)看到多出來(lái)了兩個(gè)數(shù)據(jù)集:./examples/siamese/mnist_siamese_train_leveldb./examples/siamese/mnist_siamese_test_leveldb

模型

首先,我們要定義后面在訓(xùn)練想要使用的siamese網(wǎng)絡(luò)的模型。我們會(huì)使用定義在./examples/siamese/mnist_siamese.prototxt中的卷積神經(jīng)網(wǎng)絡(luò)。這個(gè)模型基本上與LeNet model中的模型是一樣的,唯一的區(qū)別就是我們將頂層對(duì)應(yīng)10個(gè)手寫數(shù)字類別概率的輸出更換成了線性“特征”層,只有2個(gè)輸出了(補(bǔ)充:siamese與LeNet的不同在于,輸入變成了一對(duì)圖片,不是預(yù)測(cè)單個(gè)樣本對(duì)應(yīng)的標(biāo)簽,而是判斷這一對(duì)樣本是否是來(lái)自同一個(gè)類,是則結(jié)果為0,不是則結(jié)果為1)。

layer {name: "feat"type: "InnerProduct"bottom: "ip2"top: "feat"param {name: "feat_w"lr_mult: 1}param {name: "feat_b"lr_mult: 2}inner_product_param {num_output: 2} }

定義Siamese網(wǎng)絡(luò)

在這個(gè)部分我們將要定義siamese網(wǎng)絡(luò),并用于訓(xùn)練。網(wǎng)絡(luò)定義在./examples/siamese/mnist_siamese_train_test.prototxt

讀入一對(duì)數(shù)據(jù)

我們最開始需要定義一個(gè)data層,而data層會(huì)從我們之前創(chuàng)建的LevelDB數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。這個(gè)數(shù)據(jù)庫(kù)的每個(gè)條目都包含了一對(duì)圖像(pair_data)和一個(gè)二進(jìn)制標(biāo)簽,表示它們是否是來(lái)自同一個(gè)類或是不同的類(sim)。

layer {name: "pair_data"type: "Data"top: "pair_data"top: "sim"include { phase: TRAIN }transform_param {scale: 0.00390625}data_param {source: "examples/siamese/mnist_siamese_train_leveldb"batch_size: 64} }

為了從數(shù)據(jù)庫(kù)中取出一對(duì)圖片打包送到同一個(gè)blob中,我們對(duì)每一個(gè)通道都打包一個(gè)圖像。我們想要分別處理這兩個(gè)圖像,所以在data層之后添加了一個(gè)slice層。它會(huì)接受pair_data的數(shù)據(jù),并將其根據(jù)通道維度切分開來(lái),然后我們會(huì)在data和它成對(duì)的圖像data_p上得到一個(gè)單一的圖像。

layer {name: "slice_pair"type: "Slice"bottom: "pair_data"top: "data"top: "data_p"slice_param {slice_dim: 1slice_point: 1} }

建立Siamese網(wǎng)絡(luò)的第一邊

現(xiàn)在我們可以指定siamese網(wǎng)絡(luò)的第一邊了。這一邊的網(wǎng)絡(luò)處理的是data(補(bǔ)充:輸入是data層),生成的是feat(輸出是feat層)。剛開始,我們?cè)?strong>./examples/siamese/mnist_siamese.prototxt中加入了默認(rèn)的權(quán)重初始值。然后,我們給卷積層和內(nèi)積層(全連接層)進(jìn)行命名。對(duì)參數(shù)進(jìn)行命名,就相當(dāng)于告訴Caffe這些層上的參數(shù)在兩邊的siamese網(wǎng)絡(luò)上共享。就像這樣定義:

... param { name: "conv1_w" ... } param { name: "conv1_b" ... } ... param { name: "conv2_w" ... } param { name: "conv2_b" ... } ... param { name: "ip1_w" ... } param { name: "ip1_b" ... } ... param { name: "ip2_w" ... } param { name: "ip2_b" ... } ...

建立Siamese網(wǎng)絡(luò)的第二邊

現(xiàn)在我們需要?jiǎng)?chuàng)建第二邊網(wǎng)絡(luò),而這一邊的網(wǎng)絡(luò)處理的是data_p,生成的是feat_p。這一邊跟第一邊基本上是一模一樣的。因此,直接復(fù)制粘貼就行。然后我們要改一下每一層的名字、輸入、輸出,在名字后面加上“_p”來(lái)跟原始的區(qū)分一下。

添加對(duì)比損失函數(shù)

為了訓(xùn)練網(wǎng)絡(luò),我們要對(duì)一個(gè)對(duì)比損失函數(shù)進(jìn)行優(yōu)化,由Raia Hadsell, Sumit ChopraYann LeCun在“Dimensionality Reduction by Learning an Invariant Mapping”中提出。這個(gè)損失函數(shù)會(huì)使得在特征空間中相互匹配的樣本更加接近,同時(shí)也會(huì)使得不匹配的樣本更遠(yuǎn)。這個(gè)損耗函數(shù)在CONTRASTIVE_LOSS層聲明了:

layer {name: "loss"type: "ContrastiveLoss"contrastive_loss_param {margin: 1.0}bottom: "feat"bottom: "feat_p"bottom: "sim"top: "loss" }

定義解決方案

除了給解決方案指定正確的模型文件之外,沒有什么特別的需要做的了。解決方案定義在:./examples/siamese/mnist_siamese_solver.prototxt

訓(xùn)練和測(cè)試模型

在你已經(jīng)寫好了網(wǎng)絡(luò)定義的protobuf和解決方案的protobuf之后,訓(xùn)練模型變得很簡(jiǎn)單了。運(yùn)行:./examples/siamese/train_mnist_siamese.sh

./examples/siamese/train_mnist_siamese.sh

繪制結(jié)果

首先,通過(guò)運(yùn)行下面的命令,我們可以畫出模型和siamese網(wǎng)絡(luò),畫出來(lái).prototxt文件中定義的DAGs

./python/draw_net.py \./examples/siamese/mnist_siamese.prototxt \./examples/siamese/mnist_siamese.png./python/draw_net.py \./examples/siamese/mnist_siamese_train_test.prototxt \./examples/siamese/mnist_siamese_train_test.png

接著,我們可以在iPython notebook中導(dǎo)入訓(xùn)練好的模型并畫出特征:

ipython notebook ./examples/siamese/mnist_siamese.ipynb

補(bǔ)充:ipython notebook太老了,可以直接換成jupyter notebook。指令如下:

jupyter notebook ./examples/siamese/mnist_siamese.ipynb

運(yùn)行結(jié)果截圖

這些是我在自己筆記本上運(yùn)行的結(jié)果,僅供參考。
運(yùn)行代碼:

./python/draw_net.py \./examples/siamese/mnist_siamese.prototxt \./examples/siamese/mnist_siamese.png

生成的網(wǎng)絡(luò)結(jié)構(gòu)的圖片:

運(yùn)行代碼:

./python/draw_net.py \./examples/siamese/mnist_siamese_train_test.prototxt \./examples/siamese/mnist_siamese_train_test.png

生成的網(wǎng)絡(luò)結(jié)構(gòu)的圖片:

運(yùn)行代碼:

jupyter notebook ./examples/siamese/mnist_siamese.ipynb

直接看圖就知道了,每種顏色分別對(duì)應(yīng)一個(gè)手寫數(shù)字,正好10種吧。

總結(jié)

以上是生活随笔為你收集整理的Caffe官方教程翻译(3):Siamese Network Training with Caffe的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。