卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解_第1頁
卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解_第2頁
卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解_第3頁
卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解_第4頁
卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、卷積神經(jīng)網(wǎng)絡(luò)全面解析之代碼詳解本文介紹多層感知機(jī)算法,特別是詳細(xì)解讀其代碼實(shí)現(xiàn),基于python theano,代碼來自:Convolutional Neural Networks (LeNet)。一、CNN卷積神經(jīng)網(wǎng)絡(luò)原理簡介要講明白卷積神經(jīng)網(wǎng)絡(luò),估計(jì)得長篇大論,網(wǎng)上有很多博文已經(jīng)寫得很好了,所以本文就不重復(fù)了,如果你了解CNN,那可以往下看,本文主要是詳細(xì)地解讀CNN的實(shí)現(xiàn)代碼。CNN的最大特點(diǎn)就是稀疏連接(局部感受)和權(quán)值共享,如下面兩圖所示,左為稀疏連接,右為權(quán)值共享。稀疏連接和權(quán)值共享可以減少所要訓(xùn)練的參數(shù),減少計(jì)算復(fù)雜度。       至于C

2、NN的結(jié)構(gòu),以經(jīng)典的LeNet5來說明:這個(gè)圖真是無處不在,一談CNN,必說LeNet5,這圖來自于這篇論文:Gradient-Based Learning Applied to Document Recognition,論文很長,第7頁那里開始講LeNet5這個(gè)結(jié)構(gòu),建議看看那部分。我這里簡單說一下,LeNet5這張圖從左到右,先是input,這是輸入層,即輸入的圖片。input-layer到C1這部分就是一個(gè)卷積層(convolution運(yùn)算),C1到S2是一個(gè)子采樣層(pooling運(yùn)算),關(guān)于卷積和子采樣的具體過程可以參考下圖:然后,S2到C3又是卷積,C3到S4又是子采樣,可以發(fā)現(xiàn),

3、卷積和子采樣都是成對(duì)出現(xiàn)的,卷積后面一般跟著子采樣。S4到C5之間是全連接的,這就相當(dāng)于一個(gè)MLP的隱含層了(如果你不清楚MLP,參考DeepLearning tutorial(3)MLP多層感知機(jī)原理簡介+代碼詳解)。C5到F6同樣是全連接,也是相當(dāng)于一個(gè)MLP的隱含層。最后從F6到輸出output,其實(shí)就是一個(gè)分類器,這一層就叫分類層。ok,CNN的基本結(jié)構(gòu)大概就是這樣,由輸入、卷積層、子采樣層、全連接層、分類層、輸出這些基本“構(gòu)件”組成,一般根據(jù)具體的應(yīng)用或者問題,去確定要多少卷積層和子采樣層、采用什么分類器。當(dāng)確定好了結(jié)構(gòu)以后,如何求解層與層之間的連接參數(shù)?一般采用向前傳播(FP)+向

4、后傳播(BP)的方法來訓(xùn)練。具體可參考上面給出的鏈接。二、CNN卷積神經(jīng)網(wǎng)絡(luò)代碼詳細(xì)解讀(基于python+theano)代碼來自于深度學(xué)習(xí)教程:Convolutional Neural Networks (LeNet),這個(gè)代碼實(shí)現(xiàn)的是一個(gè)簡化了的LeNet5,具體如下:· 沒有實(shí)現(xiàn)location-specific gain and bias parameters· 用的是maxpooling,而不是average_pooling· 分類器用的是softmax,LeNet5用的是rbf· LeNet5第二層并不是全連接的,本程序?qū)崿F(xiàn)的是全連接另外,代

5、碼里將卷積層和子采用層合在一起,定義為“LeNetConvPoolLayer“(卷積采樣層),這好理解,因?yàn)樗鼈兛偸浅蓪?duì)出現(xiàn)。但是有個(gè)地方需要注意,代碼中將卷積后的輸出直接作為子采樣層的輸入,而沒有加偏置b再通過sigmoid函數(shù)進(jìn)行映射,即沒有了下圖中fx后面的bx以及sigmoid映射,也即直接由fx得到Cx。最后,代碼中第一個(gè)卷積層用的卷積核有20個(gè),第二個(gè)卷積層用50個(gè),而不是上面那張LeNet5圖中所示的6個(gè)和16個(gè)。了解了這些,下面看代碼:(1)導(dǎo)入必要的模塊import cPickleimport gzipimport osimport sysimport timeimport

6、numpyimport theanoimport theano.tensor as Tfrom theano.tensor.signal import downsamplefrom theano.tensor.nnet import conv(2)定義CNN的基本"構(gòu)件"CNN的基本構(gòu)件包括卷積采樣層、隱含層、分類器,如下· 定義LeNetConvPoolLayer(卷積+采樣層)見代碼注釋:"""卷積+下采樣合成一個(gè)層LeNetConvPoolLayerrng:隨機(jī)數(shù)生成器,用于初始化Winput:4維的向量,theano.tens

7、or.dtensor4filter_shape:(number of filters, num input feature maps,filter height, filter width)image_shape:(batch size, num input feature maps,image height, image width)poolsize: (#rows, #cols)"""class LeNetConvPoolLayer(object): def _init_(self, rng, input, filter_shape, image_shape,

8、 poolsize=(2, 2): #assert condition,condition為True,則繼續(xù)往下執(zhí)行,condition為False,中斷程序#image_shape1和filter_shape1都是num input feature maps,它們必須是一樣的。 assert image_shape1 = filter_shape1 self.input = input#每個(gè)隱層神經(jīng)元(即像素)與上一層的連接數(shù)為num input feature maps * filter height * filter width。#可以用d(filter_shape1:

9、)來求得 fan_in = d(filter_shape1:)#lower layer上每個(gè)神經(jīng)元獲得的梯度來自于:"num output feature maps * filter height * filter width" /pooling size fan_out = (filter_shape0 * d(filter_shape2:) / d(poolsize) #以上求得fan_in、fan_out ,將它們代入公式,以此來隨機(jī)初始化W,W就是線性卷積核 W_bound = numpy.sqrt(6. / (

10、fan_in + fan_out) self.W = theano.shared( numpy.asarray( rng.uniform(low=-W_bound, high=W_bound, size=filter_shape), dtype=theano.config.floatX ), borrow=True )# the bias is a 1D tensor - one bias per output feature map#偏置b是一維向量,每個(gè)輸出圖的特征圖都對(duì)應(yīng)一個(gè)偏置,#而輸出的特征圖的個(gè)數(shù)由filter個(gè)數(shù)決定,因此用filter_shape0即number of filt

11、ers來初始化 b_values = numpy.zeros(filter_shape0,), dtype=theano.config.floatX) self.b = theano.shared(value=b_values, borrow=True)#將輸入圖像與filter卷積,conv.conv2d函數(shù)#卷積完沒有加b再通過sigmoid,這里是一處簡化。 conv_out = conv.conv2d( input=input, filters=self.W, filter_shape=filter_shape, image_shape=image_shape )#maxpooling

12、,最大子采樣過程 pooled_out = downsample.max_pool_2d( input=conv_out, ds=poolsize, ignore_border=True )#加偏置,再通過tanh映射,得到卷積+子采樣層的最終輸出#因?yàn)閎是一維向量,這里用維度轉(zhuǎn)換函數(shù)dimshuffle將其reshape。比如b是(10,),#則b.dimshuffle('x', 0, 'x', 'x')將其reshape為(1,10,1,1) self.output = T.tanh(pooled_out + self.b.dimshuffl

13、e('x', 0, 'x', 'x')#卷積+采樣層的參數(shù) self.params = self.W, self.b· 定義隱含層HiddenLayer這個(gè)跟上一篇文章 DeepLearning tutorial(3)MLP多層感知機(jī)原理簡介+代碼詳解中的HiddenLayer是一致的,直接拿過來:"""注釋:這是定義隱藏層的類,首先明確:隱藏層的輸入即input,輸出即隱藏層的神經(jīng)元個(gè)數(shù)。輸入層與隱藏層是全連接的。假設(shè)輸入是n_in維的向量(也可以說時(shí)n_in個(gè)神經(jīng)元),隱藏層有n_out個(gè)神經(jīng)

14、元,則因?yàn)槭侨B接,一共有n_in*n_out個(gè)權(quán)重,故W大小時(shí)(n_in,n_out),n_in行n_out列,每一列對(duì)應(yīng)隱藏層的每一個(gè)神經(jīng)元的連接權(quán)重。b是偏置,隱藏層有n_out個(gè)神經(jīng)元,故b時(shí)n_out維向量。rng即隨機(jī)數(shù)生成器,numpy.random.RandomState,用于初始化W。input訓(xùn)練模型所用到的所有輸入,并不是MLP的輸入層,MLP的輸入層的神經(jīng)元個(gè)數(shù)時(shí)n_in,而這里的參數(shù)input大小是(n_example,n_in),每一行一個(gè)樣本,即每一行作為MLP的輸入層。activation:激活函數(shù),這里定義為函數(shù)tanh"""cl

15、ass HiddenLayer(object): def _init_(self, rng, input, n_in, n_out, W=None, b=None, activation=T.tanh): self.input = input #類HiddenLayer的input即所傳遞進(jìn)來的input """ 注釋: 代碼要兼容GPU,則必須使用 dtype=theano.config.floatX,并且定義為theano.shared 另外,W的初始化有個(gè)規(guī)則:如果使用tanh函數(shù),則在-sqrt(6./(n_in+n_hidden)到sqrt(6./(n_

16、in+n_hidden)之間均勻 抽取數(shù)值來初始化W,若時(shí)sigmoid函數(shù),則以上再乘4倍。 """ #如果W未初始化,則根據(jù)上述方法初始化。 #加入這個(gè)判斷的原因是:有時(shí)候我們可以用訓(xùn)練好的參數(shù)來初始化W,見我的上一篇文章。 if W is None: W_values = numpy.asarray( rng.uniform( low=-numpy.sqrt(6. / (n_in + n_out), high=numpy.sqrt(6. / (n_in + n_out), size=(n_in, n_out) ), dtype=theano.config.f

17、loatX ) if activation = theano.tensor.nnet.sigmoid: W_values *= 4 W = theano.shared(value=W_values, name='W', borrow=True) if b is None: b_values = numpy.zeros(n_out,), dtype=theano.config.floatX) b = theano.shared(value=b_values, name='b', borrow=True) #用上面定義的W、b來初始化類HiddenLayer的W、b

18、 self.W = W self.b = b #隱含層的輸出 lin_output = T.dot(input, self.W) + self.b self.output = ( lin_output if activation is None else activation(lin_output) ) #隱含層的參數(shù) self.params = self.W, self.b· 定義分類器 (Softmax回歸)采用Softmax,這跟DeepLearning tutorial(1)Softmax回歸原理簡介+代碼詳解中的LogisticRegression是一樣的,直接拿過來:&q

19、uot;""定義分類層LogisticRegression,也即Softmax回歸在deeplearning tutorial中,直接將LogisticRegression視為Softmax,而我們所認(rèn)識(shí)的二類別的邏輯回歸就是當(dāng)n_out=2時(shí)的LogisticRegression"""#參數(shù)說明:#input,大小就是(n_example,n_in),其中n_example是一個(gè)batch的大小,#因?yàn)槲覀冇?xùn)練時(shí)用的是Minibatch SGD,因此input這樣定義#n_in,即上一層(隱含層)的輸出#n_out,輸出的類別數(shù) class

20、LogisticRegression(object): def _init_(self, input, n_in, n_out):#W大小是n_in行n_out列,b為n_out維向量。即:每個(gè)輸出對(duì)應(yīng)W的一列以及b的一個(gè)元素。 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

21、.config.floatX ), name='b', borrow=True )#input是(n_example,n_in),W是(n_in,n_out),點(diǎn)乘得到(n_example,n_out),加上偏置b,#再作為T.nnet.softmax的輸入,得到p_y_given_x#故p_y_given_x每一行代表每一個(gè)樣本被估計(jì)為各類別的概率 #PS:b是n_out維向量,與(n_example,n_out)矩陣相加,內(nèi)部其實(shí)是先復(fù)制n_example個(gè)b,#然后(n_example,n_out)矩陣的每一行都加b self.p_y_given_x = T.nnet.s

22、oftmax(T.dot(input, self.W) + self.b)#argmax返回最大值下標(biāo),因?yàn)楸纠龜?shù)據(jù)集是MNIST,下標(biāo)剛好就是類別。axis=1表示按行操作。 self.y_pred = T.argmax(self.p_y_given_x, axis=1)#params,LogisticRegression的參數(shù) self.params = self.W, self.b到這里,CNN的基本”構(gòu)件“都有了,下面要用這些”構(gòu)件“組裝成LeNet5(當(dāng)然,是簡化的,上面已經(jīng)說了),具體來說,就是組裝成:LeNet5=input+LeNetConvPoolLayer_1+LeNetC

23、onvPoolLayer_2+HiddenLayer+LogisticRegression+output。然后將其應(yīng)用于MNIST數(shù)據(jù)集,用BP算法去解這個(gè)模型,得到最優(yōu)的參數(shù)。(3)加載MNIST數(shù)據(jù)集(mnist.pkl.gz)"""加載MNIST數(shù)據(jù)集load_data()"""def load_data(dataset): # dataset是數(shù)據(jù)集的路徑,程序首先檢測該路徑下有沒有MNIST數(shù)據(jù)集,沒有的話就下載MNIST數(shù)據(jù)集 #這一部分就不解釋了,與softmax回歸算法無關(guān)。 data_dir, data_file =

24、 os.path.split(dataset) if data_dir = "" and not os.path.isfile(dataset): # Check if dataset is in the data directory. new_path = os.path.join( os.path.split(_file_)0, ".", "data", dataset ) if os.path.isfile(new_path) or data_file = 'mnist.pkl.gz': dataset = ne

25、w_path if (not os.path.isfile(dataset) and data_file = 'mnist.pkl.gz': import urllib origin = ( 'http:/www.iro.umontreal.ca/lisa/deep/data/mnist/mnist.pkl.gz' ) print 'Downloading data from %s' % origin urllib.urlretrieve(origin, dataset) print '. loading data'#以上是檢測并

26、下載數(shù)據(jù)集mnist.pkl.gz,不是本文重點(diǎn)。下面才是load_data的開始 #從"mnist.pkl.gz"里加載train_set, valid_set, test_set,它們都是包括label的#主要用到python里的gzip.open()函數(shù),以及 cPickle.load()。#rb表示以二進(jìn)制可讀的方式打開文件 f = gzip.open(dataset, 'rb') train_set, valid_set, test_set = cPickle.load(f) f.close() #將數(shù)據(jù)設(shè)置成shared variables,主要

27、時(shí)為了GPU加速,只有shared variables才能存到GPU memory中#GPU里數(shù)據(jù)類型只能是float。而data_y是類別,所以最后又轉(zhuǎn)換為int返回 def shared_dataset(data_xy, borrow=True): data_x, data_y = data_xy shared_x = theano.shared(numpy.asarray(data_x, dtype=theano.config.floatX), borrow=borrow) shared_y = theano.shared(numpy.asarray(data_y, dtype=thea

28、no.config.floatX), borrow=borrow) return shared_x, T.cast(shared_y, 'int32') test_set_x, test_set_y = shared_dataset(test_set) valid_set_x, valid_set_y = shared_dataset(valid_set) train_set_x, train_set_y = shared_dataset(train_set) rval = (train_set_x, train_set_y), (valid_set_x, valid_set_

29、y), (test_set_x, test_set_y) return rval(4)實(shí)現(xiàn)LeNet5并測試"""實(shí)現(xiàn)LeNet5LeNet5有兩個(gè)卷積層,第一個(gè)卷積層有20個(gè)卷積核,第二個(gè)卷積層有50個(gè)卷積核"""def evaluate_lenet5(learning_rate=0.1, n_epochs=200, dataset='mnist.pkl.gz', nkerns=20, 50, batch_size=500): """ learning_rate:學(xué)習(xí)速率,隨機(jī)梯度前的系

30、數(shù)。 n_epochs訓(xùn)練步數(shù),每一步都會(huì)遍歷所有batch,即所有樣本 batch_size,這里設(shè)置為500,即每遍歷完500個(gè)樣本,才計(jì)算梯度并更新參數(shù) nkerns=20, 50,每一個(gè)LeNetConvPoolLayer卷積核的個(gè)數(shù),第一個(gè)LeNetConvPoolLayer有 20個(gè)卷積核,第二個(gè)有50個(gè) """ rng = numpy.random.RandomState(23455) #加載數(shù)據(jù) datasets = load_data(dataset) train_set_x, train_set_y = datasets0 valid_set_

31、x, valid_set_y = datasets1 test_set_x, test_set_y = datasets2 # 計(jì)算batch的個(gè)數(shù) n_train_batches = train_set_x.get_value(borrow=True).shape0 n_valid_batches = valid_set_x.get_value(borrow=True).shape0 n_test_batches = test_set_x.get_value(borrow=True).shape0 n_train_batches /= batch_size n_valid_batches /

32、= batch_size n_test_batches /= batch_size #定義幾個(gè)變量,index表示batch下標(biāo),x表示輸入的訓(xùn)練數(shù)據(jù),y對(duì)應(yīng)其標(biāo)簽 index = T.lscalar() x = T.matrix('x') y = T.ivector('y') # # BUILD ACTUAL MODEL # # print '. building the model'#我們加載進(jìn)來的batch大小的數(shù)據(jù)是(batch_size, 28 * 28),但是LeNetConvPoolLayer的輸入是四維的,所以要reshape l

33、ayer0_input = x.reshape(batch_size, 1, 28, 28)# layer0即第一個(gè)LeNetConvPoolLayer層#輸入的單張圖片(28,28),經(jīng)過conv得到(28-5+1 , 28-5+1) = (24, 24),#經(jīng)過maxpooling得到(24/2, 24/2) = (12, 12)#因?yàn)槊總€(gè)batch有batch_size張圖,第一個(gè)LeNetConvPoolLayer層有nkerns0個(gè)卷積核,#故layer0輸出為(batch_size, nkerns0, 12, 12) layer0 = LeNetConvPoolLayer( rng

34、, input=layer0_input, image_shape=(batch_size, 1, 28, 28), filter_shape=(nkerns0, 1, 5, 5), poolsize=(2, 2) )#layer1即第二個(gè)LeNetConvPoolLayer層#輸入是layer0的輸出,每張?zhí)卣鲌D為(12,12),經(jīng)過conv得到(12-5+1, 12-5+1) = (8, 8),#經(jīng)過maxpooling得到(8/2, 8/2) = (4, 4)#因?yàn)槊總€(gè)batch有batch_size張圖(特征圖),第二個(gè)LeNetConvPoolLayer層有nkerns1個(gè)卷積核#,

35、故layer1輸出為(batch_size, nkerns1, 4, 4) layer1 = LeNetConvPoolLayer( rng, input=layer0.output, image_shape=(batch_size, nkerns0, 12, 12),#輸入nkerns0張?zhí)卣鲌D,即layer0輸出nkerns0張?zhí)卣鲌D filter_shape=(nkerns1, nkerns0, 5, 5), poolsize=(2, 2) )#前面定義好了兩個(gè)LeNetConvPoolLayer(layer0和layer1),layer1后面接layer2,這是一個(gè)全連接層,相當(dāng)于ML

36、P里面的隱含層#故可以用MLP中定義的HiddenLayer來初始化layer2,layer2的輸入是二維的(batch_size, num_pixels) ,#故要將上層中同一張圖經(jīng)不同卷積核卷積出來的特征圖合并為一維向量,#也就是將layer1的輸出(batch_size, nkerns1, 4, 4)flatten為(batch_size, nkerns1*4*4)=(500,800),作為layer2的輸入。#(500,800)表示有500個(gè)樣本,每一行代表一個(gè)樣本。layer2的輸出大小是(batch_size,n_out)=(500,500) layer2_input = laye

37、r1.output.flatten(2) layer2 = HiddenLayer( rng, input=layer2_input, n_in=nkerns1 * 4 * 4, n_out=500, activation=T.tanh )#最后一層layer3是分類層,用的是邏輯回歸中定義的LogisticRegression,#layer3的輸入是layer2的輸出(500,500),layer3的輸出就是(batch_size,n_out)=(500,10) layer3 = LogisticRegression(input=layer2.output, n_in=500, n_out=

38、10)#代價(jià)函數(shù)NLL cost = layer3.negative_log_likelihood(y)# test_model計(jì)算測試誤差,x、y根據(jù)給定的index具體化,然后調(diào)用layer3,#layer3又會(huì)逐層地調(diào)用layer2、layer1、layer0,故test_model其實(shí)就是整個(gè)CNN結(jié)構(gòu),#test_model的輸入是x、y,輸出是layer3.errors(y)的輸出,即誤差。 test_model = theano.function( index, layer3.errors(y), givens= x: test_set_xindex * batch_size:

39、(index + 1) * batch_size, y: test_set_yindex * batch_size: (index + 1) * batch_size )#validate_model,驗(yàn)證模型,分析同上。 validate_model = theano.function( index, layer3.errors(y), givens= x: valid_set_xindex * batch_size: (index + 1) * batch_size, y: valid_set_yindex * batch_size: (index + 1) * batch_size )#

40、下面是train_model,涉及到優(yōu)化算法即SGD,需要計(jì)算梯度、更新參數(shù) #參數(shù)集 params = layer3.params + layer2.params + layer1.params + layer0.params #對(duì)各個(gè)參數(shù)的梯度 grads = T.grad(cost, params)#因?yàn)閰?shù)太多,在updates規(guī)則里面一個(gè)一個(gè)具體地寫出來是很麻煩的,所以下面用了一個(gè)for.in.,自動(dòng)生成規(guī)則對(duì)(param_i, param_i - learning_rate * grad_i) updates = (param_i, param_i - learning_rate

41、* grad_i) for param_i, grad_i in zip(params, grads) #train_model,代碼分析同test_model。train_model里比test_model、validation_model多出updates規(guī)則 train_model = theano.function( index, cost, updates=updates, givens= x: train_set_xindex * batch_size: (index + 1) * batch_size, y: train_set_yindex * batch_size: (ind

42、ex + 1) * batch_size ) # # 開始訓(xùn)練 # # print '. training' patience = 10000 patience_increase = 2 improvement_threshold = 0.995 validation_frequency = min(n_train_batches, patience / 2) #這樣設(shè)置validation_frequency可以保證每一次epoch都會(huì)在驗(yàn)證集上測試。 best_validation_loss = numpy.inf #最好的驗(yàn)證集上的loss,最好即最小 best_iter

43、 = 0 #最好的迭代次數(shù),以batch為單位。比如best_iter=10000,說明在訓(xùn)練完第10000個(gè)batch時(shí),達(dá)到best_validation_loss test_score = 0. start_time = time.clock() epoch = 0 done_looping = False#下面就是訓(xùn)練過程了,while循環(huán)控制的時(shí)步數(shù)epoch,一個(gè)epoch會(huì)遍歷所有的batch,即所有的圖片。#for循環(huán)是遍歷一個(gè)個(gè)batch,一次一個(gè)batch地訓(xùn)練。for循環(huán)體里會(huì)用train_model(minibatch_index)去訓(xùn)練模型,#train_model里

44、面的updatas會(huì)更新各個(gè)參數(shù)。#for循環(huán)里面會(huì)累加訓(xùn)練過的batch數(shù)iter,當(dāng)iter是validation_frequency倍數(shù)時(shí)則會(huì)在驗(yàn)證集上測試,#如果驗(yàn)證集的損失this_validation_loss小于之前最佳的損失best_validation_loss,#則更新best_validation_loss和best_iter,同時(shí)在testset上測試。#如果驗(yàn)證集的損失this_validation_loss小于best_validation_loss*improvement_threshold時(shí)則更新patience。#當(dāng)達(dá)到最大步數(shù)n_epoch時(shí),或者patience<iter時(shí),結(jié)束訓(xùn)練 while (epoch < n_epochs) and (not done_looping): epoch = epoch + 1 for minibatch_index in xrange(n_train_batches): i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論