以前咱們在使用cnn作圖片分類的時候使用了CIFAR-10數據集html
其餘框架對於CIFAR-10的圖片分類是怎麼作的
來與TensorFlow作對比。python
Caffe Kerasc++
安裝
官方安裝文檔:git
https://github.com/IraAI/caffe-gpu-installationgithub
https://github.com/BVLC/caffe/tree/windows算法
windows下安裝gpu加速版的caffewindows
mark後端
使用的數據集依然是CIFAR-10,使用的也依然是卷積神經網絡。查看有什麼不一樣點和相同點。bash
十種分類。網絡
準備數據
把圖片轉成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
卷積神經網絡作圖像風格變化。 人臉識別。