欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

caffe的python接口之手寫數(shù)字識別mnist實例

 更新時間:2022年06月29日 12:25:48   作者:denny402  
這篇文章主要為大家介紹了caffe的python接口之手寫數(shù)字識別mnist實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

深度學習的第一個實例一般都是mnist,只要這個例子完全弄懂了,其它的就是舉一反三的事了。由于篇幅原因,本文不具體介紹配置文件里面每個參數(shù)的具體函義,如果想弄明白的,請參看我以前的博文:

數(shù)據(jù)層及參數(shù)

視覺層及參數(shù)

solver配置文件及參數(shù)

一、數(shù)據(jù)準備

官網(wǎng)提供的mnist數(shù)據(jù)并不是圖片,但我們以后做的實際項目可能是圖片。因此有些人并不知道該怎么辦。在此我將mnist數(shù)據(jù)進行了轉化,變成了一張張的圖片,我們練習就從圖片開始。mnist圖片數(shù)據(jù)我放在了百度云盤。

mnist圖片數(shù)據(jù)點擊下載

數(shù)據(jù)分成了訓練集(60000張共10類)和測試集(共10000張10類),每個類別放在一個單獨的文件夾里。并且將所有的圖片,都生成了txt列表清單(train.txt和test.txt)。大家下載下來后,直接解壓到當前用戶根目錄下就可以了。由于我是在windows下壓縮的,因此是winrar文件。如果大家要在linux下解壓縮,需要安裝rar的linux版本,也是十分簡單

sudo apt-get install rar

二、導入caffe庫,并設定文件路徑

我是將mnist直接放在根目錄下的,所以代碼如下:

# -*- coding: utf-8 -*-
import caffe
from caffe import layers as L,params as P,proto,to_proto
#設定文件的保存路徑
root='/home/xxx/'                           #根目錄
train_list=root+'mnist/train/train.txt'     #訓練圖片列表
test_list=root+'mnist/test/test.txt'        #測試圖片列表
train_proto=root+'mnist/train.prototxt'     #訓練配置文件
test_proto=root+'mnist/test.prototxt'       #測試配置文件
solver_proto=root+'mnist/solver.prototxt'   #參數(shù)文件

其中train.txt 和test.txt文件已經有了,其它三個文件,我們需要自己編寫。

此處注意:一般caffe程序都是先將圖片轉換成lmdb文件,但這樣做有點麻煩。因此我就不轉換了,我直接用原始圖片進行操作,所不同的就是直接用圖片操作,均值很難計算,因此可以不減均值。

二、生成配置文件

配置文件實際上就是一些txt文檔,只是后綴名是prototxt,我們可以直接到編輯器里編寫,也可以用代碼生成。此處,我用python來生成。

#編寫一個函數(shù),生成配置文件prototxt
def Lenet(img_list,batch_size,include_acc=False):
    #第一層,數(shù)據(jù)輸入層,以ImageData格式輸入
    data, label = L.ImageData(source=img_list, batch_size=batch_size, ntop=2,root_folder=root,
        transform_param=dict(scale= 0.00390625))
    #第二層:卷積層
    conv1=L.Convolution(data, kernel_size=5, stride=1,num_output=20, pad=0,weight_filler=dict(type='xavier'))
    #池化層
    pool1=L.Pooling(conv1, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    #卷積層
    conv2=L.Convolution(pool1, kernel_size=5, stride=1,num_output=50, pad=0,weight_filler=dict(type='xavier'))
    #池化層
    pool2=L.Pooling(conv2, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    #全連接層
    fc3=L.InnerProduct(pool2, num_output=500,weight_filler=dict(type='xavier'))
    #激活函數(shù)層
    relu3=L.ReLU(fc3, in_place=True)
    #全連接層
    fc4 = L.InnerProduct(relu3, num_output=10,weight_filler=dict(type='xavier'))
    #softmax層
    loss = L.SoftmaxWithLoss(fc4, label)
    if include_acc:             # test階段需要有accuracy層
        acc = L.Accuracy(fc4, label)
        return to_proto(loss, acc)
    else:
        return to_proto(loss)
def write_net():
    #寫入train.prototxt
    with open(train_proto, 'w') as f:
        f.write(str(Lenet(train_list,batch_size=64)))
    #寫入test.prototxt    
    with open(test_proto, 'w') as f:
        f.write(str(Lenet(test_list,batch_size=100, include_acc=True)))

配置文件里面存放的,就是我們所說的network。我這里生成的network,可能和原始的Lenet不太一樣,不過影響不大。

三、生成參數(shù)文件solver

同樣,可以在編輯器里面直接書寫,也可以用代碼生成。

#編寫一個函數(shù),生成參數(shù)文件
def gen_solver(solver_file,train_net,test_net):
    s=proto.caffe_pb2.SolverParameter()
    s.train_net =train_net
    s.test_net.append(test_net)
    s.test_interval = 938    #60000/64,測試間隔參數(shù):訓練完一次所有的圖片,進行一次測試  
    s.test_iter.append(100)  #10000/100 測試迭代次數(shù),需要迭代100次,才完成一次所有數(shù)據(jù)的測試
    s.max_iter = 9380       #10 epochs , 938*10,最大訓練次數(shù)
    s.base_lr = 0.01    #基礎學習率
    s.momentum = 0.9    #動量
    s.weight_decay = 5e-4  #權值衰減項
    s.lr_policy = 'step'   #學習率變化規(guī)則
    s.stepsize=3000         #學習率變化頻率
    s.gamma = 0.1          #學習率變化指數(shù)
    s.display = 20         #屏幕顯示間隔
    s.snapshot = 938       #保存caffemodel的間隔
    s.snapshot_prefix =root+'mnist/lenet'   #caffemodel前綴
    s.type ='SGD'         #優(yōu)化算法
    s.solver_mode = proto.caffe_pb2.SolverParameter.GPU    #加速
    #寫入solver.prototxt
    with open(solver_file, 'w') as f:
        f.write(str(s))

四、開始訓練模型

訓練過程中,也在不停的測試。

#開始訓練
def training(solver_proto):
    caffe.set_device(0)
    caffe.set_mode_gpu()
    solver = caffe.SGDSolver(solver_proto)
    solver.solve()

最后,調用以上的函數(shù)就可以了。

if __name__ == '__main__':
    write_net()
    gen_solver(solver_proto,train_proto,test_proto) 
    training(solver_proto)

五、完成的python文件

mnist.py

# -*- coding: utf-8 -*-
import caffe
from caffe import layers as L,params as P,proto,to_proto
#設定文件的保存路徑
root='/home/xxx/'                           #根目錄
train_list=root+'mnist/train/train.txt'     #訓練圖片列表
test_list=root+'mnist/test/test.txt'        #測試圖片列表
train_proto=root+'mnist/train.prototxt'     #訓練配置文件
test_proto=root+'mnist/test.prototxt'       #測試配置文件
solver_proto=root+'mnist/solver.prototxt'   #參數(shù)文件
#編寫一個函數(shù),生成配置文件prototxt
def Lenet(img_list,batch_size,include_acc=False):
    #第一層,數(shù)據(jù)輸入層,以ImageData格式輸入
    data, label = L.ImageData(source=img_list, batch_size=batch_size, ntop=2,root_folder=root,
        transform_param=dict(scale= 0.00390625))
    #第二層:卷積層
    conv1=L.Convolution(data, kernel_size=5, stride=1,num_output=20, pad=0,weight_filler=dict(type='xavier'))
    #池化層
    pool1=L.Pooling(conv1, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    #卷積層
    conv2=L.Convolution(pool1, kernel_size=5, stride=1,num_output=50, pad=0,weight_filler=dict(type='xavier'))
    #池化層
    pool2=L.Pooling(conv2, pool=P.Pooling.MAX, kernel_size=2, stride=2)
    #全連接層
    fc3=L.InnerProduct(pool2, num_output=500,weight_filler=dict(type='xavier'))
    #激活函數(shù)層
    relu3=L.ReLU(fc3, in_place=True)
    #全連接層
    fc4 = L.InnerProduct(relu3, num_output=10,weight_filler=dict(type='xavier'))
    #softmax層
    loss = L.SoftmaxWithLoss(fc4, label)
    if include_acc:             # test階段需要有accuracy層
        acc = L.Accuracy(fc4, label)
        return to_proto(loss, acc)
    else:
        return to_proto(loss)
def write_net():
    #寫入train.prototxt
    with open(train_proto, 'w') as f:
        f.write(str(Lenet(train_list,batch_size=64)))
    #寫入test.prototxt    
    with open(test_proto, 'w') as f:
        f.write(str(Lenet(test_list,batch_size=100, include_acc=True)))
#編寫一個函數(shù),生成參數(shù)文件
def gen_solver(solver_file,train_net,test_net):
    s=proto.caffe_pb2.SolverParameter()
    s.train_net =train_net
    s.test_net.append(test_net)
    s.test_interval = 938    #60000/64,測試間隔參數(shù):訓練完一次所有的圖片,進行一次測試  
    s.test_iter.append(500)  #50000/100 測試迭代次數(shù),需要迭代500次,才完成一次所有數(shù)據(jù)的測試
    s.max_iter = 9380       #10 epochs , 938*10,最大訓練次數(shù)
    s.base_lr = 0.01    #基礎學習率
    s.momentum = 0.9    #動量
    s.weight_decay = 5e-4  #權值衰減項
    s.lr_policy = 'step'   #學習率變化規(guī)則
    s.stepsize=3000         #學習率變化頻率
    s.gamma = 0.1          #學習率變化指數(shù)
    s.display = 20         #屏幕顯示間隔
    s.snapshot = 938       #保存caffemodel的間隔
    s.snapshot_prefix = root+'mnist/lenet'   #caffemodel前綴
    s.type ='SGD'         #優(yōu)化算法
    s.solver_mode = proto.caffe_pb2.SolverParameter.GPU    #加速
    #寫入solver.prototxt
    with open(solver_file, 'w') as f:
        f.write(str(s))
#開始訓練
def training(solver_proto):
    caffe.set_device(0)
    caffe.set_mode_gpu()
    solver = caffe.SGDSolver(solver_proto)
    solver.solve()
#
if __name__ == '__main__':
    write_net()
    gen_solver(solver_proto,train_proto,test_proto) 
    training(solver_proto)

我將此文件放在根目錄下的mnist文件夾下,因此可用以下代碼執(zhí)行

sudo python mnist/mnist.py

在訓練過程中,會保存一些caffemodel。多久保存一次,保存多少次,都可以在solver參數(shù)文件里進行設置。

我設置為訓練10 epoch,9000多次,測試精度可以達到99%

以上就是caffe的python接口之手寫數(shù)字識別mnist實例的詳細內容,更多關于caffe python手寫數(shù)字識別mnist的資料請關注腳本之家其它相關文章!

相關文章

  • PyQt5內嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例

    PyQt5內嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例

    今天小編就為大家分享一篇關于PyQt5內嵌瀏覽器注入JavaScript腳本實現(xiàn)自動化操作的代碼實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python分數(shù)實例用法

    python分數(shù)實例用法

    在本篇文章里小編給大家整理的是一篇關于python分數(shù)實例用法的相關內容,有興趣的朋友們可以學習下。
    2021-04-04
  • python中re.findall函數(shù)實例用法

    python中re.findall函數(shù)實例用法

    在本篇文章里小編給大家整理了一篇關于python中re.findall函數(shù)實例用法相關內容,有興趣的朋友們可以學習下。
    2021-09-09
  • python模擬實現(xiàn)斗地主發(fā)牌

    python模擬實現(xiàn)斗地主發(fā)牌

    這篇文章主要為大家詳細介紹了python代碼模擬實現(xiàn)斗地主發(fā)牌,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • Python格式化輸出之format用法詳解

    Python格式化輸出之format用法詳解

    Python中格式化字符串目前有兩種陣營:%和format,這篇文章主要給大家介紹了關于Python格式化輸出之format用法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Python中bytes和str的區(qū)別與聯(lián)系詳解

    Python中bytes和str的區(qū)別與聯(lián)系詳解

    Python3最重要的新特性之一是對字符串和二進制數(shù)據(jù)流做了明確的區(qū),下面這篇文章主要給大家介紹了關于Python中bytes和str區(qū)別與聯(lián)系的相關資料,需要的朋友可以參考下
    2022-05-05
  • Python制作春聯(lián)的示例代碼

    Python制作春聯(lián)的示例代碼

    春聯(lián)是中國傳統(tǒng)文化中最具內涵的元素之一,它以對仗工整、簡潔精巧的文字描繪美好形象,抒發(fā)美好愿望,是中國特有的文學形式,是華人們過年的重要習俗。本文將通過Python制作春聯(lián),需要的可以參考一下
    2022-01-01
  • Django視圖、傳參和forms驗證操作

    Django視圖、傳參和forms驗證操作

    這篇文章主要介紹了Django視圖、傳參和forms驗證操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python編程pygame模塊實現(xiàn)移動的小車示例代碼

    Python編程pygame模塊實現(xiàn)移動的小車示例代碼

    這篇文章主要介紹了Python編程pygame模塊實現(xiàn)移動的小車示例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python實現(xiàn)爬蟲爬取NBA數(shù)據(jù)功能示例

    Python實現(xiàn)爬蟲爬取NBA數(shù)據(jù)功能示例

    這篇文章主要介紹了Python實現(xiàn)爬蟲爬取NBA數(shù)據(jù)功能,涉及Python針對URL模塊、字符串、列表遍歷、Excel寫入等相關操作技巧,需要的朋友可以參考下
    2018-05-05

最新評論