深度學習之神經網絡核心原理與算法-caffe&keras框架圖片分類

以前咱們在使用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

mark後端

使用的數據集依然是CIFAR-10,使用的也依然是卷積神經網絡。查看有什麼不一樣點和相同點。bash

十種分類。網絡

準備數據

把圖片轉成leveldb格式,對圖片作均值。

mark

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

mark

  • 訓練參數,初始化參數: 網絡描述

caffe中有方法能夠將模型的描述文件打印成圖表

caffe-master/examples/cifar10/cifar10_quick_train_test.prototxt

http://ethereon.github.io/netscope/#/editor

mark

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

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

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

mark

池層的參數: 取最大值的pool(或均值)

池層出來的結果過relu 激勵函數。它的bottom和top是一個

mark

mark

把數據過完relu以後又返回pool1.

定義第二個卷積層。relu層。池層。 卷積層。 全鏈接層

計算test上的準確率,計算loss值。使用的類型softmax

mark

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

mark

課程總結

神經元 激勵函數 神經網絡 神經網絡中的梯度降低 前向傳播 反向更新

隨機梯度降低 簡單版本神經網絡

提升神經網絡的學習效率: 並行計算 梯度消失問題 歸一化

參數初始化 正則化 學習率 Dropout 交叉熵

簡單版本的前饋神經網絡 增長代碼提升學習效率

卷積神經網絡 全鏈接神經網絡對比 卷積核 卷積層(參數)

池化層(池化層參數) 典型的卷積神經網絡 如何使用卷積神經網絡作圖片識別

softmax層 theano實現卷積神經網絡

TensorFlow框架 線性迴歸 TensorBoard

手寫數字識別 圖片分類(cnn) 單gpu 多gpu

其餘兩個框架與TensorFlow對比。caffe keras

神經網絡的算法和原理有初步的瞭解。

rnn神經網絡原理 與 應用 遊戲ai

卷積神經網絡作圖像風格變化。 人臉識別。

相關文章
相關標籤/搜索