之前我們在使用cnn做圖片分類的時候使用了CIFAR-10數據集
其他框架對於CIFAR-10的圖片分類是怎么做的
來與TensorFlow做對比。
Caffe Keras
安裝
官方安裝文檔:
https://github.com/IraAI/caffe-gpu-installation
https://github.com/BVLC/caffe/tree/windows
windows下安裝gpu加速版的caffe

mark
使用的數據集依然是CIFAR-10,使用的也依然是卷積神經網絡。查看有什么不同點和相同點。
十種分類。
准備數據
把圖片轉成leveldb格式,對圖片做均值。

mark
里面是一個官方給出來的例子,如何使用caffe 對cifar10做分類。
caffe-master/examples/cifar10/create_cifar10.sh
是一個bash腳本: 作用是轉換cifar數據到 into leveldb format.
定義了兩個目錄變量和數據類型
EXAMPLE=examples/cifar10 DATA=data/cifar10 DBTYPE=lmdb
刪除指定目錄下的文件
echo "Creating $DBTYPE..."rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE
調用了convert_cifar_data.bin 二進制文件。 指定參數,就可以下載,解壓,格式化。
計算圖片的均值。compute_image_mean 輸入參數 backend: 數據類型。
計算均值,保存到mean.binaryproto文件中
-
將數據轉換為lmdb格式,保存到磁盤中。
-
計算image文件的均值。保存。
這里用到的兩個命令是c++編寫的,也可以閱讀源代碼變成python腳本。
網上也有這個數據腳本的python實現代碼
http://research.beenfrog.com/code/2015/05/04/write-leveldb-lmdb-using-python.html
就是根據c++代碼改寫的。這兩個數據格式都是鍵值對的格式。
訓練模型
caffe-master/examples/cifar10/train_quick.sh
#!/usr/bin/env shset -e TOOLS=./build/tools
定義一個存放的目錄
調用tools目錄下的caffe 主程序。
$TOOLS/caffe train \ --solver=examples/cifar10/cifar10_quick_solver.prototxt $@
第一個參數指定訓練,第二個參數指定模型
cifar10_quick_solver.prototxt
超參數和模型的結構定義與描述。
# The train/test net protocol buffer definitionnet: "examples/cifar10/cifar10_quick_train_test.prototxt"
網絡結構:
caffe-master/examples/cifar10/cifar10_quick_train_test.prototxt
我們在使用TensorFlow時是使用python腳本定義的網絡結構。有多少層什么的。
caffe使用一個描述文件來描述。
第二次的時候從第一次的模型快照處繼續運行。
# reduce learning rate by factor of 10 after 8 epochs$TOOLS/caffe train \ --solver=examples/cifar10/cifar10_quick_solver_lr1.prototxt \ --snapshot=examples/cifar10/cifar10_quick_iter_4000.solverstate $@
兩次的變化只是學習率不同。
模型的描述文件

mark
-
訓練參數,初始化參數: 網絡描述
caffe中有方法可以將模型的描述文件打印成圖表
caffe-master/examples/cifar10/cifar10_quick_train_test.prototxt
http://ethereon.github.io/netscope/#/editor

mark
第一層是數據層。卷積層 池層 卷積層 池層 全連接 激勵函數。 softmax
本地版本:
https://graphviz.gitlab.io/_pages/Download/Download_windows.html# 下載Graphvizpip install pydot
python draw_net.py C:\Users\mtian\PycharmProjects\NeuralNetworksGetStarted\caffe-master\examples\cifar10\cifar10_quick_train_test.prototxt ./cifar.png
運行的畫圖py文件,位於caffe python下。
三個參數: 1. 網絡模型的ProtoTXT文件 2. 保存的圖片路徑 3. 從左到右。
–rankdir=x , x 有四種選項,分別是LR, RL, TB, BT 。
畫圖報錯:
Traceback (most recent call last): File "draw_net.py", line 9, in <module> import caffe.draw File "C:\software\caffe\python\caffe\draw.py", line 31, in <module> pydot_find_graphviz = pydot.graphviz.find_graphviz AttributeError: module 'pydot_ng' has no attribute 'graphviz'
查看這個文件可以看到里面寫着解決方案
pip install pydot-plustry: # Try to load pydotplus import pydotplus as pydot
給這個描述文件起一個名字
name: "CIFAR10_quick"
定義每一層,名字,類型,top有兩個一個是data 一個是label。數據層的top有兩個
layer {
name: "cifar"
type: "Data"
top: "data"
top: "label"

mark
訓練階段調用這一層
include { phase: TRAIN
}
圖片的均值文件所放的路徑。
transform_param { mean_file: "examples/cifar10/mean.binaryproto"
}
圖片的訓練數據路徑,batchsize的大小。訓練數據存儲的方式
data_param { source: "examples/cifar10/cifar10_train_lmdb"
batch_size: 100
backend: LMDB
}
接下來又定義了一層
layer {
name: "cifar"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mean_file: "examples/cifar10/mean.binaryproto"
}
data_param {
source: "examples/cifar10/cifar10_test_lmdb"
batch_size: 100
backend: LMDB
}
}
跟上一層一模一樣,只不過指定了階段是TEST
測試集入口和訓練集入口
卷積層
layer { name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
} param { lr_mult: 2
} convolution_param { num_output: 32
pad: 2
kernel_size: 5
stride: 1
weight_filler {
type: "gaussian"
std: 0.0001
} bias_filler { type: "constant"
}
}
}
起個名字,類型卷積層。bottom是data也就是上一層的名字。上一層的top對應下一層的bottom
top是conv1

mark
指定了一下w和b的學習率。以及卷積層的相關參數
-
總共有多少個output的feature map
-
padding 過濾器大小 步長
-
w的初始化方式: 高斯 方差
-
b的初始化方式: 類型
池層
layer { name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
類型池層。 bottom是conv1 top是pool1

mark
池層的參數: 取最大值的pool(或均值)
池層出來的結果過relu 激勵函數。它的bottom和top是一個

mark
把數據過完relu之后又返回pool1.
定義第二個卷積層。relu層。池層。 卷積層。 全連接層
計算test上的准確率,計算loss值。使用的類型softmax

mark
caffe的官方網站上就介紹了這些data loss
數據layers 卷積層。可以看到input output
http://caffe.berkeleyvision.org/tutorial/
給你一個sample如何定義一個卷積。每個參數的意思。
Solver 定義你所使用的優化方式。
Loss 定義損失。
keras是怎樣做的
keras比theano 或者TensorFlow寫代碼簡潔很多。
中文文檔:
https://keras-cn.readthedocs.io/en/latest/
上手keras。源代碼工程中。
7-3 keras-master/examples/cifar10_cnn.py
引入一些我們工程需要的包
from __future__ import print_functionimport kerasfrom keras.datasets import cifar10from keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Conv2D, MaxPooling2Dimport os
batch_size = 32num_classes = 10epochs = 100data_augmentation = Truenum_predictions = 20save_dir = os.path.join(os.getcwd(), 'saved_models') model_name = 'keras_cifar10_trained_model.h5'
定義網絡訓練所需要的超參數
# The data, split between train and test sets:(x_train, y_train), (x_test, y_test) = cifar10.load_data()
讀取數據分為訓練數據,測試數據。
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
我們要把網絡結構層加入到sequential中
官方文檔中有激勵函數的說明。Flatten展開成1維的。
過最后一個全連接層的時候,總共有10類。
keras是一個高層次的封裝。簡單的網絡結構。
# initiate RMSprop optimizeropt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
告訴我們的模型使用的是什么損失函數
# Let's train the model using RMSpropmodel.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
模型訓練fit,以前我們是訓練多少輪,每輪里面有多少個batch
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test), shuffle=True)
注明驗證數據集是什么。是否需要打亂。
keras是基於theano和TensorFlow之上的。
更改后端。廈門叉車價格是多少
keras代碼簡潔。caffe使用文件配置模型描述。

mark
課程總結
神經元 激勵函數 神經網絡 神經網絡中的梯度下降 前向傳播 反向更新
隨機梯度下降 簡單版本神經網絡
提高神經網絡的學習效率: 並行計算 梯度消失問題 歸一化
參數初始化 正則化 學習率 Dropout 交叉熵
簡單版本的前饋神經網絡 增加代碼提高學習效率
卷積神經網絡 全連接神經網絡對比 卷積核 卷積層(參數)
池化層(池化層參數) 典型的卷積神經網絡 如何使用卷積神經網絡做圖片識別
softmax層 theano實現卷積神經網絡
TensorFlow框架 線性回歸 TensorBoard
手寫數字識別 圖片分類(cnn) 單gpu 多gpu
其他兩個框架與TensorFlow對比。caffe keras
神經網絡的算法和原理有初步的了解。
rnn神經網絡原理 與 應用 游戲ai
卷積神經網絡做圖像風格變化。 人臉識別。
