日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

DeepLearning tutorial(2)机器学习算法在训练过程中保存参数

發(fā)布時(shí)間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DeepLearning tutorial(2)机器学习算法在训练过程中保存参数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

FROM:?http://blog.csdn.net/u012162613/article/details/43169019

DeepLearning tutorial(2)機(jī)器學(xué)習(xí)算法在訓(xùn)練過(guò)程中保存參數(shù)


@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/43169019


參考:pickle — Python object serialization、DeepLearning Getting started


一、python讀取"***.pkl.gz"文件


用到python里的gzip以及cPickle模塊,簡(jiǎn)單的使用代碼如下,如果想詳細(xì)了解可以參考上面給出的鏈接。

[python] view plaincopy
  • #以讀取mnist.pkl.gz為例??
  • import?cPickle,?gzip??
  • f?=?gzip.open('mnist.pkl.gz',?'rb')??
  • train_set,?valid_set,?test_set?=?cPickle.load(f)??
  • f.close()??

  • 其實(shí)就是分兩步,先讀取gz文件,再讀取pkl文件。pkl文件的應(yīng)用正是下文要講的,我們用它來(lái)保存機(jī)器學(xué)習(xí)算法訓(xùn)練過(guò)程中的參數(shù)。


    二、機(jī)器學(xué)習(xí)算法在訓(xùn)練過(guò)程中如何保存參數(shù)?


    我們知道,機(jī)器學(xué)習(xí)算法的計(jì)算量特別大,跑起程序來(lái)少則幾十分鐘,多則幾小時(shí)甚至幾天,中間如果有什么狀況(比如電腦過(guò)熱重啟、程序出現(xiàn)一些小bug...)程序就會(huì)中斷,如果你沒(méi)把參數(shù)定時(shí)保存下來(lái),前面的訓(xùn)練就當(dāng)白費(fèi)了,所以很有必要在程序中加入定時(shí)保存參數(shù)的功能,這樣下次訓(xùn)練就可以將參數(shù)初始化為上次保存下來(lái)的結(jié)果,而不是從頭開(kāi)始隨機(jī)初始化。
    那么如何保存模型參數(shù)?可以將參數(shù)深復(fù)制,或者調(diào)用python的數(shù)據(jù)永久存儲(chǔ)cPickle模塊,原理不多說(shuō),直接使用就行。(注:python里有cPickle和pickle,cPickle基于c實(shí)現(xiàn),比pickle快。)

    直接用一個(gè)例子來(lái)說(shuō)明如何使用:

    [python] view plaincopy
  • a=[1,2,3]??
  • b={4:5,6:7}??
  • #保存,cPickle.dump函數(shù)。/home/wepon/ab是路徑,ab是保存的文件的名字,如果/home/wepon/下本來(lái)就有ab這個(gè)文件,將被覆寫(xiě)#,如果沒(méi)有,則創(chuàng)建。'wb'表示以二進(jìn)制可寫(xiě)的方式打開(kāi)。dump中的-1表示使用highest?protocol。??
  • import?cPickle??
  • write_file=open('/home/wepon/ab','wb')??
  • cPickle.dump(a,write_file,-1)??
  • cPickle.dump(b,write_file,-1)??
  • write_file.close()??
  • ??
  • #讀取,cPickle.load函數(shù)。??
  • read_file=open('/home/wepon/ab','rb')??
  • a_1=cPickle.load(read_file)??
  • b_1=cPickle.load(read_file)??
  • print?a,b??
  • read_file.close()??


  • 在deeplearning算法中,因?yàn)橛玫紾PU,經(jīng)常是將參數(shù)聲明為shared變量,因此必須用上get_value()、set_value,例如有w、v、u三個(gè)shared變量,使用代碼如下:

    [python] view plaincopy
  • import?cPickle??
  • #保存??
  • write_file?=?open('path',?'wb')????
  • cPickle.dump(w.get_value(borrow=True),?write_file,?-1)????
  • cPickle.dump(v.get_value(borrow=True),?write_file,?-1)????
  • cPickle.dump(u.get_value(borrow=True),?write_file,?-1)???
  • write_file.close()??
  • ??
  • #讀取??
  • read_file?=?open('path')??
  • w.set_value(cPickle.load(read_file),?borrow=True)??
  • v.set_value(cPickle.load(read_file),?borrow=True)??
  • u.set_value(cPickle.load(read_file),?borrow=True)??
  • read_file.close()??



  • 一個(gè)實(shí)例
    下面我以一個(gè)實(shí)際的例子來(lái)說(shuō)明如何在程序中加入保存參數(shù)的功能。以deeplearnig.net上的邏輯回歸為例,它的代碼地址:logistic_sgd.py。這個(gè)程序是將邏輯回歸用于MNIST分類(lèi),程序運(yùn)行過(guò)程并不會(huì)保存參數(shù),甚至運(yùn)行結(jié)束時(shí)也不保存參數(shù)。怎么做可以保存參數(shù)?
    在logistic_sgd.py代碼里最后面的sgd_optimization_mnist()函數(shù)里,有個(gè)while循環(huán),里面有一句代碼:
    [python] view plaincopy
  • if?this_validation_loss?<?best_validation_loss:??

  • 這句代碼的意思就是判斷當(dāng)前的驗(yàn)證損失是否小于最佳的驗(yàn)證損失,是的話,下面會(huì)更新best_validation_loss,也就是說(shuō)當(dāng)前參數(shù)下,模型比之前的有了優(yōu)化,因此我們可以在這個(gè)if語(yǔ)句后面加入保存參數(shù)的代碼:


    [python] view plaincopy
  • save_params(classifier.W,classifier.b)??


  • save_params函數(shù)定義如下:


    [python] view plaincopy
  • def?save_params(param1,param2):??
  • ????import?cPickle??
  • ????write_file?=?open('params',?'wb')???
  • ????cPickle.dump(param1.get_value(borrow=True),?write_file,?-1)??
  • ????cPickle.dump(param2.get_value(borrow=True),?write_file,?-1)??
  • ????write_file.close()??


  • 當(dāng)然參數(shù)的個(gè)數(shù)根據(jù)需要去定義。在logistic_sgd.py中參數(shù)只有classifier.W,classifier.b,因此這里定義為save_params(param1,param2)。



    在logistic_sgd.py里我加入了save_params(classifier.W,classifier.b),運(yùn)行了3次epoch,中斷掉程序,在代碼所在的文件夾下,多出了一個(gè)params文件,我們來(lái)看看這個(gè)文件里是什么東西:
    [python] view plaincopy
  • import?cPickle??
  • f=open('params')??
  • w=cPickle.load(f)??
  • b=cPickle.load(f)??
  • ??
  • #w大小是(n_in,n_out),b大小時(shí)(n_out,),b的值如下,因?yàn)镸INST有10個(gè)類(lèi)別,n_out=10,下面正是10個(gè)數(shù)??
  • array([-0.0888151?,??0.16875755,?-0.03238435,?-0.06493175,??0.05245609,??
  • ????????0.1754718?,?-0.0155049?,??0.11216578,?-0.26740651,?-0.03980861])??

  • 也就是說(shuō),params文件確實(shí)保存了我們訓(xùn)練過(guò)程中的參數(shù)。

    那么如何用保存下來(lái)的參數(shù)來(lái)初始化我們的模型的參數(shù)呢?
    在logistic_sgd.py中的class LogisticRegression(object)下,self.W和self.b本來(lái)是初始化為0的,我們可以在下面加上幾行代碼,這樣就可以用我們保存下來(lái)的params文件來(lái)初始化參數(shù)了:

    [python] view plaincopy
  • class?LogisticRegression(object):??
  • ????def?__init__(self,?input,?n_in,?n_out):??
  • ????????self.W?=?theano.shared(??
  • ????????????value=numpy.zeros(??
  • ????????????????(n_in,?n_out),??
  • ????????????????dtype=theano.config.floatX??
  • ????????????),??
  • ????????????name='W',??
  • ????????????borrow=True??
  • ????????)??
  • ????????self.b?=?theano.shared(??
  • ????????????value=numpy.zeros(??
  • ????????????????(n_out,),??
  • ????????????????dtype=theano.config.floatX??
  • ????????????),??
  • ????????????name='b',??
  • ????????????borrow=True??
  • ????????)??
  • #!!!??
  • #加入的代碼在這里,程序運(yùn)行到這里將會(huì)判斷當(dāng)前路徑下有沒(méi)有params文件,有的話就拿來(lái)初始化W和b??
  • ????if?os.path.exists('params'):??
  • ????????f=open('params')??
  • ????????self.W.set_value(cPickle.load(f),?borrow=True)??
  • ????????self.b.set_value(cPickle.load(f),?borrow=True) ?

  • 總結(jié)

    以上是生活随笔為你收集整理的DeepLearning tutorial(2)机器学习算法在训练过程中保存参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。