ubuntu16.04caffe训练mnist数据集
??搭好了環境,下面就該訓練模型了呀!實踐才是真理的唯一標準!大多數情況下,新接觸caffe的小白們第一個訓練的模型一定是Mnist數據集吧。這篇文章就以mnist數據集為例介紹下如何訓練模型吧!(訓練模型,想想就激動~)
??先來簡單的介紹一下mnist數據集,mnist數據集屬于分類的數據集。里面包含了從0-9十個類別。mnist數據集中共包含70000張圖片,其中60000張是訓練集,10000張是測試集。訓練集和測試集對于熟悉深度學習的人肯定不陌生吧!這是我們模型訓練的基礎。70000張圖片大小是28x28x1。
??說完了mnist數據集,那它哪里來呢?又要怎么用呢?還有和模型訓練有啥關系呢?(問題三連,但是不怕)下面讓我來一一解答!
1. mnist數據集的下載
??因為mnist數據集的訓練屬于caffe中最最基礎的訓練模型。caffe中自帶了下載mnist數據集的文件:get_mnist.sh(該文件在caffe目錄下,具體的位置可以自己去翻翻,順便加深下對文件的了解)
??進入caffe目錄下,執行:
sudo sh get_mnist.sh??等待一段時間,就會發現train-images-idx3-ubyte、train-labels-idx1-ubyte、t10k-images-idx3-ubyte、t10k-labels-idx1-ubyte這四個文件出現在了我們的文件夾中。分別對應的訓練集、訓練集標簽、測試集、測試集標簽。
??至此為止,mnist數據集就下載完成了!
2. mnist數據集的格式轉化
??在caffe中所有模型輸入的圖片數據不能是.jpg/.png/.bmp。而必須是lmdb格式。所以需要將剛才下好的數據集進行轉化。轉化的文件也有了:create_mnist.sh(同樣也是自帶的)
??進入caffe目錄,執行:
??執行過后,需要等待一段時間。在caffe/examples/minst中會出現名為minst_test_lmdb和minst_train_lmdb兩個文件夾。分別存放測試集和訓練集的lmdb格式的數據。
??現在,有關數據已經全部準備好了,下面該到訓練模型了!
3. 訓練模型
??在caffe中,訓練模型需要準備兩個文件:一個是模型文件,簡稱為model.prototxt(prototxt是caffe下文本文件的后綴)。另一個是參數文件,簡稱為solver.prototxt。solver文件格式都差不多,但model文件大小取決于使用的模型(lenet網絡中7層,但完整版的resnet卻有100多層)。
??對于兩個文件,還是要著重介紹下(里面有的參數需要修改!)
??solver文件全文如下(所有模型solver文件格式都一樣,所以務必弄清每一個超參數的含義):
# net里面寫模型的位置,在一個文件夾下可寫相對路徑 net:"examples/mnist/lenet_train_test.prototxt"# test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images.#測試集迭代100次:共10000/100=100,每次100個樣本 test_iter: 100# Carry out testing every 500 training iterations. #每訓練500次迭代,進行一次測試 test_interval: 500# The base learning rate, momentum and the weight decay of the network. base_lr: 0.01#沖量,在SGD優化器中可以達到避免震蕩的作用 momentum: 0.9#權值衰弱常數,防止過擬合。在訓練期間,將正則化項添加到網絡的損失中以計算后向梯度。 weight_decay值確定該正則化項在梯度計算中的優勢 weight_decay: 0.0005# The learning rate policy #學習率計算的方法,共有七種,根據base_lr和learning_rate_lr計算。inv計算公式是 base_lr * (1 + gamma * iter) ^ (- power)所以之后兩個參數是gamma和power lr_policy: "inv"gamma: 0.0001power: 0.75#每100次迭代在終端中顯示一次xxx # Display every 100 iterations display: 100# The maximum number of iterations max_iter: 10000# snapshot intermediate results #snapshot用來保存模型,每經過指定次數會形成一個模型,以后再訓練時可在其基礎上訓練 snapshot: 5000#這是caffemodel保存的位置,記得一定要寫 snapshot_prefix:"examples/mnist/lenet"# solver mode: CPU or GPU,自己的CPU/GPU選個適合自己的 solver_mode: CPU??在mnist數據集模型訓練中使用的是Lenet模型,下面簡單的介紹一下lenet模型(其實我也不是特別懂~)
??Lenet共七層結構(輸出層不算的)
??分別是:輸入層→卷積層→池化層→卷積層→池化層→全連接層->全連接層->輸出層。不多說,上圖:
??總的來說,lenet屬于比較簡單的深度神經網絡.但因為mnist數據集比較小,所有使用Lenet已經可以達到較高精度。后面博客會介紹cifar10,那個數據集更復雜。也就會使用更復雜的模型。
??模型文件叫做lenet_train_test.prototx。下面是部分內容:
layer { name: "mnist" type: "Data" top:"data" top:"label" include {phase: TRAIN } transform_param {scale: 0.00390625 } data_param {source: "examples/mnist/mnist_train_lmdb"batch_size:64backend: LMDB } }layer { name: "mnist" type: "Data" top:"data" top:"label" include {phase: TEST } transform_param {scale: 0.00390625 } data_param {source: "examples/mnist/mnist_test_lmdb"batch_size: 100backend: LMDB } }??這是數據層(Layer),對于layer的知識屬于caffe的基本知識,可以去找相關書籍了解。本文不在此贅述。這個需要改動兩個地方:是兩個Layer的source的文件來源,要改成之前生成的lmdb文件的位置。注意對應好測試集和訓練集!
??文件已經準備好了,下面要正式開始模型的訓練啦。訓練的腳本已經準備好了,就是train_lenet.sh(可以自己去找找位置,應該mnist文件夾下面)進入指定文件夾,終端輸入:
??就可以正式進入訓練了,訓練之后的數據會存在caffe/examples/minst/lenet_iter_5000.caffemodel
caffe/examples/minst/lenet_iter_10000.caffemodel。兩個文件中分別是迭代5000次和10000次形成的caffe模型
??如果是CPU版本,訓練時間在10多分鐘。GPU版本不到一分鐘就搞定了(由此可見,沒有GPU深度學習真的是難玩,后面更恐怖!)
4.模型測試
??之前完成的只是數據集的訓練,還要講數據集進行測試,測試指令是:
./build/tools/caffe.bin test -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel??注意下,在caffe安裝的過程中已經將caffe目錄下所有文件都進行編譯。形成了build文件,如果不行的話記得在caffe目錄下
make cleanm make all -j4??對測試命令進行操作前面要加上sudo,否則會出現以下錯誤:
F0510 07:23:36.745424 5125 db_lmdb.hpp:15] Check failed: mdb_status
== 0 (13 vs. 0) Permission denied
*** Check failure stack trace: ***
@ 0x7f4fe1ca65cd google::LogMessage::Fail()
@ 0x7f4fe1ca8433 google::LogMessage::SendToLog()
@ 0x7f4fe1ca615b google::LogMessage::Flush()
@ 0x7f4fe1ca8e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f4fe20862f8 caffe::db::LMDB::Open()
@ 0x7f4fe20c5e2f caffe::DataLayer<>::DataLayer()
@ 0x7f4fe20c5fc2 caffe::Creator_DataLayer<>()
@ 0x7f4fe2046160 caffe::Net<>::Init()
@ 0x7f4fe20493e0 caffe::Net<>::Net()
@ 0x408ca4 test()
@ 0x406fa0 main
@ 0x7f4fe0c16830 __libc_start_main
@ 0x4077c9 _start
@ (nil) (unknown)
已放棄 (核心已轉儲)
-----------------------------------分割線-------------------------
??測試時間較訓練時間較短,只有幾秒,運行一次迭代,accuracy = 0.9868,loss = 0.042179
??看到精度是不是很激動!但這只是模型的建立,我們真正想要的是測試自己拿來的隨便一張圖片。但這個過程需要對圖片進行二值化,還需要寫deploy文件。后面再慢慢說吧!現在享受喜悅吧~
附加內容:
??1.minst數據集各個文件功能講解,可參考這位博主的博客:https://blog.csdn.net/bhniunan/article/details/104357291link
??2.在solver文件中的超參數由自己選擇的優化器決定,不同優化器需要不同的參數。另外lr_policy對于不同模型也是不同的。??lenet_solver_adam/lenet_solver_rmsprop分別代表不同的優化器。(特點是種類在solver的后面)
??優化方法如圖:
??minst_autoencoder.prototxt中autoencoder的作用是用于降維,有點類似PCA(主成分分析)。選取重要因素,減少噪聲。具體計算方法可參考博客:https://blog.csdn.net/omnispace/article/details/78364582link
??mnist_autoencoder_solver_adadelta和mnist_autoencoder_solver_adagrad和mnist_autoencoder_solver_nesterov是使用三種不同優化器的mnist_autoencoder_solver區別只在于種類(type)不一樣和個別lr_policy不一樣。和以上兩種優化器正好不一樣。(猜想使用方法不同)前兩種是Lenet的后三種是minst的。
由于本篇文章作者水平有限。如有錯誤之處,請務必再下方評論區指正,謝謝!
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的ubuntu16.04caffe训练mnist数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看Linux内核版本、系统版本命令
- 下一篇: centos下 Tcpreplay 重放