日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

caffe 框架梳理(待续)

發(fā)布時間:2023/12/13 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 caffe 框架梳理(待续) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文更多資料來源于羅韻北京深度學習資料和Ian Goodfellow的書籍《Deep Learning》
鏈接: http://pan.baidu.com/s/1jIRJ6mU
提取密碼:xehi

caffe:全稱Convolutional Architecture for Fast Feature Embedding,是一個計算CNN 相關算法的框架,用C++和Python實現(xiàn)的。

Caffe的優(yōu)點與局限性

優(yōu)點:
? 1. 第一個主流的工業(yè)級深度學習工具。
? 2. 專精于圖像處理
? 局限性:
? 1. 它有很多擴展,但是由于一些遺留的架構問題,不夠靈活且對遞歸網(wǎng)絡和語言建模的支持很差。
? 2. 基于層的網(wǎng)絡結構,其擴展性不好,對于新增加的層,需要
自己實現(xiàn)(forward, backward and gradient update)

Caffe目錄結構

? data/ 用于存放下載的訓練數(shù)據(jù)
? docs/ 幫助文檔
? examples/ 代碼樣例
? matlab/ MATLAB接文件
? python/ PYTHON接文件
? models/ 一些配置好的模型參數(shù)
? scripts/ 一些文檔和數(shù)據(jù)會用到的腳本核心代碼
? tools/ 保存的源碼是用于生成二進制處理程序的,caffe在訓練時實際是直接調(diào)用這些二進制文件
? include/ Caffe的實現(xiàn)代碼的頭文件
? src/ 實現(xiàn)Caffe的源文件

src/ 文件結構

gtest/ google test 一個用于測試的庫,你make runtest時看見的很多綠?色RUN OK就是它,這個與caffe的學習無關,不過是個有用的庫

caffe/ 關鍵代碼

? test/ 用gtest測試caffe的代碼
? util/ 數(shù)據(jù)轉換時用的一些代碼。caffe速度快,很大程度得益于內(nèi)存設計上的優(yōu)化(blob數(shù)據(jù)結構采用proto)和對卷積的優(yōu)化(部分與im2col相
關)
? proto/ 即所謂的“Protobuf”,全稱“Google Protocol Buffer”,是一種數(shù)據(jù)存儲格式,幫助caffe提速
? layers/ 深度神經(jīng)網(wǎng)絡中的基本結構就是一層層互不相同的網(wǎng)絡了,這個
文件夾下的源文件以及目前位置“src/caffe”中包含所有.cpp文件就是caffe的核心目錄下的核心代碼了。

Caffe核心代碼

? blob[.cpp .h] 基本的數(shù)據(jù)結構Blob類
? common[.cpp .h] 定義Caffe類
? internal_thread[.cpp .h] 使用boost::thread線程庫
? net[.cpp .h] 網(wǎng)絡結構類Net
? solver[.cpp .h] 優(yōu)化方法類Solver
? data_transformer[.cpp .h] 輸入數(shù)據(jù)的基本操作類DataTransformer
? syncedmem[.cpp .h] 分配內(nèi)存和釋放內(nèi)存類CaffeMallocHost,用于同步GPU,CPU數(shù)據(jù)
? layer[.cpp .h] 層類Layer
? layers/ 此文件夾下面的代碼全部至少繼承了類Layer, 從layer_factory中注冊繼承

1. Caffe三級結構(Blobs,Layers,Nets)

? Blob:用于數(shù)據(jù)的保存、交換和操作,Caffe基礎存儲結構
? Layer:用于模型和計算的基礎
? Net:整合連接Layers

1.1 Blobs結構

? 在內(nèi)存中表示4維數(shù)組,在caffe/blob.hpp中,維度包括
(width_,height_,channels_,num_)
? num_用于存儲數(shù)據(jù)或權值(data)和權值增量(diff)

? Blob 在caffe源碼 blob.hpp中是一個模板類。
? protected 的成員變量有:data_ , diff_ , shape_ , count_ , capacity_ ,其中data_ 和diff_ 是共享SyncedMemory 類(在syncedmem的源碼中定義)的智能指針,shape_是int型的vector,count_ 和capacity_ 是整型變量。
? 其成員函數(shù)主要有:Reshape 、ReshapeLike、SharedData、 Updata 等等
? blob.hpp 包含了caffe.pb.h ,說明caffe protobuf 會向blob 傳遞參數(shù)。

“caffe/proto/caffe.pb.h”
? caffe.pb.h是google protocol buffer根據(jù)caffe.proto自動生成的,可以到src/caffe/proto/caffe.proto里看下caffe里面用到的各個數(shù)據(jù)的定義,比如BlobProto,Datum,NetParameter等。使用這個protocol buffer看起來確實方便,一方面可以用文本文件定義結構化的數(shù)據(jù)類型,另一方面可以生成查詢效率更高、占空間更小的二進制文件。

“caffe/common.hpp”
? 主要singleton化Caffe類,并封裝了boost和CUDA隨機數(shù)生成的函數(shù),提供了統(tǒng)一的接口。

“caffe/syncedmem.hpp”
? 定義了以下的接?口:
? inline void CaffeMallocHost(void** ptr, size_t size)
? inline void CaffeFreeHost(void* ptr)
? 主要是分配內(nèi)存和釋放內(nèi)存的。而class SyncedMemory定義了內(nèi)存分配管理和CPU與GPU之間同步的函數(shù)。

“caffe/util/math_functions.hpp”
? 封裝了很多cblas矩陣運算

caffe.proto里面BlobProto的定義

message BlobProto {optional BlobShape shape = 7;repeated float data = 5 [packed = true];repeated float diff = 6 [packed = true];repeated double double_data = 8 [packed = true];repeated double double_diff = 9 [packed = true];// 4D dimensions -- deprecated. Use "shape" instead.optional int32 num = 1 [default = 0];optional int32 channels = 2 [default = 0];optional int32 height = 3 [default = 0];optional int32 width = 4 [default = 0]; }? 對于BlobProto,可以看到定義了四個optional的int32類型的名字(name)num、channels、height和width,optional意味著Blob可以有一個或者沒有這個參數(shù),每個名字(name)后面都有一個數(shù)字,這個數(shù)字是其名字的一個標簽。這個數(shù)字就是用來在生成的二進制文件中搜索查詢的標簽。關于這個數(shù)字,115會花費1byte的編碼空間,162047花費2byte。所以?一般建議把那些頻繁使用的名字的標簽設為115之間的值。而后面的repeated意味著float類型的data和diff可以重復任意次,而加上[packed = true]是為了更高效的編碼。 ? 主要數(shù)據(jù)有兩個data和diff,用num、channels、height和width這四個維度來確定數(shù)據(jù)的具體位置,做一些數(shù)據(jù)查詢和Blob reshape的操作。

Blobs封裝了運行時的數(shù)據(jù)信息,提供了CPU和GPU的同步。從數(shù)學上來說, Blob就是一個N維數(shù)組。它是caffe中的數(shù)據(jù)操作基本單位,就像matlab中以矩陣為基本操作對象一樣。只是矩陣是二維的,而Blob是N維的。N可以是2,3,4等等。
對于圖片數(shù)據(jù)來說,Blob可以表示為(N*C*H*W)這樣一個4D數(shù)組。其中N表示圖片的數(shù)量,C表示圖片的通道數(shù),H和W分別表示圖片的高度和寬度。
當然,除了圖片數(shù)據(jù),Blob也可以用于非圖片數(shù)據(jù)。比如傳統(tǒng)的多層感知機,就是比較簡單的全連接網(wǎng)絡,用2D的Blob,調(diào)用innerProduct層來計算就可以了。

在模型中設定的參數(shù),也是用Blob來表示和運算。它的維度會根據(jù)參數(shù)的類型不同而不同。比如:在一個卷積層中,輸入一張3通道圖片,有96個卷積核,每個核大小為11*11,因此這個Blob是96*3*11*11. 而在一個全連接層中,假設輸入1024通道圖片,輸出1000個數(shù)據(jù),則Blob為1000*1024。


1.2 Layer的五種類型

? Layer
? 所有的Pooling,Convolve,apply nonlinearities等操作都在這里實現(xiàn)。在Layer中input data用bottom表示,output data用top表示。每一層定義了三種操作setup(Layer初始化), forward(正向傳導,根據(jù)input計算output), backward(反向傳導計算,根據(jù)output計算input的梯度)。forward和backward有GPU和CPU兩個版本的實現(xiàn)。


層是網(wǎng)絡模型的組成要素和計算的基本單位。層的類型比較多,如Data,Convolution,Pooling,ReLU,Softmax-loss,Accuracy等,一個層的定義大至如下圖:

從bottom進行數(shù)據(jù)的輸入 ,計算后,通過top進行輸出。圖中的黃色多邊形表示輸入輸出的數(shù)據(jù),藍色矩形表示層。

每一種類型的層都定義了三種關鍵的計算:setup,forward and backword

setup: 層的建立和初始化,以及在整個模型中的連接初始化。

forward: 從bottom得到輸入數(shù)據(jù),進行計算,并將計算結果送到top,進行輸出。

backward: 從層的輸出端top得到數(shù)據(jù)的梯度,計算當前層的梯度,并將計算結果送到bottom,向前傳遞。

正向傳播的是數(shù)據(jù),反向傳播的是誤差損失和梯度。


? 5種衍生Layers:

? data_layer


layer {name: "cifar"type: "Data"top: "data"top: "label"include {phase: TRAIN}transform_param {mean_file: "examples/cifar10/mean.binaryproto"}data_param {source: "examples/cifar10/cifar10_train_lmdb"batch_size: 100backend: LMDB} } name: 表示該層的名稱,可隨意取type: 層類型,如果是Data,表示數(shù)據(jù)來源于LevelDB或LMDB。根據(jù)數(shù)據(jù)的來源不同,數(shù)據(jù)層的類型也不同。一般都是采 用的LevelDB或LMDB數(shù)據(jù),因此層類型設置為Data。top或bottom: 每一層用bottom來輸入數(shù)據(jù),用top來輸出數(shù)據(jù)。如果只有top沒有bottom,則此層只有輸出,沒有輸入。反之亦然。如果有多個 top或多個bottom,表示有多個blobs數(shù)據(jù)的輸入和輸出。data 與 label: 在數(shù)據(jù)層中,至少有一個命名為data的top。如果有第二個top,一般命名為label。 這種(data,label)配對是分類模型所必需的。include: 一般訓練的時候和測試的時候,模型的層是不一樣的。該層(layer)是屬于訓練階段的層,還是屬于測試階段的層,需要用include來指定。如果沒有include參數(shù),則表示該層既在訓練模型中,又在測試模型中。Transformations: 數(shù)據(jù)的預處理,可以將數(shù)據(jù)變換到定義的范圍內(nèi)。如設置scale為0.00390625,實際上就是1/255, 即將輸入數(shù)據(jù)由0-255歸一化到0-1之間mirror # 1表示開啟鏡像,0表示關閉,也可用ture和false來表示 crop_size: 227剪裁一個 227*227的圖塊,在訓練階段隨機剪裁,在測試階段從中間裁剪

data_layer主要包含與數(shù)據(jù)有關的文件。在官方文檔中指出data是caffe數(shù)據(jù)的入口是網(wǎng)絡的最低層,并且支持多種格式,在這之中又有5種LayerType

? DATA 用于LevelDB或LMDB數(shù)據(jù)格式的輸入的類型,輸入?yún)?shù)有source,batch_size, (rand_skip), (backend)。后兩個是可選。

數(shù)據(jù)來自于數(shù)據(jù)庫(如LevelDB和LMDB)
層類型(layer type):Data
必須設置的參數(shù):
source: 包含數(shù)據(jù)庫的目錄名稱,如examples/mnist/mnist_train_lmdb
batch_size: 每次處理的數(shù)據(jù)個數(shù),如64
可選的參數(shù):
rand_skip: 在開始的時候,路過某個數(shù)據(jù)的輸入。通常對異步的SGD很有用。
backend: 選擇是采用LevelDB還是LMDB, 默認是LevelDB.

? MEMORY_DATA 這種類型可以直接從內(nèi)存讀取數(shù)據(jù)使用時需要調(diào)用MemoryDataLayer::Reset,輸入?yún)?shù)有batch_size, channels, height, width。
數(shù)據(jù)來自于內(nèi)存層類型:MemoryData必須設置的參數(shù):
batch_size:每一次處理的數(shù)據(jù)個數(shù),比如2,channels:通道數(shù)
height:高度,width: 寬度
示例:

layer { top: "data" top: "label" name: "memory_data" type: "MemoryData" memory_data_param{ batch_size: 2 height: 100 width: 100 channels: 1 } transform_param { scale: 0.0078125 mean_file: "mean.proto" mirror: false } }

? HDF5_DATA HDF5數(shù)據(jù)格式輸入的類型,輸入?yún)?shù)有source, batch_size。
? HDF5_OUTPUT HDF5數(shù)據(jù)格式輸出的類型,輸入?yún)?shù)有file_name。

數(shù)據(jù)來自于HDF5
層類型:HDF5Data
必須設置的參數(shù):
source: 讀取的文件名稱
batch_size: 每一次處理的數(shù)據(jù)個數(shù)
示例:

layer { name: "data" type: "HDF5Data" top: "data" top: "label" hdf5_data_param { source: "examples/hdf5_classification/data/train.txt" batch_size: 10 } }

? IMAGE_DATA 圖像格式數(shù)據(jù)輸入的類型,輸入?yún)?shù)有source, batch_size,(rand_skip), (shuffle), (new_height), (new_width)。

數(shù)據(jù)來自于圖片
層類型:ImageData
必須設置的參數(shù):
source: 一個文本文件的名字,每一行給定一個圖片文件的名稱和標簽(label)
batch_size: 每一次處理的數(shù)據(jù)個數(shù),即圖片數(shù)
可選參數(shù):
rand_skip: 在開始的時候,路過某個數(shù)據(jù)的輸入。通常對異步的SGD很有用。
shuffle: 隨機打亂順序,默認值為false
new_height,new_width: 如果設置,則將圖片進行resize
示例:

layer { name: "data" type: "ImageData" top: "data" top: "label" transform_param { mirror: false crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" } image_data_param { source: "examples/_temp/file_list.txt" batch_size: 50 new_height: 256 new_width: 256 }

? 其實還有兩種WINDOW_DATA, DUMMY_DATA?用于測試和預留的接?口,不重要。

數(shù)據(jù)來源于Windows
層類型:WindowData
必須設置的參數(shù):
source: 一個文本文件的名字
batch_size: 每一次處理的數(shù)據(jù)個數(shù),即圖片數(shù)
示例:

layer {name: "data"type: "WindowData"top: "data"top: "label"include {phase: TRAIN}transform_param {mirror: truecrop_size: 227mean_file: "data/ilsvrc12/imagenet_mean.binaryproto"}window_data_param {source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt"batch_size: 128fg_threshold: 0.5bg_threshold: 0.5fg_fraction: 0.25context_pad: 16crop_mode: "warp"} }

? neuron_layer

同樣是數(shù)據(jù)的操作層,neuron_layer實現(xiàn)里大量激活函數(shù),主要是元素級別的操作,具有相同的bottom,top size。
? Caffe中實現(xiàn)了大量激活函數(shù)GPU和CPU的都有很多。它們的父類都是
NeuronLayer

? template <typename Dtype> ? class NeuronLayer : public Layer<Dtype>

1、Sigmoid

對每個輸入數(shù)據(jù),利用sigmoid函數(shù)執(zhí)行操作。這種層設置比較簡單,沒有額外的參數(shù)。
層類型:Sigmoid

示例

layer {name: "encode1neuron"bottom: "encode1"top: "encode1neuron"type: "Sigmoid" }

2、ReLU / Rectified-Linear and Leaky-ReLU

ReLU是目前使用最多的激活函數(shù),主要因為其收斂更快,并且能保持同樣效果。

標準的ReLU函數(shù)為max(x, 0),當x>0時,輸出x; 當x<=0時,輸出0

f(x)=max(x,0)

層類型:ReLU

可選參數(shù):

  negative_slope:默認為0. 對標準的ReLU函數(shù)進行變化,如果設置了這個值,那么數(shù)據(jù)為負數(shù)時,就不再設置為0,而是用原始數(shù)據(jù)乘以negative_slope

一般的參數(shù)設置格式如下(以ReLU為例)

layers { name: "relu1" type: RELU bottom: "conv1" top: "conv1" }

RELU層支持in-place計算,這意味著bottom的輸出和輸入相同以避免內(nèi)存的消耗。

3、TanH / Hyperbolic Tangent

利用雙曲正切函數(shù)對數(shù)據(jù)進行變換。

層類型:TanH

layer {name: "layer"bottom: "in"top: "out"type: "TanH" }

4、Absolute Value

求每個輸入數(shù)據(jù)的絕對值。

f(x)=Abs(x)

層類型:AbsVal

layer {name: "layer"bottom: "in"top: "out"type: "AbsVal" }

5、Power

對每個輸入數(shù)據(jù)進行冪運算

f(x)= (shift + scale * x) ^ power

層類型:Power
可選參數(shù):
  power: 默認為1
  scale: 默認為1
  shift: 默認為0

layer {name: "layer"bottom: "in"top: "out"type: "Power"power_param {power: 2scale: 1shift: 0} }

6、BNLL

binomial normal log likelihood的簡稱

f(x)=log(1 + exp(x))

層類型:BNLL

layer {name: "layer"bottom: "in"top: "out"type: “BNLL” }

? loss_layer

Loss層計算網(wǎng)絡誤差,loss_layer.hpp頭文件調(diào)用情況

? #include “caffe/blob.hpp" ? #include “caffe/common.hpp" ? #include “caffe/layer.hpp" ? #include “caffe/neuron_layers.hpp" ? #include “caffe/proto/caffe.pb.h"

可以看見調(diào)用了neuron_layers.hpp,估計是需要調(diào)用里面的函數(shù)計算Loss,一般來說Loss放在最后一層。caffe實現(xiàn)了大量loss function,它們的父類都是LossLayer。

? template <typename Dtype> ? class LossLayer : public Layer<Dtype>

softmax-loss

softmax-loss層和softmax層計算大致是相同的。softmax是一個分類器,計算的是類別的概率(Likelihood),是Logistic Regression 的一種推廣。Logistic Regression 只能用于二分類,而softmax可以用于多分類。

softmax與softmax-loss的區(qū)別:

softmax計算公式:

而softmax-loss計算公式

關于兩者的區(qū)別更加具體的介紹,可參考:softmax vs. softmax-loss

用戶可能最終目的就是得到各個類別的概率似然值,這個時候就只需要一個 Softmax層,而不一定要進行softmax-Loss 操作;或者是用戶有通過其他什么方式已經(jīng)得到了某種概率似然值,然后要做最大似然估計,此時則只需要后面的 softmax-Loss 而不需要前面的 Softmax 操作。因此提供兩個不同的 Layer 結構比只提供一個合在一起的 Softmax-Loss Layer 要靈活許多。

不管是softmax layer還是softmax-loss layer,都是沒有參數(shù)的,只是層類型不同而也

layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip1"bottom: "label"top: "loss" }

softmax layer: 輸出似然值

layers {bottom: "cls3_fc"top: "prob"name: "prob"type: “Softmax" }

? common_layer

這一層主要進行的是vision_layer的連接
聲明了9個類型的common_layer,部分有GPU實現(xiàn)

? InnerProductLayer 常常用來作為全連接層 ? SplitLayer ?用于一輸入對多輸出的場合(對blob) ? FlattenLayer 將n * c * h * w變成向量的格式n * ( c * h * w ) * 1 * 1 ? ConcatLayer ?用于多輸入一輸出的場合 ? SilenceLayer ?用于一輸入對多輸出的場合(對layer) ? (Elementwise Operations) 這里面是我們常說的激活函數(shù)層Activation Layers。 ? EltwiseLayer ? SoftmaxLayer ? ArgMaxLayer ? MVNLayer

Inner Product

全連接層,把輸入當作成一個向量,輸出也是一個簡單向量(把輸入數(shù)據(jù)blobs的width和height全變?yōu)?)。

輸入: n*c0*h*w

輸出: n*c1*1*1

全連接層實際上也是一種卷積層,只是它的卷積核大小和原數(shù)據(jù)大小一致。因此它的參數(shù)基本和卷積層的參數(shù)一樣。

層類型:InnerProduct

lr_mult: 學習率的系數(shù),最終的學習率是這個數(shù)乘以solver.prototxt配置文件中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。

必須設置的參數(shù):

  num_output: 過濾器(filfter)的個數(shù)

其它參數(shù):

  weight_filler: 權值初始化。 默認為“constant",值全為0,很多時候我們用"xavier"算法來進行初始化,也可以設置為”gaussian"bias_filler: 偏置項的初始化。一般設置為"constant",值全為0。

   bias_term: 是否開啟偏置項,默認為true, 開啟

layer {name: "ip1"type: "InnerProduct"bottom: "pool2"top: "ip1"param {lr_mult: 1}param {lr_mult: 2}inner_product_param {num_output: 500weight_filler {type: "xavier"}bias_filler {type: "constant"}} }

accuracy

輸出分類(預測)精確度,只有test階段才有,因此需要加入include參數(shù)。
層類型:Accuracy

layer {name: "accuracy"type: "Accuracy"bottom: "ip2"bottom: "label"top: "accuracy"include {phase: TEST} }

reshape

在不改變數(shù)據(jù)的情況下,改變輸入的維度。
層類型:Reshape
示例如下

layer {name: "reshape"type: "Reshape"bottom: "input"top: "output"reshape_param {shape {dim: 0 # copy the dimension from belowdim: 2dim: 3dim: -1 # infer it from the other dimensions}}}

有一個可選的參數(shù)組shape, 用于指定blob數(shù)據(jù)的各維的值(blob是一個四維的數(shù)據(jù):n*c*w*h)。
dim:0 表示維度不變,即輸入和輸出是相同的維度。
dim:2 或 dim:3 將原來的維度變成2或3
dim:-1 表示由系統(tǒng)自動計算維度。數(shù)據(jù)的總量不變,系統(tǒng)會根據(jù)blob數(shù)據(jù)的其它三維來自動計算當前維的維度值 。

假設原數(shù)據(jù)為:64*3*28*28, 表示64張3通道的28*28的彩色圖片
經(jīng)過reshape變換:

reshape_param {shape {dim: 0 dim: 0dim: 14dim: -1 }}

輸出數(shù)據(jù)為:64*3*14*56


Dropout

Dropout是一個防止過擬合的trick。可以隨機讓網(wǎng)絡某些隱含層節(jié)點的權重不工作。

先看例子:

layer {name: "drop7"type: "Dropout"bottom: "fc7-conv"top: "fc7-conv"dropout_param {dropout_ratio: 0.5} }

只需要設置一個dropout_ratio即可。


? vision_layer

主要是實現(xiàn)Convolution和Pooling操作, 主要有以下幾個類:
? ConvolutionLayer 最常用的卷積操作

層類型:Convolutionlr_mult: 學習率的系數(shù),最終的學習率是這個數(shù)乘以solver.prototxt配置文件中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。在后面的convolution_param中,我們可以設定卷積層的特有參數(shù)。必須設置的參數(shù):num_output: 卷積核(filter)的個數(shù)kernel_size: 卷積核的大小。如果卷積核的長和寬不等,需要用kernel_h和kernel_w分別設定其它參數(shù):stride: 卷積核的步長,默認為1。也可以用stride_h和stride_w來設置。pad: 擴充邊緣,默認為0,不擴充。 擴充的時候是左右、上下對稱的,比如卷積核的大小為5*5,那么pad設置為2,則四個邊緣都擴充2個像素,即寬度和高度都擴充了4個像素,這樣卷積運算之后的特征圖就不會變小。也可以通過pad_h和pad_w來分別設定。weight_filler: 權值初始化。 默認為“constant",值全為0,很多時候我們用"xavier"算法來進行初始化,也可以設置為”gaussian"bias_filler: 偏置項的初始化。一般設置為"constant",值全為0。bias_term: 是否開啟偏置項,默認為true, 開啟輸入:n*c0*w0*h0 輸出:n*c1*w1*h1 其中,c1就是參數(shù)中的num_output,生成的特征圖個數(shù)w1=floor((w0+2*pad-kernel_size)/stride)+1;向下取整h1=floor((h0+2*pad-kernel_size)/stride)+1;向下取整 如果設置stride為1,前后兩次卷積部分存在重疊。如果設置pad=(kernel_size-1)/2,則運算后,寬度和高度不變。 由pad, kernel_size和stride三者共同決定。

更多細節(jié)可見卷積步長

卷積中的卷

示例

layer {name: "conv1"type: "Convolution"bottom: "data"top: "conv1"param {lr_mult: 1}param {lr_mult: 2}convolution_param {num_output: 20kernel_size: 5stride: 1weight_filler {type: "xavier"}bias_filler {type: "constant"}} }

? Im2colLayer 與MATLAB里面的im2col類似,即image-tocolumn
transformation,轉換后方便卷積計算

它先將一個大矩陣,重疊地劃分為多個子矩陣,對每個子矩陣序列化成向量,最后得到另外一個矩陣。 在caffe中,卷積運算就是先對數(shù)據(jù)進行im2col操作,再進行內(nèi)積運算(inner product)。這樣做,比原始的卷積操作速度更快。

? LRNLayer 全稱local response normalization layer,在Hinton論文中有詳細介紹ImageNet Classification with Deep Convolutional Neural Networks 。

此層是對一個輸入的局部區(qū)域進行歸一化,達到“側抑制”的效果。 參數(shù):全部為可選,沒有必須local_size: 默認為5。如果是跨通道LRN,則表示求和的通道數(shù);如果是在通道內(nèi)LRN,則表示求和的正方形區(qū)域長度。alpha: 默認為1,歸一化公式中的參數(shù)。beta: 默認為5,歸一化公式中的參數(shù)。norm_region: 默認為ACROSS_CHANNELS。有兩個選擇,ACROSS_CHANNELS表示在相鄰的通道間求和歸一化。WITHIN_CHANNEL表示在一個通道內(nèi)部特定的區(qū)域內(nèi)進行求和歸一化。與前面的local_size參數(shù)對應。

歸一化公式:對于每一個輸入, 去除以 ,得到歸一化后的輸出

layers {name: "norm1"type: LRNbottom: "pool1"top: "norm1"lrn_param {local_size: 5alpha: 0.0001beta: 0.75} }

? PoolingLayer Pooling操作

池化層,為了減少運算量和數(shù)據(jù)維度而設置的一種層。 層類型:Pooling 必須設置的參數(shù):kernel_size: 池化的核大小。也可以用kernel_h和kernel_w分別設定。 其它參數(shù):pool: 池化方法,默認為MAX。目前可用的方法有MAX, AVE, 或STOCHASTICpad: 和卷積層的pad的一樣,進行邊緣擴充。默認為0stride: 池化的步長,默認為1。一般我們設置為2,即不重疊。也可以用stride_h和stride_w來設置。

示例

layer {name: "pool1"type: "Pooling"bottom: "conv1"top: "pool1"pooling_param {pool: MAXkernel_size: 3stride: 2} }
pooling層的運算方法基本是和卷積層是一樣的。輸入:n*c*w0*h0 輸出:n*c*w1*h1 和卷積層的區(qū)別就是其中的c保持不變w1=floor((w0+2*pad-kernel_size)/stride)+1;向下取整h1=floor((h0+2*pad-kernel_size)/stride)+1;向下取整 如果設置stride為2,前后兩次卷積部分不重疊。100*100的特征圖池化后,變成50*50. 由pad, kernel_size和stride三者共同決定。

更多細節(jié)可見卷積步長


池化層


1.3 Nets結構

Net由一系列的Layer組成(無回路有向圖DAG),Layer之間的連接由一個文本文件描述。模型初始化Net::Init()會產(chǎn)生blob和layer并調(diào)用Layer::SetUp。在此過程中Net會報告初始化進程。這里的初始化與設備無關,在初始化之后通過Caffe::set_mode()設置Caffe::mode()來選擇運行
平臺CPU或GPU,結果是相同的。

Net
就像搭積木一樣,一個net由多個layer組合而成。
現(xiàn)給出 一個簡單的2層神經(jīng)網(wǎng)絡的模型定義( 加上loss 層就變成三層了),先給出這個網(wǎng)絡的拓撲。

第一層:name為mnist, type為Data,沒有輸入(bottom),只有兩個輸出(top),一個為data,一個為label
第二層:name為ip,type為InnerProduct, 輸入數(shù)據(jù)data, 輸出數(shù)據(jù)ip
第三層:name為loss, type為SoftmaxWithLoss,有兩個輸入,一個為ip,一個為label,有一個輸出loss,沒有畫出來。
對應的配置文件prototxt就可以這樣寫:

name: "LogReg" layer {name: "mnist"type: "Data"top: "data"top: "label"data_param {source: "input_leveldb"batch_size: 64} } layer {name: "ip"type: "InnerProduct"bottom: "data"top: "ip"inner_product_param {num_output: 2} } layer {name: "loss"type: "SoftmaxWithLoss"bottom: "ip"bottom: "label"top: "loss" }

第一行將這個模型取名為LogReg, 然后是三個layer的定義,參數(shù)都比較簡單,只列出必須的參數(shù)。



卷積神經(jīng)網(wǎng)絡示例


優(yōu)化求解過程Solver



solver算是caffe的核心的核心,它協(xié)調(diào)著整個模型的運作。caffe程序運行必帶的一個參數(shù)就是solver配置文件。運行代碼一般為

./build/tools/caffe train --solver=examples/myfile/solver.prototxt -gpu all &> examples/myfile/output/output.log #或者 ./build/tools/caffe train -solver examples/myfile/solver.prototxt -gpu all &> examples/myfile/output/output.log

在Deep Learning中,往往loss function是非凸的,沒有解析解,我們需要通過優(yōu)化方法來求解。

? 求解器Solver是什么?
? Caffe的重中之重(核心)——Solver
? 負責對模型優(yōu)化,讓損失函數(shù)(loss function)達到全局最小。
? solver的主要作用就是交替調(diào)用前向(forward)算法和后向(backward)算法來更新參數(shù),實際上就是一種迭代的優(yōu)化算法。

優(yōu)化算法

caffe提供了六種優(yōu)化算法來求解最優(yōu)參數(shù),在solver配置文件中,通過設置type類型來選擇。

Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"), Adam (type: "Adam"), Nesterov’s Accelerated Gradient (type: "Nesterov") and RMSprop (type: "RMSProp")

Solver的流程

1. 設計好需要優(yōu)化的對象,以及用于學習的訓練網(wǎng)絡和用于評估的測試網(wǎng)絡。(通過調(diào)用另外一個配置文件prototxt來進行)2. 通過forward和backward迭代的進行優(yōu)化來跟新參數(shù)。3. 定期的評價測試網(wǎng)絡。 (可設定多少次訓練后,進行一次測試)4. 在優(yōu)化過程中顯示模型和solver的狀態(tài)

在每一次的迭代過程中,solver做了這幾步工作:

? 1、調(diào)用forward算法來計算最終的輸出值,以及對應的loss ? 2、調(diào)用backward算法來計算每層的梯度 ? 3、根據(jù)選用的slover方法,利用梯度進行參數(shù)更新 ? 4、記錄并保存每次迭代的學習率、快照,以及對應的狀態(tài)。

示例

net: "examples/mnist/lenet_train_test.prototxt" test_iter: 100 test_interval: 500 base_lr: 0.01 momentum: 0.9 type: SGD weight_decay: 0.0005 lr_policy: "inv" gamma: 0.0001 power: 0.75 display: 100 max_iter: 20000 snapshot: 5000 snapshot_prefix: "examples/mnist/lenet" solver_mode: CPU

設置深度網(wǎng)絡模型。每一個模型就是一個net,需要在一個專門的配置文件中對net進行配置,每個net由許多的layer所組成。注意的是:文件的路徑要從caffe的根目錄開始,其它的所有配置都是這樣。

net: "examples/mnist/lenet_train_test.prototxt"

也可用train_net和test_net來對訓練模型和測試模型分別設定。例如:

train_net:"examples/hdf5_classification/logreg_auto_train.prototxt" test_net: "examples/hdf5_classification/logreg_auto_test.prototxt"

test_iter要與test layer中的batch_size結合起來理解。mnist數(shù)據(jù)中測試樣本總數(shù)為10000,一次性執(zhí)行全部數(shù)據(jù)效率很低,因此我們將測試數(shù)據(jù)分成幾個批次來執(zhí)行,每個批次的數(shù)量就是batch_size。假設我們設置batch_size為100,則需要迭代100次才能將10000個數(shù)據(jù)全部執(zhí)行完。因此test_iter設置為100。執(zhí)行完一次全部數(shù)據(jù),稱之為一個epoch

test_iter: 100

測試間隔。也就是每訓練500次,才進行一次測試。

test_interval: 500

下面四行用于學習率的設置。只要是梯度下降法來求解優(yōu)化,都會有一個學習率,也叫步長。base_lr用于設置基礎學習率,在迭代的過程中,可以對基礎學習率進行調(diào)整。怎么樣進行調(diào)整,就是調(diào)整的策略,由lr_policy來設置。

base_lr: 0.01 lr_policy: "inv" gamma: 0.0001 power: 0.75

lr_policy可以設置為下面這些值,相應的學習率的計算為:

- fixed:   保持base_lr不變. - step:    如果設置為step,則還需要設置一個stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示當前的迭代次數(shù) - exp:   返回base_lr * gamma ^ iter, iter為當前迭代次數(shù) - inv:   如果設置為inv,還需要設置一個power, 返回base_lr * (1 + gamma * iter) ^ (- power) - multistep: 如果設置為multistep,則還需要設置一個stepvalue。這個參數(shù)和step很相似,step是均勻等間隔變化,而multistep則是根據(jù) stepvalue值變化 - poly:    學習率進行多項式誤差, 返回 base_lr (1 - iter/max_iter) ^ (power) - sigmoid: 學習率進行sigmod衰減,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))

multistep示例:

base_lr: 0.01 momentum: 0.9 weight_decay: 0.0005 # The learning rate policy lr_policy: "multistep" gamma: 0.9 stepvalue: 5000 stepvalue: 7000 stepvalue: 8000 stepvalue: 9000 stepvalue: 9500

momentum上一次梯度更新的權重

momentum :0.9

優(yōu)化算法選擇。這一行可以省掉,因為默認值就是SGD,總共有六種方法可選擇。

type: SGD

權重衰減項,防止過擬合的一個參數(shù)。

weight_decay: 0.0005

每訓練100次,在屏幕上顯示一次。如果設置為0,則不顯示。

display: 100

最大迭代次數(shù)。這個數(shù)設置太小,會導致沒有收斂,精確度很低。設置太大,會導致震蕩,浪費時間。

max_iter: 20000

快照。將訓練出來的model和solver狀態(tài)進行保存,snapshot用于設置訓練多少次后進行保存,默認為0,不保存。snapshot_prefix設置保存路徑。

還可以設置snapshot_diff,是否保存梯度值,默認為false,不保存。
也可以設置snapshot_format,保存的類型。有兩種選擇:HDF5 和BINARYPROTO ,默認為BINARYPROTO

snapshot: 5000 snapshot_prefix: "examples/mnist/lenet"

設置運行模式。默認為GPU,如果你沒有GPU,則需要改成CPU,否則會出錯。

solver_mode: CPU

solver優(yōu)化方法

caffe的六種優(yōu)化方法:

Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: "AdaDelta"), Adaptive Gradient (type: "AdaGrad"), Adam (type: "Adam"), Nesterov’s Accelerated Gradient (type: "Nesterov") and RMSprop (type: "RMSProp")

Solver就是用來使loss最小化的優(yōu)化方法。對于一個數(shù)據(jù)集D,需要優(yōu)化的目標函數(shù)是整個數(shù)據(jù)集中所有數(shù)據(jù)loss的平均值。

其中,fW(x(i)) 計算的是數(shù)據(jù) x(i) 上的 loss, 先將每個單獨的樣本 x 的 loss 求出來,然后求和,最后求均值。 r(W) 是正則項(weight_decay),為了減弱過擬合現(xiàn)象。

如果采用這種Loss 函數(shù),迭代一次需要計算整個數(shù)據(jù)集,在數(shù)據(jù)集非常大的這情況下,這種方法的效率很低,這個也是我們熟知的梯度下降采用的方法。

在實際中,通過將整個數(shù)據(jù)集分成幾批(batches), 每一批就是一個mini-batch,其數(shù)量(batch_size)為N<<|D|,此時的loss 函數(shù)為

有了loss函數(shù)后,就可以迭代的求解loss和梯度來優(yōu)化這個問題。在神經(jīng)網(wǎng)絡中,用forward pass來求解loss,用backward pass來求解梯度。

在caffe中,默認采用的Stochastic Gradient Descent(SGD)進行優(yōu)化求解。后面幾種方法也是基于梯度的優(yōu)化方法(like SGD),因此本文只介紹一下SGD。

1、Stochastic gradient descent(SGD)

隨機梯度下降(Stochastic gradient descent)是在梯度下降法(gradient descent)的基礎上發(fā)展起來的,梯度下降法也叫最速下降法。SGD在通過負梯度和上一次的權重更新值Vt的線性組合來更新W,迭代公式如下:

其中, α 是負梯度的學習率(base_lr),μ 是上一次梯度值的權重(momentum),用來加權之前梯度方向對現(xiàn)在梯度下降方向的影響。這兩個參數(shù)需要通過tuning來得到最好的結果,一般是根據(jù)經(jīng)驗設定的。

在深度學習中使用SGD,比較好的初始化參數(shù)的策略是把學習率設為0.01左右(base_lr: 0.01),在訓練的過程中,如果loss開始出現(xiàn)穩(wěn)定水平時,對學習率乘以一個常數(shù)因子(gamma),這樣的過程重復多次。對于momentum,一般取值在0.5--0.99之間。通常設為0.9,momentum可以讓使用SGD的深度學習方法更加穩(wěn)定以及快速。

關于更多的momentum,請參看Hinton的《A Practical Guide to Training Restricted Boltzmann Machines》。

示例

base_lr: 0.01 lr_policy: "step" gamma: 0.1 stepsize: 1000 max_iter: 3500 momentum: 0.9

lr_policy設置為step,則學習率的變化規(guī)則為 base_lr * gamma ^ (floor(iter / stepsize))

lr_policy設置為step,則學習率的變化規(guī)則為 base_lr * gamma ^ (floor(iter / stepsize))

即前1000次迭代,學習率為0.01; 第1001-2000次迭代,學習率為0.001; 第2001-3000次迭代,學習率為0.00001,第3001-3500次迭代,學習率為10-5

上面的設置只能作為一種指導,它們不能保證在任何情況下都能得到最佳的結果,有時候這種方法甚至不work。如果學習的時候出現(xiàn)diverge(比如,你一開始就發(fā)現(xiàn)非常大或者NaN或者inf的loss值或者輸出),此時你需要降低base_lr的值(比如,0.001),然后重新訓練,這樣的過程重復幾次直到你找到可以work的base_lr。

2、AdaDelta

AdaDelta是一種”魯棒的學習率方法“,是基于梯度的優(yōu)化方法(like SGD)。

具體的介紹文獻:

M. Zeiler ADADELTA: AN ADAPTIVE LEARNING RATE METHOD. arXiv preprint, 2012.

示例

net: "examples/mnist/lenet_train_test.prototxt" test_iter: 100 test_interval: 500 base_lr: 1.0 lr_policy: "fixed" momentum: 0.95 weight_decay: 0.0005 display: 100 max_iter: 10000 snapshot: 5000 snapshot_prefix: "examples/mnist/lenet_adadelta" solver_mode: GPU type: "AdaDelta" delta: 1e-6

從最后兩行可看出,設置solver type為Adadelta時,需要設置delta的值。

3、AdaGrad

自適應梯度(adaptive gradient)是基于梯度的優(yōu)化方法(like SGD)

自適應梯度(adaptive gradient)是基于梯度的優(yōu)化方法(like SGD)

具體的介紹文獻:

Duchi, E. Hazan, and Y. Singer. Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. The Journal of Machine Learning Research, 2011.

示例

net: "examples/mnist/mnist_autoencoder.prototxt" test_state: { stage: 'test-on-train' } test_iter: 500 test_state: { stage: 'test-on-test' } test_iter: 100 test_interval: 500 test_compute_loss: true base_lr: 0.01 lr_policy: "fixed" display: 100 max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "examples/mnist/mnist_autoencoder_adagrad_train" # solver mode: CPU or GPU solver_mode: GPU type: "AdaGrad"

4、Adam

是一種基于梯度的優(yōu)化方法(like SGD)。

具體的介紹文獻:

D. Kingma, J. Ba. Adam: A Method for Stochastic Optimization. International Conference for Learning Representations, 2015.

5、NAG

Nesterov 的加速梯度法(Nesterov’s accelerated gradient)作為凸優(yōu)化中最理想的方法,其收斂速度非常快。

具體的介紹文獻:

I. Sutskever, J. Martens, G. Dahl, and G. Hinton. On the Importance of Initialization and Momentum in Deep Learning. Proceedings of the 30th International Conference on Machine Learning, 2013.

示例

net: "examples/mnist/mnist_autoencoder.prototxt" test_state: { stage: 'test-on-train' } test_iter: 500 test_state: { stage: 'test-on-test' } test_iter: 100 test_interval: 500 test_compute_loss: true base_lr: 0.01 lr_policy: "step" gamma: 0.1 stepsize: 10000 display: 100 max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "examples/mnist/mnist_autoencoder_nesterov_train" momentum: 0.95 # solver mode: CPU or GPU solver_mode: GPU type: "Nesterov"

6、RMSprop

RMSprop是Tieleman在一次 Coursera課程演講中提出來的,也是一種基于梯度的優(yōu)化方法(like SGD)

具體的介紹文獻:

T. Tieleman, and G. Hinton. RMSProp: Divide the gradient by a running average of its recent magnitude. COURSERA: Neural Networks for Machine Learning.Technical report, 2012.

示例

net: "examples/mnist/lenet_train_test.prototxt" test_iter: 100 test_interval: 500 base_lr: 1.0 lr_policy: "fixed" momentum: 0.95 weight_decay: 0.0005 display: 100 max_iter: 10000 snapshot: 5000 snapshot_prefix: "examples/mnist/lenet_adadelta" solver_mode: GPU type: "RMSProp" rms_decay: 0.98

最后兩行,需要設置rms_decay值。


2. Caffe 的 I/O 模塊

將圖片數(shù)據(jù)轉化為LMDB數(shù)據(jù)

■ 第一步:創(chuàng)建圖片文件列表清單,一般為一個txt文件,一行一張圖片
■ 第二步:使用Caffe工具命令
convert_imageset [FLAGS] [ROOTFOLDER/] [LISTFILE] [DB_NAME]
需要帶四個參數(shù):
FLAGS: 圖片參數(shù)組
-gray: 是否以灰度圖的方式打開圖片。程序調(diào)用opencv庫中的imread()函數(shù)來打開圖片,默認為false
-shuffle: 是否隨機打亂圖片順序。默認為false
-backend:需要轉換成的db文件格式,可選為leveldb或lmdb,默認為lmdb
-resize_width/resize_height: 改變圖片的大小。在運行中,要求所有圖片的尺寸一致,因此需要改變圖片大小。 程序調(diào)用
opencv庫的resize()函數(shù)來對圖片放大縮小,默認為0,不改變
-check_size: 檢查所有的數(shù)據(jù)是否有相同的尺寸。默認為false,不檢查
-encoded: 是否將原圖片編碼放入最終的數(shù)據(jù)中,默認為false

示例文件及代碼見首行中的百度云共享。

#Image to txt:at the path of "scripts" ls IO2LMDB/blue | sed "s:^:blue/:" | sed "s:$: 0:" >> data.txt ls IO2LMDB/red | sed "s:^:red/:" | sed "s:$: 1:" >> data.txt#txt to LMDB : at the path of "OI2LMDB" convert_imageset -shuffle:'true' ./data.txt db_train_lmdb

對Layer做參數(shù)配置(Data Layer參數(shù)配置為例)

layer {name: "cifar" type: "Data"top: "data"top: "label"include {phase: TRAIN}transform_param {mean_file: "examples/cifar10/mean.binaryproto"}data_param {source: "examples/cifar10/cifar10_train_lmdb"batch_size: 100backend: LMDB} }

name: 表示該層的名稱,可隨意取。
type: 層類型,如果是Data,表示數(shù)據(jù)來源于LevelDB或LMDB。根
據(jù)數(shù)據(jù)的來源不同,數(shù)據(jù)層的類型也不同(后面會詳細闡述)。一
般在練習的時候,我們都是采用的LevelDB或LMDB數(shù)據(jù),因此層
類型設置為Data。

top或bottom: 每一層用bottom來輸入數(shù)據(jù),用top來輸出數(shù)據(jù)。如
果只有top沒有bottom,則此層只有輸出,沒有輸?入。反之亦然。如
果有多個 top或多個bottom,表示有多個blobs數(shù)據(jù)的輸入和輸出。
data 與 label: 在數(shù)據(jù)層中,至少有一個命名為data的top。如果有
第二個top,一般命名為label。 這種(data,label)配對是分類模型所
必需的。

include: 一般訓練的時候和測試的時候,模型的層是不一樣的。該
層(layer)是屬于訓練階段的層,還是屬于測試階段的層,需要用
include來指定。如果沒有include參數(shù),則表示該層既在訓練模型
中,又在測試模型中。

Transformations: 數(shù)據(jù)的預處理,可以將數(shù)據(jù)變換到定義的范圍
內(nèi)。如設置scale為0.00390625,實際上就是1/255, 即將輸入數(shù)據(jù)由0-255歸一化到0-1之間。

所有數(shù)據(jù)預處理都在這里設置:

通常數(shù)據(jù)的預處理(如減去均值, 放大縮小, 裁剪和鏡像等),Caffe使用OpenCV做處理

layer {name: "cifar"type: "Data"top: "data"top: "label"include {phase: TEST}transform_param {mean_file: "examples/cifar10/mean.binaryproto"#用一個配置?文件來進行均值操作 mirror: 1 # 1表示開啟鏡像,0表示關閉,也可用ture和false來表示 crop_size: 227 # 剪裁一個227*227的圖塊,在訓練階段隨機剪裁,在測試階段從中間裁剪}data_param {source: "examples/cifar10/cifar10_test_lmdb"batch_size: 100backend: LMDB} }

3. Caffe 中五種層的實現(xiàn)和參數(shù)配置


3.1 卷積層參數(shù)配置

layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 1 #學習率1,和權值更新相關 } param { lr_mult: 2 #學習率2,和權值更新相關 } convolution_param { num_output: 50 # 50個輸出的map kernel_size: 5 #卷積核大小為5*5 stride: 1 #卷積步?長為1 weight_filler { #權值初始化方式 type: “xavier" #默認為“constant",值全為0,很多時候我們也可以?用"xavier"或者”gaussian"來進行初始化 } bias_filler { #偏置值的初始化?方式 type: “constant"#該參數(shù)的值和weight_filler類似, ?一般設置為"constant",值全為0 } } }

3.2 池化層參數(shù)配置

layer { name: "pool1" type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { pool: MAX #Pool為池化方式,默認值為MAX,可以選擇的參數(shù)有MAX、AVE、STOCHASTIC kernel_size: 2 #池化區(qū)域的大小,也可以用kernel_h和kernel_w分別設 置長和寬 stride: 2 #步長,即每次池化區(qū)域左右或上下移動的距離,一般和kernel_size相同,即為不重疊池化。也可以也可以小于kernel_size,即為重疊池化,Alexnet中就用到了重疊池化的方法 } }

3.3 全連接層參數(shù)配置

#參數(shù)和卷積層表達?一樣 layer { name: "ip1" type: "InnerProduct" bottom: "pool2" top: "ip1" param { lr_mult: 1 } param { lr_mult: 2 } inner_product_param { num_output: 500 weight_filler { type: "xavier" } bias_filler { type: "constant" } } }

3.4 激活函數(shù)層參數(shù)配置

激活函數(shù)作用:激活函數(shù)是用來引入非線性因素的。
激活函數(shù)一般具有以下性質(zhì):
■ 非線性: 線性模型的不足我們前邊已經(jīng)提到。
■ 處處可導:反向傳播時需要計算激活函數(shù)的偏導數(shù),所以要求激活函數(shù)除個別點外,處處可導。
■ 單調(diào)性:當激活函數(shù)是單調(diào)的時候,單層網(wǎng)絡能夠保證是凸函數(shù)。
■ 輸出值的范圍: 當激活函數(shù)輸出值是有限的時候,基于梯度的優(yōu)化方法會更加穩(wěn)定,因為特征的表示受有限權值的影響更顯著

layer { name: "relu1" type: "ReLU" bottom: "ip1" top: "ip1" }

Type為該層類型,可取值分別為:
(1)ReLU:表示我們使用relu激活函數(shù),relu層支持in-place計算,這意味
著該層的輸入和輸出共享一塊內(nèi)存,以避免內(nèi)存的消耗。
(2)Sigmoid:代表使用sigmoid函數(shù);
(3) TanH:代表使用tanh函數(shù);
(4) AbsVal:計算每個輸入的絕對值f(x)=Abs(x)
(5)power對每個輸入數(shù)據(jù)進行冪運算
f(x)= (shift + scale * x) ^

layer { name: "layer" bottom: "in" top: "out" type: "Power" power_param { power: 2 scale: 1 shift: 0 } }

power
層類型:Power
可選參數(shù):
  power: 默認為1
  scale: 默認為1
  shift:默認值為0
  

3.5 softmax層

#可以計算給出每個樣本 對應的損失函數(shù)值 layer { name: "loss" type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" }#輸出為每個類別的概率值 layers { name: "prob" type: “Softmax" bottom: " ip2" top: "prob" }

4. Caffe的可視化

4.1 網(wǎng)絡結構可視化和特征可視化

可參考
http://blog.csdn.net/jiandanjinxin/article/details/50686461

http://blog.csdn.net/jiandanjinxin/article/details/50410290

4.2 可視化loss和accurary 曲線

cd caffer-master sh data/mnist/get_mnist.sh sh examples/mnist/create_mnist.sh sh examples/mnist/train_lenet.sh &> output.log plot_training_log.py.example -h #可查看用法 ./tools/extra/plot_training_log.py.example 0 testaccuracyvsiters.png output.log ./tools/extra/plot_training_log.py.example 2 testaccuracyvsiters.png output.log

使用訓練好的模型

均值文件mean file

■ 將所有訓練樣本的均值保存為文件
■ 圖片減去均值后,再進?行訓練和測試,會提高速度和精度
■ 運行方法:(使用Caffe?工具)
compute_image_mean [train_lmdb] [mean.binaryproto]

fine-turn微調(diào)網(wǎng)絡

■ 1. 準備新數(shù)據(jù)的數(shù)據(jù)庫(如果需要用mean file,還要準備對應的新的mean file), 具體方法和圖片轉換lmdb方式一樣。
■ 2. 調(diào)整網(wǎng)絡層參數(shù):
■ 將來訓練的網(wǎng)絡配置prototxt中的數(shù)據(jù)層source換成新數(shù)據(jù)的數(shù)據(jù)庫。
■ 調(diào)整學習率,因為最后一層是重新學習,因此需要有更快的學習速率相比較其他層,因此我們將,weight和bias的學習速率加快。
■ 3. 修改solver參數(shù)
■ 原來的數(shù)據(jù)是從原始數(shù)據(jù)開始訓練的,因此一般來說學習速率、步長、迭代次數(shù)都比較大,fine turning微調(diào)時,因為數(shù)據(jù)量可能減少了,所以一般來說,test_iter,base_lr,stepsize都要變小一點,其他的策略可以保持不
變。
■ 4. 重新訓練時,要指定之前的權值文件:
■ # caffe train –solver [新的solver文件] –weights [舊的caffemodel]

基本上,finetuning的想法就是說,在imagenet那么大的數(shù)據(jù)集上train好一個很牛的網(wǎng)絡了,那別的task上肯定也不錯,所以我們可以把pretrain的網(wǎng)絡拿過來,然后只重新train最后幾層,重新train的意思是說,比如我以前需要classify imagenet的一千類,現(xiàn)在我只想識別是狗還是貓,或者是不是車牌,于是我就可以把最后一層softmax從一個4096*1000的分類器變成一個4096*2的分類器,這個strategy在應用中非常好使,所以我們經(jīng)常會先在imagenet上pretrain一個網(wǎng)絡,因為我們知道imagenet上training的大概過程會怎么樣。fine tuning過程是用已有的模型來初始化現(xiàn)有的模型,那在fine tuning的過程中,怎么在fine tuning的時候,不更新某些層的參數(shù)呢? 這個在caffe里面可以設置一些layer的learning rate為零來實現(xiàn)

5. 深度學習模型訓練 Tricks

更多trick可見書籍《Neural Networks: Tricks of the Trade》

5.1 數(shù)據(jù)準備與擴增

1.1 數(shù)據(jù)準備:
一般數(shù)據(jù)集可能不會給出驗證集,所以自?己會從給的訓練集中按照一定比例(9:1)分離出驗證集。

1.2 數(shù)據(jù)的擴增
因為深度網(wǎng)絡需要在大規(guī)模的訓練圖像上來滿足性能,所以當原始圖像中的訓練數(shù)據(jù)集規(guī)模不夠多時,較好的辦法是擴增數(shù)據(jù)來提升模型性能。換言之,數(shù)據(jù)擴增對于訓練深度網(wǎng)絡來說是必須的。

常用的方法:
1. 沿著x軸將圖片左右翻轉
2. 隨機的剪切、縮放、旋轉
3. 顏色抖動
4. 提高圖像中像素的飽和度和值(即 HSV顏色空間的 S 和 V 成分)到 0.250.25 和44 之間(在一個樣本圖像內(nèi)要保證各個像素該值是一樣的),再在圖像上加上一個范圍在 [?0.1,0.1][?0.1,0.1] 之間的值給 H( hue ,即 HSV 中的色調(diào))這個成分。
5. 用pca來改變RGB的強度值,產(chǎn)生分別對應的特征值和特征向量,然后用均值為0方差為0.1的隨機數(shù)與特征值和特征向量相乘得到新的數(shù)據(jù)。(《ImageNet Classification with Deep Convolutional Neural Networks》)

5.2 圖像預處理

常見的是減均值、除方差,還有變化到-1?1,主要針對不同尺度的特征,進行尺度變換normaliz。
常用的預處理方法:
1. 去均值和規(guī)范化
通常作為第一步且較簡單的一種方式是去均值(zero-centered ,通俗地說:讓每個樣本都減去整體樣本的均值,使整體樣本的新均值為 0),并規(guī)范化(normalize)它們。
另一種在預處理用于規(guī)范化(normalize)數(shù)據(jù)的方法是將每一個維度的最大最小值分別限定為1 和 ?1 。

在此過程中,數(shù)據(jù)先經(jīng)過去均值,然后計算出(能刻畫數(shù)據(jù)內(nèi)部相關結果的)協(xié)方差矩陣:

>>> X -= np.mean(X, axis = 0) # 去均值 >>> cov = np.dot(X.T, X) / X.shape[0] # 計算協(xié)?方差矩陣

之后對數(shù)據(jù)去相關,?方法是將(剛剛去均值后的)原始數(shù)據(jù)投影到特征基(eigenbasis )上:

>>> U,S,V = np.linalg.svd(cov) # 對數(shù)據(jù)的協(xié)?方差矩陣計算 SVD 分解 >>> Xrot = np.dot(X, U) # 對數(shù)據(jù)去相關

最后一步是白化,它對去相關后的數(shù)據(jù)在每個維度上的特征值做尺度規(guī)范化處理:

>>> Xwhite = Xrot / np.sqrt(S + 1e-5) # 除以特征值(其實是奇異值的開平方根)

5.3 參數(shù)初始化

■ 訓練網(wǎng)絡前對參數(shù)做初始化。
■ 常用的初始化方法:
1. 全零初始化 —> 錯誤
2. 小隨機數(shù)初始化
是一種接近 0 但不是 0的權重初始化方法。
做法是初始化權重為接近 0 的隨機小數(shù),因為很接近 0 但不相等,這也被稱為“對稱破缺”( symmetry breaking )。

  • 全零初始化的錯誤原因:這會導致網(wǎng)絡中每個神經(jīng)元的輸出結果一樣,即經(jīng)過完全相同的參數(shù)更新,得到的反向傳播計算的梯度也相同。換言之,若初始權值相同,神經(jīng)元就不具有非對稱性(asymmetry)。
  • 小隨機數(shù)初始化:一開始時,每個神經(jīng)元都是隨機且獨特的,所以它們
    在訓練中計算出的更新是不同的,并在之后整合自己的“貢獻”作為整個
    網(wǎng)絡的不同部分。權重初始化的過程多少有點像 weights0.001×N(0,1),其中 N(0,1)N表示均值為 0 ,標準差為 1 的高斯分布。當然也可以使用服從均勻分布的隨機小數(shù),但在二者在實際中的性能表現(xiàn)上只有很微弱的差別。
  • 推薦方法
    先前通過校準神經(jīng)元上的方差來初始化參數(shù)并未考慮使用 ReLUs這樣的激活函數(shù)。最近一篇論?文《Surpassing Human-Level Performance on ImageNet Classification》討論了如何為 ReLUs這樣的激活函數(shù)做參數(shù)初始化,從而使網(wǎng)絡中神經(jīng)元的方差為 2.0/n,初始化?方式如下:
  • >>> w = np.random.randn(n) * sqrt(2.0/n) # ??目前推薦做法

    5.4 卷積參數(shù)的Tricks

    ■ 1. 圖片輸入是2的冪次方,例如32、64、96、224等。
    ■ 2. 卷積核大小是3*3或者5*5。
    ■ 3. 輸入圖片上下左右需要用0補充,即padding,且假如卷積核大小是5
    那么padding就是2(圖?片左右上下都補充2),卷積核大小是3padding
    大小就是1。

    5.5 池化層參數(shù)初始化Tricks

    ■ 1. poolin層也能防?止過擬合,使用overlapped pooling,即用來池化
    的數(shù)據(jù)有重疊,但是pooling的?大小不要超過3,常用的池化是2X2。
    ■ 2. max pooling比avg pooling效果會好一些。

    5.6 學習率

    ■ 1. 0.1是學習率的常用值
    ■ 2. 在實際中,如果在驗證集上看不到性能的提升(如損失函數(shù)值下降或者準確率上升),那就可以對當前的學習率除以 2(或 5 )看看效果并循環(huán)這一過程,或許能給你一個驚喜。

    5.7 正則化:防止過擬合

    過擬合,就是擬合函數(shù)需要顧忌每一個點,最終形成的擬合函數(shù)波動很大。在某些很小的區(qū)間里,函數(shù)值的變化很劇烈。這就意味著函數(shù)在某些小區(qū)間里的導數(shù)值(絕對值)非常大,由于自變量值可大可小,所以只有系數(shù)足夠大,才能保證導數(shù)值很大。而正則化是通過約束參數(shù)的范數(shù)使其不要太大,所以可以在一定程度上減少過擬合情況。

    常用防止過擬合方式:
    1. L2正則化
    2. L1正則化
    3. 最大模限制
    4. Dropout

    Dropout 是一個超級有效、簡單且是前陣子由 Srivastava 等人提出
    《Dropout: A Simple Way to Prevent Neural Networks from
    Overfitting》的,它是其它正則方法(如 L1 、 L2 、 最大模限制 )的
    補充。在訓練中, dropout 可理解為對整個神經(jīng)網(wǎng)絡進行抽樣(出的
    網(wǎng)絡),并基于輸入數(shù)據(jù)僅僅更新抽樣網(wǎng)絡的參數(shù)。(因為這些抽樣
    得到的網(wǎng)絡是共享參數(shù)的,所以這些抽樣出的網(wǎng)絡的權重參數(shù)并非是
    獨立的)。

    5.8 觀察損失曲線:學習率

    5.9 放大損失曲線:學習率、batch大小


    5.10 觀察準確率曲線

    5.11 fine-turn的方法

    ■ 如果你的數(shù)據(jù)量有限,那么,一般不建議自己完全從頭訓練起caffe
    模型。一般是找相關的項目或者模型,先finetuning一下,之后再慢
    慢的調(diào)整。一般fine tuning的方式,都是把learning rate(solver.prototxt)調(diào)低(為原來的十分之一),之后把訓練模型的
    最后一層或者兩層的學習速率調(diào)大一點————這就相當于,把模
    型的前面那些層的學習調(diào)低,使得參數(shù)更新的慢一點以達到微調(diào)的目的。
    ■ 微調(diào)的時候,有時候訓練數(shù)據(jù)特別少,而且希望模型的前面幾層的
    參數(shù)保持不變。方法是使得這幾個層的學習速率為0就可以了,比
    如設定lr_mult為0。

    5.12 模型集成

    ■ 在機器學習中,集成方法( ensemble methods )是指訓練多個學習器并在之后將它們組合使用,最終得到一個強有力的分類器的方法。

    ■ 幾種集成方式的技巧:
    ■ 1. 集成不同初始化的模型
    使用交叉驗證集來確定最佳的超參數(shù),再在基于最佳超參數(shù)的情況下,使用不同的隨機初始化方法來初始化權重來訓練多個模型。該方法的風險在于權重初始化方法的不同產(chǎn)生的差異。
    ■ 2.集成 topN 表現(xiàn)的模型
    使用交叉驗證集確定了最佳的超參數(shù)后,再選取表現(xiàn)最佳的前 topN 個模型進行集成。這可以提升集成模型的多樣性,但?風險就是這幾個模型都是局部最優(yōu)模型。實際實踐中,這種做法可以達到不錯的性能,因為不需要(在交叉驗證后)對模型進行額外的重新訓練。實際上,可以直接在 Caffe Model Zoo 中選擇表現(xiàn)性能在 topN 的幾個深度模型進行集成。

    問:“目前deep learning用在小數(shù)據(jù)集上有什么好的方法嗎?在小數(shù)據(jù)集的問題上是不是可以通過減少網(wǎng)絡的層數(shù)來減少過擬合?” 答:小數(shù)據(jù)集基本上需要通過小的模型來防止overfit,當然如果數(shù)據(jù)集是圖像等等,也可以通過finetuning。另外一個可能是直接手標更多數(shù)據(jù),有時候糙快猛但是還挺好使的。

    總結

    以上是生活随笔為你收集整理的caffe 框架梳理(待续)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    国产视频一二区 | 成人在线视频一区 | 色婷婷六月天 | 天天干,天天射,天天操,天天摸 | 亚洲精品国产精品乱码在线观看 | 精品国产一区二区三区久久久 | 欧美精品v国产精品v日韩精品 | 色一级片 | 日本动漫做毛片一区二区 | 精品极品在线 | 五月婷婷中文字幕 | 国产一区二区电影在线观看 | 国产原厂视频在线观看 | 欧美午夜精品久久久久久孕妇 | 日韩免费高清在线 | 在线看国产日韩 | 亚洲视频综合 | 婷婷在线视频观看 | 国产高清日韩 | 四虎在线视频免费观看 | 一区二区三区免费在线观看视频 | 免费观看性生活大片3 | 国产欧美日韩一区 | 天天爱天天干天天爽 | 久久综合欧美精品亚洲一区 | 99亚洲国产 | 91视频免费看片 | 欧美爽爽爽 | 在线视频一二三 | 国产精品精品国产 | 99久久久久久久久 | 波多野结衣网址 | 欧美一级片免费 | 天天色视频| 91精品啪在线观看国产81旧版 | 超级碰碰碰碰 | 免费www视频 | 国产精品久久久久久久久搜平片 | 免费在线电影网址大全 | 久久精品8 | 国产一区精品在线 | 国产一级片播放 | 99视频免费 | 在线观看av中文字幕 | 久久久久久99精品 | 久久毛片视频 | 天天操天天色综合 | 婷婷草| 91精品国产99久久久久久红楼 | av免费看网站 | 97超在线 | 国产成人精品一区二区三区网站观看 | 久久久精品一区二区 | 日韩视频一二三区 | 天天天天天天干 | 一区二区三区三区在线 | 亚洲欧美日韩在线看 | 91九色老| 欧美黄色高清 | 久久五月情影视 | 日本女人在线观看 | 在线成人av | 91视频成人免费 | 看片一区二区三区 | 一本色道久久综合亚洲二区三区 | 成人免费大片黄在线播放 | 狠狠色丁香婷婷综合久小说久 | 狠狠狠狠狠狠天天爱 | 国产精品久久久久久久久蜜臀 | 国产精品原创 | 在线免费性生活片 | 亚洲精品乱码白浆高清久久久久久 | 天天综合网天天综合色 | 久久精品一区二区国产 | 国产精品21区 | 免费黄色av电影 | 国产精品99久久久久人中文网介绍 | a√国产免费a | 久久精品一二三区白丝高潮 | 久久久一本精品99久久精品 | 91久久一区二区 | 狠狠狠色丁香婷婷综合久久五月 | 日韩免费视频在线观看 | 亚洲精品av中文字幕在线在线 | 国产精品乱码久久 | 成人在线观看资源 | 欧美日韩在线精品一区二区 | 欧美一级黄色网 | 天天干天天看 | 久久6精品 | 免费特级黄色片 | 欧美精品在线免费 | 国产精品高潮呻吟久久久久 | 91精品国产欧美一区二区 | 欧美一区二区三区四区夜夜大片 | 成人a级网站 | 在线欧美最极品的av | 免费观看福利视频 | 色婷婷国产在线 | 三上悠亚在线免费 | 国产精品系列在线观看 | 9在线观看免费高清完整版在线观看明 | 亚洲综合色激情五月 | 国产69精品久久久久久久久久 | 在线看成人av | 日韩精品视频久久 | 精品国产一区二区三区不卡 | 欧美一二三视频 | 国产精品专区在线 | 国产亚洲精品久久久久久久久久 | 国产精品成人免费 | 日日干天天射 | 久久久久久久看片 | 国偷自产视频一区二区久 | 91精品国产99久久久久久红楼 | www.人人干 | 中文字幕在线网址 | 中文字幕亚洲精品在线观看 | 麻豆久久久 | 日韩成人精品一区二区 | www.亚洲| 久久最新视频 | 日日夜夜免费精品 | 91亚洲永久精品 | 免费观看9x视频网站在线观看 | 成年人在线视频观看 | 欧美一级大片在线观看 | 久久人视频 | 99精品视频中文字幕 | 人人爱人人射 | 91精品视频免费在线观看 | 久久免费看视频 | 精品视频一区在线 | 国产一级黄 | 我爱av激情网 | 国产成人在线免费观看 | 黄色大片av | 国产福利在线 | 日韩在线 一区二区 | 激情av资源 | 欧美一级特黄aaaaaa大片在线观看 | 五月天激情婷婷 | 久久久久国产精品视频 | 国产福利一区二区在线 | 日韩在线视频免费播放 | 夜夜操狠狠干 | 日韩激情网| 久久不卡电影 | 日韩精品一区二区三区免费观看视频 | 精品久久久久国产免费第一页 | 天天摸天天弄 | 亚洲精品91天天久久人人 | av高清影院 | 丝袜网站在线观看 | 欧洲视频一区 | 亚洲成人av一区 | 99中文视频在线 | 中文在线天堂资源 | 色老板在线视频 | 黄视频色网站 | 成人在线播放视频 | 亚洲一区视频免费观看 | 国产精品激情偷乱一区二区∴ | 亚洲黄色小说网 | 九色视频网址 | 麻豆国产精品视频 | 黄色电影小说 | 国产三级精品三级在线观看 | 叶爱av在线 | 黄色a级片在线观看 | 日韩国产精品毛片 | 国产一级一级国产 | 免费视频一区 | 久久爱影视i | 国产高清免费在线观看 | 超碰国产97 | 午夜av片 | 国产在线美女 | 亚洲人片在线观看 | 国内精品久久久久影院日本资源 | 欧美日韩高清在线一区 | www.天天干 | 在线网站黄| 啪啪激情网| 免费福利在线视频 | 黄色软件视频网站 | 久久精品超碰 | 激情五月播播久久久精品 | 成人禁用看黄a在线 | av在线免费观看网站 | 免费看污片 | 国产精品麻 | 五月婷社区 | 国产黄色av | 亚洲激情五月 | 国产高清免费av | 久草网视频 | av成人免费在线看 | 日韩激情网 | 久久综合九色综合欧美就去吻 | 激情丁香5月 | 天天婷婷| 国产色婷婷 | av.com在线| 黄p在线播放 | 99麻豆久久久国产精品免费 | 国产精品成人一区二区三区吃奶 | 91av电影| 9992tv成人免费看片 | 一级免费看 | 四虎国产精品成人免费4hu | 亚洲日本欧美在线 | 婷婷国产一区二区三区 | 欧美精品在线观看一区 | 91精品国产99久久久久久久 | 成人亚洲精品国产www | 五月婷婷婷婷婷 | 亚洲精品在线二区 | 久久成年人网站 | 色人久久 | 色美女在线 | 亚洲免费av在线播放 | 伊人天天干 | 天天综合91| 综合久久综合久久 | 色综合久久88色综合天天免费 | 亚洲一区免费在线 | 99精品视频在线播放免费 | 亚洲精品在线网站 | 综合网天天 | 又黄又爽又色无遮挡免费 | 在线免费视频 你懂得 | 免费看三级 | 欧美网站黄色 | 欧美日韩一区二区三区免费视频 | 美女国内精品自产拍在线播放 | 中文字幕日韩一区二区三区不卡 | 久久人人爽人人人人片 | 96av麻豆蜜桃一区二区 | 国产精品久久久久久妇 | 色婷婷综合久久久 | 亚洲黄色在线观看 | 亚洲一区二区高潮无套美女 | 人人添人人 | 国产精品自产拍在线观看网站 | 大型av综合网站 | adc在线观看 | 在线亚洲小视频 | 热re99久久精品国产66热 | 国产视频久 | 亚洲年轻女教师毛茸茸 | 又黄又爽的视频在线观看网站 | 97视频在线免费播放 | 九九色视频| 99爱精品在线 | 中文字幕 国产视频 | 国产高清视频免费在线观看 | 国产精品久久久电影 | 久久精品一区二区三区视频 | 人人澡视频| 99热这里只有精品在线观看 | 亚洲激情在线观看 | 免费看色的网站 | 欧美一二区在线 | 久久艹精品 | 国产黄在线 | 波多野结衣精品视频 | 综合成人在线 | 欧美 激情 国产 91 在线 | 久久精品79国产精品 | 超碰官网| 亚洲激情小视频 | 亚洲最大的av网站 | 免费福利在线播放 | 美女黄网站视频免费 | 精品国产一区二区三区久久久 | 中文字幕亚洲五码 | 99精品国产免费久久 | 日韩成人免费在线电影 | 91传媒在线播放 | 日韩午夜电影院 | 欧美精品久久久久久久久久白贞 | 欧美一区免费在线观看 | 97在线视频免费看 | av韩国在线| 91中文在线视频 | 国产精品免费一区二区三区在线观看 | 亚洲乱码精品久久久 | 国产高清中文字幕 | 久久久久国产精品免费免费搜索 | 日韩a级黄色 | 久久综合射 | 综合在线色 | 中文字幕一区在线 | 久久 一区| 欧美另类美少妇69xxxx | 黄色精品久久 | 日韩在线观看第一页 | 精品一区二区在线免费观看 | 丝袜美腿亚洲 | 国产成人久 | 国产精品久久99综合免费观看尤物 | 精品国产欧美一区二区三区不卡 | 欧美日韩中文国产 | 一区二区三区四区五区在线 | 麻豆传媒在线免费看 | 伊人天堂久久 | 337p日本大胆噜噜噜噜 | av高清一区 | 久久综合狠狠综合久久综合88 | 国产欧美综合在线观看 | 国产精品嫩草影院123 | 久久蜜臀一区二区三区av | 久久美女精品 | 亚一亚二国产专区 | 97av在线视频免费播放 | 国产 日韩 欧美 自拍 | 超碰av在线播放 | 97精品欧美91久久久久久 | 精品国产色 | 日韩久久在线 | 久久综合狠狠狠色97 | 日韩中文字幕免费在线观看 | 免费a v观看 | 在线日韩 | 激情九九| 国产最新视频在线 | 成人中心免费视频 | 91热视频 | 婷婷成人综合 | 久久久午夜电影 | 婷婷中文字幕综合 | 欧美日韩在线观看一区 | 麻豆94tv免费版 | 欧美另类美少妇69xxxx | 一级a性色生活片久久毛片波多野 | 婷婷在线色 | 激情丁香在线 | 久久99精品久久久久久三级 | 国产成人久 | 98久久 | 亚洲免费精品一区二区 | 成人黄色电影免费观看 | 99中文字幕在线观看 | 天海冀一区二区三区 | av高清免费 | 国产在线观看免费观看 | 亚洲精品自在在线观看 | 日韩欧美综合视频 | 日韩视频一区二区在线观看 | 久久激情电影 | 国产视频69 | 欧美极品一区二区三区 | 日韩黄色一区 | 国产又粗又猛又黄又爽视频 | 九九九九色 | 1000部国产精品成人观看 | 欧美精品久久久久久久 | 黄色国产高清 | 久久老司机精品视频 | 丁香六月在线观看 | 国产精品美女久久久久久 | av资源在线看 | 少妇精品久久久一区二区免费 | 中文字幕乱码亚洲精品一区 | 日韩三级不卡 | 久久成人国产 | 美女视频久久黄 | 99热国内精品 | 国产亚洲午夜高清国产拍精品 | 久久一精品| 欧美一区二区三区在线 | 99视频在线免费播放 | 日韩av不卡在线播放 | 欧美久久久久久久 | 五月天婷婷丁香花 | 久久99精品波多结衣一区 | 视频在线观看入口黄最新永久免费国产 | 婷婷久久综合九色综合 | 青草视频网 | 成人午夜电影在线 | 97在线资源 | 欧美大片mv免费 | 伊人中文字幕在线 | 久久躁日日躁aaaaxxxx | 亚洲国产成人在线观看 | 91免费视频黄 | 综合色播| 国语对白少妇爽91 | 婷婷色影院 | 色网站黄 | 中文字幕国产视频 | 天天干夜夜夜 | 成人久久亚洲 | 99精品视频免费全部在线 | 亚洲aⅴ一区二区三区 | 最近中文字幕大全 | 欧美日韩国产二区 | 九九在线视频免费观看 | 久久国产美女视频 | 91av视频在线播放 | 中文av不卡 | 国产精品福利无圣光在线一区 | 婷婷av综合 | 麻豆免费观看视频 | 综合久久影院 | 操操操干干干 | 免费看三级黄色片 | 国产一级黄色免费看 | 欧美最爽乱淫视频播放 | 中文字幕在线观看免费 | 极品久久久久久久 | 高清一区二区三区 | 亚洲精品美女久久久 | 在线 精品 国产 | 免费网站观看www在线观看 | 午夜精品一区二区三区可下载 | 黄色app网站在线观看 | 91大神电影 | 黄污视频网站大全 | 亚洲综合视频在线播放 | 亚州精品在线视频 | 国产精品不卡视频 | 91精品久久久久久综合五月天 | 在线看中文字幕 | 国产成人福利在线 | 极品久久久久 | 成人毛片在线观看视频 | 97天天干| 国产又粗又猛又色又黄网站 | 精品伊人久久久 | 亚洲综合小说 | 国产精品a级| 久草在线高清 | 在线国产日韩 | 国产在线成人 | 99精品成人 | 日韩理论片中文字幕 | 久久久黄视频 | 国产精品9区 | 精品国产亚洲日本 | 久久神马影院 | 国产第一页在线观看 | 免费看成人a | 成人免费xxxxxx视频 | 91黄色免费网站 | 亚洲乱码一区 | 国产精品久久久久久久av大片 | 国产中文字幕久久 | 欧美一级免费片 | 精品久久久久一区二区国产 | 免费在线黄网 | 97超碰中文字幕 | 久久久精品影视 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 懂色av懂色av粉嫩av分享吧 | 激情综合色综合久久综合 | av免费看在线 | 久久综合色8888 | 91精品国产电影 | 亚洲精品免费在线观看视频 | 国产一区在线免费观看视频 | 最近中文国产在线视频 | 亚洲黄色免费 | 91精品福利在线 | 久久久免费观看完整版 | 成年人三级网站 | 在线观看视频免费大全 | 99自拍视频在线观看 | 午夜精品一区二区三区免费 | 天堂av观看| 日韩电影在线看 | 98涩涩国产露脸精品国产网 | 99精品一区二区三区 | 国产精品一区二区免费视频 | 天天天干天天射天天天操 | 日韩高清成人 | 伊人看片| 波多野结衣理论片 | 亚洲一区av| 久热色超碰| 日韩网站在线免费观看 | 天天操天天色天天射 | 91av小视频 | 涩涩网站在线观看 | 亚洲视频高清 | 视频在线观看一区 | 91大神dom调教在线观看 | va视频在线观看 | 天天噜天天色 | 波多野结衣在线观看视频 | 狠狠干成人综合网 | 日韩欧美一区二区不卡 | 国产永久网站 | 精品一二三四在线 | 亚洲精品三级 | 少妇按摩av | 成人影视片 | 中文字幕在线观看完整 | 亚洲精品乱码久久久久 | 69xx视频| 亚洲天天做 | 国产成人亚洲在线电影 | 欧美日韩一区二区免费在线观看 | 97在线影视| 欧美国产日韩中文 | 国产精品一区二区果冻传媒 | 精品视频免费久久久看 | 丁香花在线观看视频在线 | 久久久资源 | 97色在线视频| 五月天激情开心 | 国产一区二区三区免费观看视频 | av在线免费网站 | 欧美国产日韩一区二区 | 久久国产午夜精品理论片最新版本 | 国产精品免费av | 色噜噜日韩精品欧美一区二区 | 国产视频1| 亚洲激情p | 91最新国产 | 99久久久久国产精品免费 | 国产亚洲婷婷免费 | 欧美一区免费在线观看 | 天天操操操操操操 | 久久成 | 中文av网 | 夜夜骑首页 | 国产在线欧美在线 | 欧美日韩一区二区在线观看 | 日本成人中文字幕在线观看 | 三级视频片 | 99草在线视频 | 欧洲精品一区二区 | 国产麻豆果冻传媒在线观看 | 日韩免费一区 | 亚洲国产精品电影在线观看 | 99精品在线 | www.天天色.com | www视频在线免费观看 | 国产亚洲一区 | 日韩中文字幕免费看 | 色综合网在线 | 中文字幕在线看视频 | 亚洲免费精品视频 | 午夜精品福利在线 | 国产精品综合av一区二区国产馆 | 99中文视频在线 | 日韩在线网 | 91精品国产一区二区三区 | 在线国产日本 | 亚洲一区二区三区miaa149 | 免费视频在线观看网站 | 在线观看岛国av | 国产精品男女 | 亚洲精品在线观看免费 | 精品国产一区二区在线 | 日韩欧美国产成人 | 在线观看麻豆av | 免费观看性生交大片3 | 日韩电影在线看 | 国产成人精品av在线 | 国产精品福利无圣光在线一区 | 在线看岛国av | 美女网站在线免费观看 | av网站播放| 一级国产视频 | 91九色精品女同系列 | 欧美日韩p片 | 亚洲在线精品视频 | 一区二区三区观看 | 6080yy午夜一二三区久久 | 久草资源在线 | 精品国产中文字幕 | www.av在线播放 | 韩国精品视频在线观看 | 99欧美视频 | 国产精品久久久免费 | 免费在线播放视频 | 午夜三级大片 | 亚洲精品午夜久久久久久久久久久 | 久久黄色精品视频 | 欧美日韩在线视频观看 | www.五月婷| 99视频精品全部免费 在线 | av在线中文 | 精品国产一区二区三区四区vr | 久久精彩免费视频 | 国产精品伦一区二区三区视频 | 在线激情电影 | 狠狠夜夜 | 国产成人av一区二区三区在线观看 | 午夜av电影院 | 婷婷激情5月天 | 99精品欧美一区二区三区黑人哦 | 超碰97网站| 最新日韩在线观看 | 日本护士三级少妇三级999 | 三级黄色免费 | av日韩中文| 国产视频精品免费 | 日本中文字幕网站 | 黄色日本免费 | 日韩免费网站 | 在线精品视频免费播放 | 久久国产成人午夜av影院宅 | 色视频在线观看 | 国产一区在线精品 | 91精品中文字幕 | 亚洲天天在线日亚洲洲精 | 亚洲激色 | 国产一级a毛片视频爆浆 | 成人蜜桃 | 97在线观看视频国产 | 97超碰国产精品女人人人爽 | 久久人人艹 | 国产色黄网站 | 精品美女久久久久久免费 | 免费观看av网站 | 日韩有码欧美 | 狠狠色丁香久久婷婷综合五月 | 99久久综合精品五月天 | 久久精品爱视频 | 欧美福利视频一区 | 99久久精品免费看国产免费软件 | 在线 你懂| 超碰97免费 | 在线免费视频你懂的 | 最新日韩在线 | 国产人成一区二区三区影院 | 国产精品视频资源 | 免费看一级特黄a大片 | 久久激情日本aⅴ | 国产剧情一区 | 欧美日韩在线第一页 | 久久99精品视频 | 久久精品视频在线看 | 亚洲片在线 | 亚洲aaa级 | 狠狠干狠狠艹 | 日韩一区精品 | 免费韩国av | 婷婷天天色 | 欧美不卡在线 | 夜夜躁日日躁狠狠躁 | 欧美日韩精品在线视频 | 天天操天天透 | 亚洲欧美日韩国产一区二区 | 天天色图| 丁香六月欧美 | 精品一区二区精品 | japanesexxxxfreehd乱熟 | 国产精品毛片久久 | 亚洲伊人av | 探花视频网站 | 日韩欧美在线一区 | 成人免费在线观看电影 | 色婷婷一 | 成年人在线免费视频观看 | 亚洲精品免费在线观看 | 在线免费观看黄色 | 中文字幕 国产专区 | 久久国产手机看片 | 久久免费在线观看视频 | 中文字幕永久免费 | 在线午夜av | 国产成人一区二区啪在线观看 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 中午字幕在线 | 久久久精品电影 | 日本黄色a级大片 | 国产一级在线视频 | 五月婷婷激情六月 | 日韩一区二区三免费高清在线观看 | 亚洲片在线观看 | 日韩精品一区不卡 | 国产资源在线观看 | 日韩精品在线观看av | 黄网在线免费观看 | 男女男视频| 99精品视频在线观看 | 99re视频在线观看 | 深爱激情综合网 | 中文字幕亚洲欧美日韩2019 | 97人人视频| 五月天婷婷免费视频 | 国内精品久久久久久 | 午夜精品视频在线 | 深夜免费小视频 | 色欧美88888久久久久久影院 | 99中文视频在线 | 成人黄色一级视频 | 亚州精品成人 | 免费观看成人av | 一区二区三区高清不卡 | 婷婷在线视频 | 99热精品国产一区二区在线观看 | 一级精品视频在线观看宜春院 | 麻豆视频在线看 | 高清精品久久 | 天堂av中文字幕 | 91av在线视频免费观看 | 亚洲日韩中文字幕 | 天天摸日日摸人人看 | 日韩中文字幕免费在线观看 | 日韩免费 | 国产精品久久久久国产精品日日 | 美腿丝袜一区二区三区 | 欧美二区在线播放 | 免费视频久久久久 | 91在线91拍拍在线91 | 久久无码av一区二区三区电影网 | 国产久草在线 | 在线黄色国产电影 | 视频二区在线视频 | 中文字幕亚洲高清 | 97操碰| 国产成人久久精品77777综合 | 99色免费视频 | 婷婷丁香社区 | 一区二区久久久久 | 中文字幕av全部资源www中文字幕在线观看 | av电影亚洲| 亚洲传媒在线 | 亚洲乱亚洲乱亚洲 | 深爱激情婷婷网 | 日韩在线视频一区 | 免费人成网ww44kk44 | 中文字幕在线观看视频免费 | 精品一区二区免费视频 | 日韩电影精品一区 | 很黄很污的视频网站 | 五月婷婷伊人网 | 日韩av成人免费看 | 国产糖心vlog在线观看 | 五月婷婷在线视频观看 | 天天综合网久久 | 亚洲综合在线观看视频 | 天天干天天射天天爽 | 在线视频区| 人人爽人人爽人人片 | 国产99久久久国产精品成人免费 | 成人午夜网 | 最新日韩视频在线观看 | 免费在线中文字幕 | 色婷婷在线播放 | 国产福利91精品一区二区三区 | 天天搞天天干天天色 | 色综合色综合色综合 | av在线最新 | 97av影院 | 国产黄免费看 | 综合久久五月天 | 国产日韩精品一区二区在线观看播放 | 久草干| 婷婷在线免费 | 欧美一级特黄高清视频 | 午夜精品电影 | 久久视频这里有久久精品视频11 | 久久免费视频观看 | 欧美激情综合网 | 中文字幕在线一区二区三区 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产精品久久久久久久久久久久午夜 | 婷婷精品视频 | 国产成人精品午夜在线播放 | 国产精品久久久久久久久久不蜜月 | 人人揉人人揉人人揉人人揉97 | 久久综合九色综合久久久精品综合 | 国产又粗又猛又黄又爽 | 丁香婷婷成人 | 成人免费视频网 | 久久久99精品免费观看乱色 | 狠狠操电影网 | 亚州激情视频 | 国产精品不卡视频 | 在线免费av网 | 日日色综合| 1024在线看片 | 亚洲 欧洲av | 欧美了一区在线观看 | 久久久久国产免费免费 | 成人黄色一级视频 | 日韩av一区二区在线播放 | 精品久久久久久久久久国产 | 久久久91精品国产 | 国产香蕉久久 | 国产香蕉97碰碰碰视频在线观看 | 欧美性久久久久久 | 色婷婷播放 | 亚洲黄色片在线 | 狠狠躁天天躁 | a级片韩国 | 国产精品一区二区av麻豆 | 日韩在线观看av | 91aaa在线观看| 在线观看片 | 亚洲免费在线看 | 欧美日韩国产免费视频 | 91亚洲在线观看 | 91成人免费在线 | 亚洲在线视频观看 | 毛片3| 成人三级视频 | 在线电影 一区 | 天天爱天天舔 | 国产免费久久久久 | 国产免费黄色 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 中文字幕第一 | 黄色成人免费电影 | 国产一区二区免费 | 久久精品视频观看 | 毛片一级免费一级 | 免费观看www7722午夜电影 | a视频在线观看 | 久久久网址 | 中文字幕色播 | 999久久久久久久久久久 | 久久久99精品免费观看app | 在线观看韩日电影免费 | 日日夜夜免费精品 | 久久午夜电影 | 欧美少妇xxxxxx | 超碰97在线资源 | 四虎影视成人永久免费观看亚洲欧美 | 天天弄天天操 | 91成人免费在线视频 | 久久国语露脸国产精品电影 | 伊人电影在线观看 | 国产免费观看视频 | 色婷婷成人网 | 麻豆免费在线播放 | 有没有在线观看av | 久久成人毛片 | 在线免费观看视频一区 | 人人插人人 | 韩国一区视频 | 亚洲精品美女久久 | 99视频精品在线 | 97在线公开视频 | 99视频精品免费视频 | 97精品超碰一区二区三区 | 免费亚洲视频 | 射射色 | 国产另类xxxxhd高清 | 四虎在线永久免费观看 | 国产亚洲精品久久久久动 | 人人澡人人模 | 欧美精品久久久久久 | av免费在线网站 | 国产亚洲视频在线观看 | 成人在线视频论坛 | 久久婷婷国产色一区二区三区 | 91av视频在线观看免费 | 午夜精品一区二区国产 | 狠狠狠色丁香综合久久天下网 | 亚洲资源在线观看 | 在线免费视 | 五月婷婷在线播放 | 久久久久高清 | 黄色一级在线免费观看 | 国产一二三精品 | 在线 影视 一区 | 日韩在线观看的 | 国产亚洲一区二区三区 | 国产成人黄色 | 97人人模人人爽人人少妇 | 欧美日韩在线免费视频 | 国产精品久久久一区二区 | 欧美一二三在线 | 国产一区二区电影在线观看 | 9在线观看免费高清完整版在线观看明 | 久久精品直播 | 超碰在线9| 欧美日韩国产在线观看 | 国产精品免费久久 | 久久专区| 人人dvd | 国产在线观看a | 麻豆网站免费观看 | 中文字幕一区2区3区 | 在线观看日韩专区 | 91欧美精品 | 国产在线无 | 欧美久久久久久久久 | 婷婷丁香综合 | 99激情网 | 久久免费视频这里只有精品 | 亚洲天堂网在线播放 | 日韩午夜视频在线观看 | 婷婷在线视频观看 | 日韩欧美在线中文字幕 | 色国产视频 | 在线91播放 | 免费三级黄色 | 久久 国产一区 | 在线电影 一区 | 中文字幕国产一区 | 麻豆精品视频在线 | 国产精品青青 | 在线免费看黄网站 | 激情av网址| 久久免费视频7 | 日本亚洲国产 | 99精品免费| 狠狠色丁香婷婷综合橹88 | 久久婷婷色 | 91看片在线免费观看 | 网址你懂的在线观看 | 久久久久福利视频 | 91麻豆精品国产午夜天堂 | 久久久久国产精品免费网站 | 免费观看全黄做爰大片国产 | 少妇高潮冒白浆 | 久久国际影院 | 久久字幕网 | 人人射av | 91精品国产综合久久婷婷香蕉 | 4438全国亚洲精品在线观看视频 | 国产美女精品视频 | 天天干天天操人体 | 精品超碰| 中文字幕 二区 | 黄色的网站免费看 | 麻豆视频免费在线播放 | 91色吧| 一区二区三区在线免费播放 | 欧美日韩国产一区二区三区 | 日韩电影在线观看一区 | www在线免费观看 | 日韩欧美视频在线免费观看 | 丁香视频| 久久天天躁夜夜躁狠狠躁2022 | 日本公妇色中文字幕 | 91麻豆精品 | av中文字幕在线免费观看 | 久久久精品网 | 天天伊人网 | 国产高清视频免费在线观看 | 精品久久影院 | 国产一区 在线播放 | 天天视频色 | 国产在线精品福利 | 中文字幕一区二区三区在线播放 | 国产成人精品在线 | 日日天天狠狠 | 久久久久区 | 天天躁日日躁狠狠 | 在线亚洲成人 | 国产91学生粉嫩喷水 | 亚洲视频一区二区三区在线观看 | 五月婷婷影视 | 久久久国产精品成人免费 | 久久久久中文 | 中文字幕亚洲国产 | 三日本三级少妇三级99 | 国产美女在线精品免费观看 | 亚洲特级毛片 | 国产精品亚 | 中文字幕制服丝袜av久久 | 日韩网站在线免费观看 | 久久精品中文字幕免费mv | 99热国产在线观看 | 亚洲区视频在线 | 国产在线a视频 | 91一区啪爱嗯打偷拍欧美 | 成人黄色av免费在线观看 | 中国美女一级看片 | 91香蕉亚洲精品 | 久久精品这里热有精品 | 久久久精品99 | 91精品老司机久久一区啪 | 国产精品综合在线观看 | 国产精品久久久久久模特 | 国产小视频在线观看免费 | 久久精品99久久久久久 | 亚洲www天堂com | 日本在线观看一区 | 久久精品一区二区三区中文字幕 | 天天曰视频 | 亚州精品在线视频 | a在线视频v视频 | 国产成人福利在线观看 | 爱情影院aqdy鲁丝片二区 | 91精品久久久久久综合乱菊 | 天天看天天操 | 精品1区2区 | 西西www4444大胆在线 | 精品一二三区视频 | 国产精品中文久久久久久久 | 在线 日韩 av | a色网站 | 日韩区欠美精品av视频 | 国产视频中文字幕 | 玖玖玖国产精品 | 久久伊99综合婷婷久久伊 | 亚洲黄网站 |