python中digits什么意思_在Caffe中使用 DIGITS自定义Python层
Caffe 使得我們有了使用Python自定義層的能力,而不是通常的C++/CUDA。這是一個非常有用的特性,但它的文檔記錄不足,難以正確實現(xiàn)本演練將向您展示如何使用DIGHT來學(xué)習(xí)實現(xiàn)Python層。
注意:這個特性(自定義python層)在你是使用Cmake編譯Caffe或者使用Deb 包來安裝Caffe的時候自動被包含。如果你使用Make,你將需要將你的Makefile.config中的"WITH_PYTHON_LAYER := 1"解注釋來啟用它。
給MNIST添加遮擋
對于這個例子,我們將在MNIST數(shù)據(jù)集上訓(xùn)練LeNet,但是我們將建立一個python層,來實現(xiàn)在圖片喂進(jìn)網(wǎng)絡(luò)之前,截取掉它的四分之一。這模擬遮擋的數(shù)據(jù),這樣將會訓(xùn)練出一個對遮擋更加魯棒的模型。
比如
變成
創(chuàng)建數(shù)據(jù)集
首先,仿照這個教程(https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md#creating-a-dataset)來使用DIGITS創(chuàng)建MNIST數(shù)據(jù)集(假設(shè)你還沒有創(chuàng)建)
創(chuàng)建Python文件
接下來你將創(chuàng)建一個包含你的Pyhon層定義的Python文件。打開一個文本編輯器,然后創(chuàng)建一個包含如下內(nèi)容的文件。
importcaffeimportrandomclassBlankSquareLayer(caffe.Layer):defsetup(self, bottom, top):assert len(bottom) == 1, 'requires a single layer.bottom'
assert bottom[0].data.ndim >= 3, 'requires image data'
assert len(top) == 1, 'requires a single layer.top'
defreshape(self, bottom, top):#Copy shape from bottom
top[0].reshape(*bottom[0].data.shape)defforward(self, bottom, top):#Copy all of the data
top[0].data[...] =bottom[0].data[...]#Then zero-out one fourth of the image
height = top[0].data.shape[-2]
width= top[0].data.shape[-1]
h_offset= random.randrange(height/2)
w_offset= random.randrange(width/2)
top[0].data[...,
h_offset:(h_offset+ height/2),
w_offset:(w_offset+ width/2),
]=0defbackward(self, top, propagate_down, bottom):pass
其中,top和bottom是包含一個或者多個blob的列表或者數(shù)組,訪問其中的每一個blob使用下標(biāo)index,如top[index],訪問其中的數(shù)據(jù)使用top[index].data,也就是一個四維向量[N,C,H,W]。
創(chuàng)建一個模型
注意:如果你以前沒有使用DIGITS創(chuàng)建一個模型,在創(chuàng)建之前,你可以參照教程(https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md#training-a-model)學(xué)習(xí)。
點擊主頁上的New Model > Images > Classification。
從數(shù)據(jù)集列表中選擇MNIST數(shù)據(jù)集。
單擊“Use client side file”,并選擇先前創(chuàng)建的Python文件。
點擊LeNet under Standard Networks > Caffe。
點擊右邊顯示的 Customize鏈接。
這將把我們帶到一個窗口,我們可以自定義LeNet來添加自定義的Python層。我們將在scale層和conv層之間插入我們的層。找到這些層(從頂部的幾行),并插入這段prototxt代碼的片段:
layer {
name: "blank_square"
type: "Python"
bottom: "scaled"
top: "scaled"
python_param {
module: "digits_python_layers"
layer: "BlankSquareLayer"
}
}
當(dāng)你點擊Visualize,你將看到如下圖:
然后給模型一個名字,點擊Create。你將會看到模型訓(xùn)練會話開始。如果你注意,你你將會發(fā)現(xiàn)這個模型會比默認(rèn)的LeNet網(wǎng)絡(luò)精度低,這是為什么呢?
注意:當(dāng)前的caffe版本不支持在有Python層的網(wǎng)絡(luò)上使用多GPU。如果你向使用Python層,那么你需要使用但GPU來訓(xùn)練。詳見:https://github.com/BVLC/caffe/issues/2936
測試模型
現(xiàn)在開始比較有趣的部分。在MNIST測試集中選擇一張圖片,然后將它上傳到 Test a single image(在頁面的底下)
然后點擊Show visualizations 和 statistics! 原始的圖片將顯示在左上,然后是它的預(yù)測類型。在Visualization 列,你會看到減去均值的圖像作為數(shù)據(jù)激活的結(jié)果。
就在它下面,你會看到將圖像從[0~255 ]縮小到[-1~1 ]的結(jié)果。你也會看到一個隨機(jī)的四分之一的圖像已經(jīng)被刪除-這是得益于我們的Python層!
注意:第二個激活顯示為彩色熱圖,即使底層數(shù)據(jù)仍然是單通道的,并且可以顯示為灰度圖像。“數(shù)據(jù)”激活被視為一種特殊情況,所有其他激活都被轉(zhuǎn)換為熱圖。
總結(jié)
以上是生活随笔為你收集整理的python中digits什么意思_在Caffe中使用 DIGITS自定义Python层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动物故事100篇大全
- 下一篇: 探索宇宙奥秘的句子78句