數據層
數據層是模型最底層,提供提供數據輸入和數據從Blobs轉換成別的格式進行保存輸出,通常數據預處理(減去均值,放大縮小,裁剪和鏡像等)也在這一層設置參數實現.
參數設置:
- name: 名稱
- type: 類型
- Data: 從LMDB/LEVELDB讀取數據和標簽, 轉換(http://deepdish.io/2015/04/28/creating-lmdb-in-python/) 可以使用convert_imageset轉換
- ImageData: 直接讀取圖片數據
- ....
- top: 輸出數據(和下一層的bottom一樣)
- bottom: 輸入數據()
- include: 一般訓練和測試的時候,模型層不一樣,由include指定在哪一層出現, TRIAN/TEST
- transform_params: 數據預處理 data_params: 數據參數
- source: 數據位置
- backend
- batchsize: 設置batch的大小
例如,caffe中自帶的mnist example
layer {
name: "mnist" #名稱
type: "Data" #輸入的是LMDB數據,前面的create_mnist.sh做了轉換
include: TRIAN #只在訓練的時候才包括(測試沒有label)
transform_param {
scale: 0.00390625 #縮放參數
}
data_param {
source: "examples/mnist/mnist_train_lmdb" #數據來源是在當前文件夾中的 mnist_train_lmdb中
backend: LMDB
batch_size: 64 #batch的大小
}
top: "data" #第一層輸出data和label, 無bottom
top: "label" #
}
--------------------------------------------------------------------------------------------------------------------------------------------------
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
前面我們提到數據層中Data類型輸入是LMDB/LEVELDB數據,而我們有的經常是原始圖片數據,而且有可能原始圖片的大小還不一致,我們需要將其轉換為格式一致的可輸入數據,caffe中的convert_imageset 為我們提供了這樣的工具。
FLAGS:圖片組參數
- -gray: 是否以灰度圖的方式打開圖片,程序調用opencv庫中的imread()函數來打開圖片,默認為false
- -shuffle: 是否隨機打亂圖片順序,默認為false
- -backend: 需要轉換成db文件格式,可選為leveldb或lmdb默認為lmdb
- -resize_width/resize_height: 改變圖片大小,需要的時候可以使得圖片大小一致,程序調用opencv的resize()函數來對圖片進行縮放,默認為0,不變
- -check_size: 檢查所有的數據是否有相同的尺寸,默認為false, 不檢查
- -encoded: 是否將原圖片的編碼放入最終的數據,默認為false
- -encoded_type: 與前一個參數對應,將圖片編碼為一個格式
ROOTFOLDER: 圖片存放的絕對路徑,從linux系統根目錄開始
LISTFILE: 圖片文件列表清單,一般為一個txt文件,一行一張圖片及其類別標簽
DB_NAME: 最終生成的db文件存放目錄
例如:
#!/usr/bin/env sh DATA=examples/images/cropimage/ #路徑變量 rm -rf $DATA/img_train_lmdb #如果文件存在,先刪除再重新創建 build/tools/convert_imageset --shuffle --gray --check_size=true /home/vicent/caffe/examples/images/cropimage/ $DATA/batchfile.txt $DATA/img_train_lmdb #亂序,轉換為灰度,檢查大小是否一致
--------------------------------------------------------------------------------------------------------------------------------------------------
視覺層
卷積層
卷積的目的是提取feature
- name: 名稱
- type: 層類型
- bottom: 輸入
- top: 輸出
- lr_mt: 學習率速率, 最終學習率是這個數乘以solver.prototxt 配置文件中的base_lr; 如果有兩個lr_mt一個表示偏置學習率,一個表示權值學習率
- num_outputs: filter的個數
- kernel_size: 卷積核大小
- stride: 步長
- pad: 邊緣擴充
- weight_filler: 權值初始化, 默認為constant, 值全為0,經常用xavier, 也可設置為gaussian
- bias_filler: 偏置初始化方法, 一般偏置初始化方法可以不設置
例如:
layer {
name: "conv1" #名稱
type: "Convolution" #層類型
bottom: "data" #上一層輸入數據
top: "conv1" #這一層輸出數據
param {
lr_mult: 1 #權重學習率速率
}
param {
lr_mult: 2 #偏置學習率速率
}
convolution_param {
num_output: 20 #filter的個數
kernel_size: 5 #卷積核的大小
stride: 1
weight_filler {
type: "xavier" #權重初始化方法
}
bias_filler {
type: "constant" #偏置初始化方法
}
}
}
池化層
減少數據量和數據維度
- kernel_size:池化核大小
- pool: 池化方法, max, ave, stochastic
- pad:
- stride
Normalization
