




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
一、CNN卷積神經(jīng)網(wǎng)絡(luò)原理簡介
http://blog.csdno
net/uO12162613/articIe/detaiIs/43225445
本文主要是詳細(xì)地解讀CNN的實(shí)現(xiàn)代碼。如果你沒學(xué)習(xí)過CNN,在此推薦周曉
藝師兄的博文:DeepLearning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(七),以及
UFLDL上的卷積特征提取、池化
CNN的最大特點(diǎn)就是稀疏連接(局部感受)和權(quán)值共享,如下面兩圖所示,左
為稀疏連接,右為權(quán)值共享。稀疏連接和權(quán)值共享可以減少所要訓(xùn)練的參數(shù),
減少計算復(fù)雜度。
layerm+lO
featuremap
layermQQlayerm
layerm-1OOOO0)layerm-l00O0O
至于CNN的結(jié)構(gòu),以經(jīng)典的LeNet5來說明:
這個圖真是無處不在,一談CNN,必說LeNet5,這圖來自于這篇論文:Gradient
—BasedLearningAppliedtoDocumentRecognition,論文很長,第7頁那
里開始講LeNet5這個結(jié)構(gòu),建議看看那部分。
我這里簡單說一下,LeNet5這張圖從左到右,先是input,這是輸入層,即輸
入的圖片。input-1ayer到C1這部分就是一卷積層(convoIution運(yùn)算),C1
到S2是一個子采樣層(pooling運(yùn)算),關(guān)于卷積和子采樣的具體過程可以
參考下圖:
然后,S2到C3又是卷積,C3到S4又是子采樣,可以發(fā)現(xiàn),卷積和子采樣都是
成對出現(xiàn)的,卷積后面一般跟著子采樣。S4到C5之間是全連接的,這就相當(dāng)
于一個MLP的隱含層了(如果你不清楚MLP,參考《DeepLearningtutorial
(3)MLP多層感知機(jī)原理簡介+代碼詳解》)oC5到F6同樣是全連接,也是相
當(dāng)于一個MLP的隱含層。最后從F6到輸出output,其實(shí)就是一個分類器,這
一層就叫分類層。
ok,CNN的基本結(jié)構(gòu)大概就是這樣,由輸入、卷積層、子采樣層、全連接層、
分類層、輸出這些基本“構(gòu)件”組成,一般根據(jù)具體的應(yīng)用或者問題,去確定
要多少卷積層和子采樣層、采用什么分類器。當(dāng)確定好了結(jié)構(gòu)以后,如何求解
層與層之間的連接參數(shù)?一般采用向前傳播(FP)+向后傳播(BP)的方法來訓(xùn)
練。具體可參考上面給出的鏈接。
layerm-lhiddenlayerm
Figure1:exampleofaconvolutionallayer
二、CNN卷積神經(jīng)網(wǎng)絡(luò)代碼詳細(xì)解讀(基于python+theano)
代碼來自于深度學(xué)習(xí)教程:ConvolutionalNeuralNetworks(LoNet),這
個代碼實(shí)現(xiàn)的是一個簡化了的LeNet5,具體如下:
?沒有實(shí)現(xiàn)location-specificgainandbiasparameters
?用的是maxpooIing,而不是average_pooling
?分類器用的是softmax,LeNet5用的是rbf
?LeNet5第二層并不是全連接的,本程序?qū)崿F(xiàn)的是全連接
另外,代碼里將卷積層和子采用層合在一^起,定義為“LeNetConvPoolLayer
“(卷積采樣層),這好理解,因為它們總是成對出現(xiàn)。但是有個地方需要注
意,代碼中將卷積后的輸出直接作為子采樣層的輸入,而沒有加偏置b再通過
sigmoid函數(shù)進(jìn)行映射,即沒有了下圖中fx后面的bx以及sigmoid映射,也
即直接由fx得到Cxo
最后,代碼中第一個卷積層用的卷積核有20個,第二個卷積層用50個,而不是
上面那張LeNet5圖中所示的6個和16個。
了解了這些,下面看代碼:
(1)導(dǎo)入必要的模塊
[python]viewplaincopy
1.importcPickle
2.importgzip
3.importos
4.importsys
5.importtime
6.
7.importnumpy
8.
9.importtheano
10.importtheano.tensorasT
11.fromtheanootensor,signa1importdownsampIe
12.fromtheanootensoronnetimportconv
(2)定義CNN的基本"構(gòu)件”
CNN的基本構(gòu)件包括卷積采樣層、隱含層、分類器,如下
?定義LeNetConvPooILayer(卷積+采樣層)
見代碼注釋:
[python]viewplaincopy
1."
2.卷積+下采樣合成一個層LeNetConvPooILayer
3.rng:隨機(jī)數(shù)生成器,用于初始化W
4.input:4維的向量,theanootensorodtensor4
5.filter_shape:(numberoffiIters,numinputfeaturemaps,fiIterheight,filterwid
th)
6.image_shape:(batchsize,numinputfeaturemaps,imageheight,imagewidth)
7.poolsize:(#rows,#coIs)
8.一“
9.CIassLeNetConvPooILayer(object):
10.def_init_(sef,rng,input,fiIter_shape,image_shape,pooIsize=
(2,2)):
11.
12.#assertcondition,condition為True,則繼續(xù)往下執(zhí)行,condition為FaIse,中斷程序
13.#image_shape[1]和filter_shape[1]都是numinputfeaturemaps,它們必須是一樣的。
14.assertimage_shape[1]==filter_shape[1]
15.seIfoinput=input
16.
17.4每個隱層神經(jīng)元(即像素)與上一層的連接數(shù)為
numinpulfealureniapb大fillerheight*fiIlerwidlh.
18.#可以用numpy.prod(fiItejshape[1:])來求得
19.fan_in=numpyoprod(filter_shape[1:])
20.
21.Slowerlayer上每個神經(jīng)元獲得的梯度來自
于:"numoutputfeaturemaps*filterheight*fiIterwidth”/poolingsize
22.fanout=(fiIter_shape[0]*numpy<>prod(filter_shape_2:])/
23.numpy0prod(poolsize))
24.
25.#以上求得fan_in、fan_out,將它們代入公式,以此朱庖機(jī)初始化W,W就是線性卷機(jī)核
26.Wbound=numpy.sqrt(6./(fanin+fanout))
27.seIf.W=theanooshared(
28.numpyoasarray(
29.rng.uniform(Iow=-W_bound,high=W_bound,size=fiIter_shape
30.dtype=theanooconfig,floatX
31.),
32.borrow=True
33.)
34.
35.#thebiasisa1Dtensor---onebiasperoutputfeaturemap
36.#偏置b是一維向量,每個輸出圖的特征圖都對應(yīng)一個偏置,
37.4而輸出的特征圖的個數(shù)由fiIter個數(shù)決定,因此用filter_shape[0]即numberoffilters來初始
化
38.b_vaIues=numpy.zeros((fiIter_shape
[0],),dtype=theano.config.fIoatX)
39.selfob=theanooshared(vaIue=b_vaIues,borrow二True)
40.
41.埔將輸入圖像與fiIter卷積,conv。conv2d函數(shù)
42.#卷積完沒有加b再通過sigmoid,這里是一處簡化。
43.conv_out=conv.conv2d(
44.input=input,
45.filters=selfoW,
46.fiIter_shape=filter_shape,
47.image_shape=image_shape
48.)
|49.
50.#maxpooling,最大子采樣過程
51.pooIed_out=downsampIeumax_pool_2d(
52.input=conv_out,
S3.ds=pooIsize,
54.ignore_border=True
55.)
56.
57.#加偏置,再通過tanh映射,得到卷積+子采樣層的最終揄出
58.埔因為b是一維向量,這里用維度轉(zhuǎn)換函數(shù)dimshuffIe將其reshape。比如b是(10,),
59.#則b。dimshuffIe('x',0.'x','x'))將其reshape為(1,10,1,1)
60.seIf.uulpul=T.lanh(puuIed_uul+self.b。
dimshuffIe(*x*,0,'x','x'))
61.#卷積+采樣層的參數(shù)
62.seIf.params=[self.W,self。b]
?定義隱含層HiddenLayer
這個跟上一篇文章《DeepLearningtutorial(3)MLP多層感知機(jī)原理簡介+
代碼詳解》中的HiddenLayer是一致的,直接拿過來:
[python]viewplaincopy
1.
2.注釋:
3.這是定義隱藏層的類,首先明確:隱藏層的輸入即input,渝出即隱藏層的神經(jīng)元個數(shù)。輸入層與隱藏層
是全連接的.
4.假設(shè)輸入是n_in維的向量(也可以說時n_in個神經(jīng)元),您藏層有n_out個神經(jīng)元,則因為是全連接,
5.一共有n_in*n_out個權(quán)重,故W大小時(n_in,n_out),n_in行n_out列,每一JU對應(yīng)隱藏層的每一
神經(jīng)元的連接權(quán)重。
6.b是偏置,隱藏層有n_out個神經(jīng)元,故b時nout維向量。
7.rng即隨機(jī)數(shù)生成器,numpy。random.RandomState,用于初始化W。
8.input訓(xùn)練模型所用到的所有諭入,并不是MLP的輸入層,MLP的輸入層的神經(jīng)元個數(shù)時n_in,而這里的
參數(shù)input大小是(n_example,n_in),每一行一^個樣本,即每一行作為MLP的輸入層。
9.activation:激活函數(shù),這里定義為函數(shù)tanh
10?“””
11.classHiddenLayer(object):
12.def_init_(sef,rng,input,n_in,n_out,W二None,b二None,
13.activation=T.tanh):
14.self?input=input#類HiddenLayer的input即所傳遞進(jìn)來的input
15.
16.
17.注釋:
18.代碼要.兼容GPU,則必須使用dtype=theano.config.fIoatX,并且定義為theano.
shared
另外,的初始化有個規(guī)則:如果使用函數(shù),則在一
19.WTanhsqrt(6O/(n_in+n_hidden))
到sqrt(60/(n_in+n_hidden))之間均勻
20.抽取數(shù)值來初始化W,若時sigmoid函數(shù),則以上再乘4倍。
21.
22.#如果W未初始化,則根據(jù)上述方法初始化。
23.#加入這個判斷的原因是:有時候我們可以用訓(xùn)練好的參數(shù)來初始化W,見我的上一
篇文章.
24.ifWisNone:
25.W_vaIues=numpy.asarray(
26.rng.uniform(
27.low=—numpy。sqrt(6。/(n_in+n_out)),
28.high=numpy.sqrt(6。/(n_in+n_out)),
29.size=(n_in,n_out)
30.),
31.dtype=theano.config0fIoatX
32.)
33.ifactivation=theano.tensor,nnetosigmoid:
34.WvaIues*=4
35.W=theano.shared(vaIue=W_vaIues,name='W',borrow=True)
36.
37.ifbiSNone:
二
38.b_vaIuesnumpy0zeros((n_out,),dtype=theano.config.fIoatX)
39.btheanooshared(vaIue=b_vaIues,name='b',borrow=True)
40.
41.#用上面定義的W、b來初始化類HiddenLayer的W、b
42.self.W=W
43.seIf.b=b
44.
45.#隱含層的輸出
46.Iin_output=Todot(input,self.W)+self,b
47.seIfooutput=(
48.Iin_outputifactivationisNone
49.elseactivation(Iin_output)
50.)
51.
52.#隱含層的參數(shù)
53.seIf.params=[selfoW,seIfob]
定義分類器(Softmax回歸)
采用Softmax,這¥艮《DeepLearningtutorial(1)Softmax回歸原理簡介+代
碼詳解》中的LogisticRegression是一^羊的,直接拿過來:
[python]viewplaincopy
1.
2.定義分類層LogisticRegression,也即Softmax回歸
3.在deepIearningtutorial由,直接將LogisticRegression視為Softmax,
4.而我們所認(rèn)識的二類別的邏輯回歸就是當(dāng)n_out=2時的LogisticRegression
5.""“
6.埔參數(shù)說明:
7./input,大小就是(n_example,n_in),其中n_example是一個batch的大小,
8.#因為我們訓(xùn)練時用的是MinibatchSGD,因此input這樣定義
9.#n_in,即上一層(隱含層)6勺輸出
10.?n_out,輸出的類別數(shù)
11.CIassLogisticRegression(object):
12.def_init_(seIf,input,n_in,n_out):
13.
14.州大小是n_in行n_out列,b為n_out維向量.即:每個輸出對應(yīng)W的一列以及b的一個元素.
15.self.W=theano.shared(
16.value=numpy.zeros(
17.(n_in,n_out),
18.dtype=theanooconfig。floatX
19.),
20.name='W',
21.borrow=True
22.)
23.
24.selfob=theanooshared(
25.value=numpy<>zeros(
26.(n_out,),
27.dtype=theano.configof1oatX
28.),
29.name二'b',
30.borrow二True
31.)
32.
33.#input是(n_example,n_in;,W是(n_in,n_out),點(diǎn)乘得到(n_example,n_out),加上偏置b,
34.#再作為T.nnet.softmax的榆入,得到p_y_given_x
(35.#故p_y_given_x每一行代表每一個樣本被估計為各類別的概率
36.#PS:b是n_out維向量,與(n_exampIe,n_out)矩陣相加,內(nèi)部其實(shí)是先復(fù)制n_example個b,
37.才然后(n_exampIe,n_out)矩陣的每一行都加b
38.seIf.p_y_given_x=Tonnet.softmax(T.dot(input,seIf<>W)+seIfob)
39.
40.#argmax返回最大值下標(biāo),因為本例數(shù)據(jù)集是MNIST,下標(biāo)剛好就是類別。axis二1表示按行操作.
41.seIf.y_pred=T.argmax(selfoP_y_given_x,axis=1)
42.
43.^params,LogisticRegression的參數(shù)
144.seIfoparams=[self.W,self.b]
到這里,CNN的基本”構(gòu)件“都有了,下面要用這些“構(gòu)件“組裝成LeNet5(當(dāng)
然,是簡化的,上面已經(jīng)說了),具體來說,就是組裝成:
LeNet5=input+LeNetConvPooILayer_1+LeNetConvPooILayer_2+HiddenLayer+
LogisticRegression+outputo
然后將其應(yīng)用于MNIST數(shù)據(jù)集,用BP算法去解這個模型,得到最優(yōu)的參數(shù).
(3)加載MNIST數(shù)據(jù)集(mnist.pkI.gz)
[python]viewplaincopy
1.
2.加載MNIST數(shù)據(jù)集load_data()
3.
4.defIoad_data(dataset):
\s.#dataset是數(shù)據(jù)集的路徑,程序首先檢測該路徑下有沒有MNIST數(shù)據(jù)集,沒有的話就下載
MNIST數(shù)據(jù)集
6.#這一部分就不解釋了,與softmax回歸算法無關(guān)。
7.data_dir,data_fiIe=osopath.split(dataset)
8.ifdata_dir==""andnotos。path,isfiIe(dataset):
9.#Checkifdatasetisinthedatadirectory.
10.new_path=os.path.join(
11.osopath,spIit(_file_)[0],
”II
12.??,
13."data”,
14.dataset
15.)
16.ifosopathoisfiIe(new_path)ordata_fiIe=='mnist?pk10gz
17.dataset=new_path
18.
19.if(notosopathoisfiIe(dataset))anddata_fiIe=='mnist.pkl.gzJ
20.importur11ib
21.origin=(
22.'http://www<,irooumontreaI<>ca/*Iisa/deep/data/mnist/mnist<>
pkl.gz
23.)
24.print'DownIoadingdatafrom%s'%origin
25.urIIib.urIretrieve(origin,dataset)
26.
27.print'oooloadingdata?
28.#以上是檢測并下載數(shù)據(jù)集mnist.pkI.gz,不是本文重點(diǎn)。下面才是Ioad_data的開始
29.
30.#從“mnist.pkl.gz”里加載trainset,vaIid_set,test_set,它們都是包括laneI的
31.球主要用到python里的gzip。open()函數(shù),以及cPickle.load()o
32.#'rb'表示以二進(jìn)制可讀的方式打開文件
33.f=gzip0open(dataset,'rb')
34.train_set,vaIid_set,test_set=cPickleoload(f)
35.foclose()
36.
37.
38.#將數(shù)據(jù)設(shè)置成sharedvariabIes,主要時為了GPU加速,只有sharedvariabIes才能存到GPUmemory
中
39.#GPU里數(shù)據(jù)類型只能是fl。at.而data_y是類別,所以最后又轉(zhuǎn)換為int返回
40.defshared_dataset(data_xy,borrow二True):
41.data_x,data_y=data_xy
42.shared_x=theano.shared(numpy.asarray(data_x,
43.
dtype=theano.config.floatX),
44.borrow=borrow)
45.shared_y=theano.shared(numpy.asarray(data_y,
46.
dtype=theanooconfig<>floatX),
47.borrow=borrow)
48.returnshared_x,T.cast(shared/,'int32')
49.
50.
51.test_set_x,test_set_y=shared_dataset(test_set)
52.vaIid_set_x,vaIid_set_y=shared_dataset(vaIid_set)
53.Irain_sel_x,Lrairi_bel_y=shared_dalasel(Lrairi_sel)
54.
55.rvaI=[(train_set_x,train_set_y),(vaIid_set_x,valid_set_y),
56.(test_set_x,test_set_y)]
57.returnrvaI
(4)實(shí)現(xiàn)LeNet5并測試
[python]viewplaincopy
1.””“
2.實(shí)現(xiàn)LeNet5
3.LeNet5有兩個卷積層,第一個卷積層有20個卷積核,第二個卷積層有50個卷積核
4.
5.defevaIuate_Ienet5(Iearning_rate=0o1,n_epochs=200,
6.dataset='mnist.pkl?gz',
7.nkerns=[20,50],batch_size=500):
g"””
9.Iearning_rate:學(xué)習(xí)速率,隨機(jī)梯度前的系數(shù).
10.nepochs訓(xùn)練步數(shù),每一步都會遍歷所有batch,即所有樣本
11.batch_size,這里設(shè)置為500,即每遍歷完500個樣本,才計算梯度并更新參數(shù)
12.nkerns=[20,50],每一個LeNetConvPoolLayer卷積核的個數(shù),第一個LeNetConvPooILayer有
13.20個卷積核,第二個有50個
14.
15.
16.rng=numpy。random.RandomState(23455)
17.
18.并加載數(shù)據(jù)
19.datasets=load_data(dataset)
20.train_set_x,train_set_y=datasets[0]
21.va1id_set_x,va1id_set_y=datasets[1]
22.test_set_x,test_set_y=datasets[2]
23.
24.#計算batch的個數(shù)
25.n_train_batches=train_set_x.get_vaIue(borrow=True)。shape[0]
26.n_vaIid_batches=vaIid_set_x0get_vaIue(borrow=True)(?shape[0]
27.n_test_batches=test_set_x.get_vaIue(borrow二True)。shape[0]
28.n_train_batches/=batchsize
29.n_vaIid_batches/=batch_size
30.n_test.batches/=batchsize
31.
32.#定義幾個變量,index表示下標(biāo),x表示輸入的訓(xùn)練數(shù)據(jù),y對應(yīng)其標(biāo)簽
33.index=ToIscalar()
34.x=Tomatrix('x')
35.y=Toivector('y')
36.
37.######################
38.#BUILDACTUALMODEL#
39.######################
40.print1..obuiIdingthemode1'
42.
43.#我們加載進(jìn)來的batch大小的數(shù)據(jù)是(batch_size,28*28),但是LeNetConvPooILayer的揄入是
四維的,所以要reshape
44.layerOinput=x.reshape((batchsize,1,28,28))
45.
46.#layerO即第一個LeNetConvPooILayer層
47.#輸入的單張圖片(28,28),經(jīng)過conv得到(28-5+1,28-5+1)=(24,24),
48.#經(jīng)過maxpooling得到(24/2,24/2)=(12,12)
(49.#因為每個batch有batch_size張圖,第一個LeNetConvPooILayer層有nkerns[0]個卷積核,
50.#故layer。輸出為(batch_size,nkerns[0],12,12)
#yerO=LeNetConvPooILayer(
52.rng,
53.input=IayerO_input,
54.image_shape=(batch_size,1,28,28),
55.fiIter_shape=(nkerns[0],1,5,5),
56.poolsize=(2,2)
57.)
58.
59.
60.Iayerl即第二個LeNetConvPooILayer層
61.#輸入是layerO的輸出,每張?zhí)卣鲌D為(12,12),經(jīng)過conv得到(12—5+1,12—5+1)=(8,8),
62.#經(jīng)過maxpooling得到(8/2,8/2)=(4,4)
63.#因為每個batch有batch_size張圖(特征圖),第二個LeNetConvPooILayer層有nkerns[1]個卷積核
64.#,故layerl輸出為(batch_size,nkerns[1],4,4)
65.layerl=LeNetConvPooILayer(
66.rng,
67.input=IayerO.output,
68.imageshape=(batchsize,nkerns[0],12,12),江榆入nkerns[0]張?zhí)卣鲌D,即
layer。輸出nkerns[0]張?zhí)卣鲌D
69.fiIter_shape=(nkerns[1],nkerns[0],5,5),
70.poolsize=(2,2)
71.)
72.
73.
74.埔前面定義好了兩個LeNetConvPoolLayer(layer。和layeZ),Iayerl后面接Iayer2,這是一個全連接
層,相當(dāng)于MLP里面的隱含層
75.#故可以用MLP中定義的HiddenLayer來初始化Iayer2,Iayer2的輸入是二維的
(batch_size,num_pixeIs),
76.#故要將上層中同一張圖經(jīng)不同卷積核卷積出來的特征圖合并為一維向量,
77.#也就是將Iayerl的輸出(batch_size,nkerns[1],4,4)flatten為(batch_size,nkerns
[1]*4*4)=(500,800),作為Iayer2的揄入。
78.#(500,800)表示有500個樣本,每一行代表一個樣本。Iayer2的輸出大小是(batch_size,n_out)=
:500,500)
79.Iayer2_input=layerlooutput0flatten(2)
80.Iayer2=HiddenLayer(
81.rng,
82.input=Iayer2_input,
83.n_in=nkerns[1]*4*4,
84.n_out=500,
85.activation=T0tanh
86.)
87.
88.#最后一層Iayer3是分類層,用的是邏輯回歸中定義的LogisticRegression,
89.#layer3的輸入是Iayer2的輸出(500,500),Iayer3的輸出就是(batch_size,n_out)=(500,10)
90.Iayer3=LogisticRegression(input=Iayer2.output,n_in=500,n_out=10)
91.
92.4代價函數(shù)NLL
93.cost=Iayer3<>negative_Iog_IikeIihood(y)
94.
95.#test_modeI計算測試誤差,x、y根據(jù)給定的index具體化,然后調(diào)用Iayer3,
96.#Iayer3又會逐層地調(diào)用Iayer2、layerl>layerO,故test_modeI其實(shí)就是整個CNN結(jié)構(gòu),
97.#test_modeI的輸入是x、y,榆出是Iayer3oerrors(y)的輸出,即誤差。
98.test_modeI=theanoofunction(
99.[index],
100.Iayer3.errors(y),
101.givens={
102.x:test_set_x
[index*batch_size:(index+1)*batch_size],
103.y:test_set_y[index*batch_size:(index+1)*batch_
size]
104.}
105.)
106.#vaIidate_modeI,驗證模型,分析同上。
107.va1idate_mode1=theanoofunction(
108.[index],
109.1ayer3?errors(y),
110.givens={
111.x:va1id_set_x
[index*batch_size:(index+1)*batch_size],
112.y:vaIid_set_y
[index*batch_size:(index+1)*batch_size]
113.}
114.)
115.
116.#下面是trainjnodel,涉及到優(yōu)化算法即SGD,需要計算梯度、更新參數(shù)
117.#參數(shù)集
118.params=1ayer30params+1ayer20params+layerl.params+IsyerO.params
119.
120.#對各個參數(shù)的梯度
121.grads=Tograd(cost,params)
122.
123.#因為參數(shù)太多,在updates規(guī)則里面一個一個具體地寫出來是很麻煩的,所以下面用了一個for。。in。.,
自動生成規(guī)則對(param_i,param_i—Iearning_rate*grad_i)
124.updates=[
125.(param_i,param_i-1earning_rate*grad_i)
126.forparam_i,grad_iinzip(params,grads)
127.]
128.
129.#train一modeI,代碼分析同test一modeI。train_modeI里比test_modeI、vaIidation_modeI多出updates
規(guī)則
130.train_mode1=theanoofunction(
131.[index],
132.cost,
133.updates=updates,
134.givens={
135.x:train_set_x
[index*batch_size:(index+1)*batch_size],
136.y:train_set_y
[index*batchsize:(index+1)*batchsize]
f一
137.
138.)
139.
140.
141.###############
142.#開始訓(xùn)練#
143.###############
144.print'0。,training1
145.patience=100C0
146.patience_increase=2
147.improvement_threshoId=Ou995
148.
149.vaIidation_frequency=min(n_train_batches,patience/2)
150.#這樣設(shè)置validation_frequency可以保證每一次epoch都會在驗證集上測試.
151.
152.best_validation_loss=numpy。inf#最好的驗證集上的Ioss,最好即最小
153.best_iter=0#最好的迭代次數(shù),以batch
為單位。比如best_iter=10000,說明在訓(xùn)練完第10000個batch時,it51]best_validation_loss
154.test_score=0。
。
155.starime=Iimeoclock
156.
157.epoch=0
158.done_looping=FaIse
159.
160.#下面就是訓(xùn)練過程了,whiIe循環(huán)控制的時步數(shù)epoch,一個epoch會遍歷所有的batch,即所有的圖
尺。
161.#for循環(huán)是遍歷一個個batch,一次一個batch地訓(xùn)練。for循環(huán)體里會用
t-ain_model(minibatch_index)去訓(xùn)練模型,
162.#train_modeI里面的updatas會更新各個參數(shù)。
163.#for循環(huán)里面會累加訓(xùn)練過的batch數(shù)iter,當(dāng)iter是validation_frequency倍數(shù)時則會在驗證集上
測試,
164.#如果驗證集的損失this_validation_loss小于之前最佳的損失best_vaIidationloss,
165.#則更新best_validation」oss和best_iter,同時在testset上測試。
166.#如果驗證集的損失this_vaIidation_loss小于best_validationloss*improvementthreshoId時則
更新patienceo
167.#當(dāng)達(dá)到最大步數(shù)n_epoch時,或者patience<iter時,結(jié)束訓(xùn)練
168.whiIe(epoch<n_epochs)and(notdone_Iooping):
169.epoch=epoch+1
170.forminibatch_indexinxrange(n_train_batches):
171.
172.iter=(epoch—1)*n_train_batches+minibatch_index
173.
174.ifiler%100==0:
175.print'training@iter=',iter
176.cost_ij=train_modeI(minibatch_index)
177.#cost_ij沒什么用,后面都沒有用到,只是為了調(diào)用train_model,而train_model有返回值
178.if(iter+1)%vaIidation_frequency==0:
179.
180.#computezero—onelossonvaIidationset
181.va1idation_losses=[validate_model(i)fori
182.inxrange
Cn_vaIid_batches)]
183.this_va1idation_1oss=numpy.mean(va1idation_1osses)
184.print(tepoch%i,minibatch%i/%i,validationerror
%f%%,%
185.(epoch,minibatch_index+1,n_train_batch
es,
186.thit>_vaIidaIiuri_Iuss*100。))
187.
188.
189.ifthisva1idationloss<bestva1idation1oss:
190.
191.
192.ifthis_va1idation_1oss<best_va1idation_1oss
*\
193.improvement_thresho1d:
194.patience=max
[patience,iter*patience_increase)
195.
196.
197.best_va1idation_1oss=this_va1idation_1oss
198.best_iter=iter
199.
200.
201.test
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山場租賃承包合同試卷教案(2025-2026學(xué)年)
- 七年級英語期末考試易錯題解析
- 中醫(yī)古籍傷寒雜病論現(xiàn)代解析
- 高考物理復(fù)習(xí)專題與典型題解析
- 年度銷售業(yè)績總結(jié)與提升方案
- 中藥學(xué)基礎(chǔ)知識復(fù)習(xí)題集
- 小學(xué)數(shù)學(xué)學(xué)習(xí)情況調(diào)查及分析報告
- 醫(yī)院處方審核流程及獎懲細(xì)則
- 教師課堂觀察記錄表范本
- (正式版)DB15∕T 4188.4-2025 《有色金屬產(chǎn)品碳足跡評價技術(shù)規(guī)范 第4部分:陰極銅產(chǎn)品》
- 架線弧垂計算表(應(yīng)力弧垂插值計算)
- 萬夫一力天下無敵 課件-2023-2024學(xué)年高一上學(xué)期增強(qiáng)班級凝聚力主題班會
- 調(diào)試、試運(yùn)行與移交管理方案
- GB/T 26655-2011蠕墨鑄鐵件
- 熱鍍鋅鋼管技術(shù)標(biāo)準(zhǔn)
- 周三多管理學(xué)第03章管理的基本原理
- 基礎(chǔ)生態(tài)學(xué)第4章種群及其基本特征課件
- 虛擬現(xiàn)實(shí)與增強(qiáng)現(xiàn)實(shí)頭戴顯示關(guān)鍵技術(shù)及應(yīng)用項目
- 《電力工業(yè)企業(yè)檔案分類規(guī)則0大類》(1992年修訂版)
- GB∕T 26520-2021 工業(yè)氯化鈣-行業(yè)標(biāo)準(zhǔn)
- 溫州醫(yī)科大學(xué)《兒科學(xué)》支氣管肺炎
評論
0/150
提交評論