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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

CNN-2: AlexNet 卷积神经网络模型

發(fā)布時間:2024/1/17 卷积神经网络 97 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CNN-2: AlexNet 卷积神经网络模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、AlexNet 模型簡介

由于受到計算機(jī)性能的影響,雖然LeNet在圖像分類中取得了較好的成績,但是并沒有引起很多的關(guān)注。 知道2012年,Alex等人提出的AlexNet網(wǎng)絡(luò)在ImageNet大賽上以遠(yuǎn)超第二名的成績奪冠,卷積神經(jīng)網(wǎng)絡(luò)乃至深度學(xué)習(xí)重新引起了廣泛的關(guān)注。

2、AlexNet 模型特點(diǎn)

AlexNet是在LeNet的基礎(chǔ)上加深了網(wǎng)絡(luò)的結(jié)構(gòu),學(xué)習(xí)更豐富更高維的圖像特征。AlexNet的特點(diǎn):
1)更深的網(wǎng)絡(luò)結(jié)構(gòu)
2)使用層疊的卷積層,即卷積層+卷積層+池化層來提取圖像的特征
3)使用Dropout抑制過擬合
4)使用數(shù)據(jù)增強(qiáng)Data Augmentation抑制過擬合
5)使用Relu替換之前的sigmoid的作為激活函數(shù)
6)多GPU訓(xùn)練

ReLu作為激活函數(shù)

在最初的感知機(jī)模型中,輸入和輸出的關(guān)系如下:

?????????????${y = \sum\limits_i {{w_i}{x_i}}? + b}$

只是單純的線性關(guān)系,這樣的網(wǎng)絡(luò)結(jié)構(gòu)有很大的局限性:即使用很多這樣結(jié)構(gòu)的網(wǎng)絡(luò)層疊加,其輸出和輸入仍然是線性關(guān)系,無法處理有非線性關(guān)系的輸入輸出。因此,對每個神經(jīng)元的輸出做個非線性的轉(zhuǎn)換也就是,將上面就加權(quán)求和${\sum\nolimits_i {{w_i}{x_i}}? + b}$的結(jié)果輸入到一個非線性函數(shù),也就是激活函數(shù)中。 這樣,由于激活函數(shù)的引入,多個網(wǎng)絡(luò)層的疊加就不再是單純的線性變換,而是具有更強(qiáng)的表現(xiàn)能力。

在最初,sigmoidtanh函數(shù)最常用的激活函數(shù)。

1) sigmoid

????????????${\sigma \left( x \right) = \frac{1}{{1 + {e^{ - x}}}}}$?

在網(wǎng)絡(luò)層數(shù)較少時,sigmoid函數(shù)的特性能夠很好的滿足激活函數(shù)的作用:它把一個實(shí)數(shù)壓縮至0到1之間,當(dāng)輸入的數(shù)字非常大的時候,結(jié)果會接近1;當(dāng)輸入非常大的負(fù)數(shù)時,則會得到接近0的結(jié)果。這種特性,能夠很好的模擬神經(jīng)元在受刺激后,是否被激活向后傳遞信息(輸出為0,幾乎不被激活;輸出為1,完全被激活)。

sigmoid一個很大的問題就是梯度飽和。 觀察sigmoid函數(shù)的曲線,當(dāng)輸入的數(shù)字較大(或較小)時,其函數(shù)值趨于不變,其導(dǎo)數(shù)變的非常的小。這樣,在層數(shù)很多的的網(wǎng)絡(luò)結(jié)構(gòu)中,進(jìn)行反向傳播時,由于很多個很小的sigmoid導(dǎo)數(shù)累成,導(dǎo)致其結(jié)果趨于0,權(quán)值更新較慢。

2) ReLu

?????????????${ReLU\left( x \right) = max\left( {0\user1{,}x} \right)}$?


針對sigmoid梯度飽和導(dǎo)致訓(xùn)練收斂慢的問題,在AlexNet中引入了ReLU。ReLU是一個分段線性函數(shù),小于等于0則輸出為0;大于0的則恒等輸出。相比于sigmoid,ReLU有以下有點(diǎn):
1)計算開銷下。sigmoid的正向傳播有指數(shù)運(yùn)算,倒數(shù)運(yùn)算,而ReLu是線性輸出;反向傳播中,sigmoid有指數(shù)運(yùn)算,而ReLU有輸出的部分,導(dǎo)數(shù)始終為1.
2)梯度飽和問題
3)稀疏性。Relu會使一部分神經(jīng)元的輸出為0,這樣就造成了網(wǎng)絡(luò)的稀疏性,并且減少了參數(shù)的相互依存關(guān)系,緩解了過擬合問題的發(fā)生。

這里有個問題,前面提到,激活函數(shù)要用非線性的,是為了使網(wǎng)絡(luò)結(jié)構(gòu)有更強(qiáng)的表達(dá)的能力。那這里使用ReLU本質(zhì)上卻是個線性的分段函數(shù),是怎么進(jìn)行非線性變換的。? 這里把神經(jīng)網(wǎng)絡(luò)看著一個巨大的變換矩陣M,其輸入為所有訓(xùn)練樣本組成的矩陣A,輸出為矩陣B。

??????????????${B = M \cdot A}$

這里的M是一個線性變換的話,則所有的訓(xùn)練樣本A進(jìn)行了線性變換輸出為B。? 那么對于ReLU來說,由于其是分段的,0的部分可以看著神經(jīng)元沒有激活,不同的神經(jīng)元激活或者不激活,其神經(jīng)玩過組成的變換矩陣是不一樣的。也就是說,每個訓(xùn)練樣本使用的線性變換矩陣是不一樣的,在整個訓(xùn)練樣本空間來說,其經(jīng)歷的是非線性變換。

簡單來說,不同訓(xùn)練樣本中的同樣的特征,在經(jīng)過神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)時,流經(jīng)的神經(jīng)元是不一樣的(激活函數(shù)值為0的神經(jīng)元不會被激活)。這樣,最終的輸出實(shí)際上是輸入樣本的非線性變換。單個訓(xùn)練樣本是線性變換,但是每個訓(xùn)練樣本的線性變換是不一樣的,這樣整個訓(xùn)練樣本集來說,就是非線性的變換。

數(shù)據(jù)增強(qiáng)

神經(jīng)網(wǎng)絡(luò)由于訓(xùn)練的參數(shù)多,表能能力強(qiáng),所以需要比較多的數(shù)據(jù)量,不然很容易過擬合。當(dāng)訓(xùn)練數(shù)據(jù)有限時,可以通過一些變換從已有的訓(xùn)練數(shù)據(jù)集中生成一些新的數(shù)據(jù),以快速地擴(kuò)充訓(xùn)練數(shù)據(jù)。對于圖像數(shù)據(jù)集來說,可以對圖像進(jìn)行一些形變操作:
1) 翻轉(zhuǎn)
2) 隨機(jī)裁剪
3)平移,顏色光照的變換
...

?AlexNet中對數(shù)據(jù)做了以下操作:
1)隨機(jī)裁剪,對256×256的圖片進(jìn)行隨機(jī)裁剪到227×227,然后進(jìn)行水平翻轉(zhuǎn)。
2)測試的時候,對左上、右上、左下、右下、中間分別做了5次裁剪,然后翻轉(zhuǎn),共10個裁剪,之后對結(jié)果求平均。
3)對RGB空間做PCA(主成分分析),然后對主成分做一個(0, 0.1)的高斯擾動,也就是對顏色、光照作變換,結(jié)果使錯誤率又下降了1%。

?層疊池化

在LeNet中池化是不重疊的,即池化的窗口的大小和步長是相等的,如下:

在AlexNet中使用的池化(Pooling)卻是可重疊的,也就是說,在池化的時候,每次移動的步長小于池化的窗口長度。AlexNet池化的大小為3×3的正方形,每次池化移動步長為2,這樣就會出現(xiàn)重疊。重疊池化可以避免過擬合,這個策略貢獻(xiàn)了0.3%的Top-5錯誤率。與非重疊方案s=2,z=2相比,輸出的維度是相等的,并且能在一定程度上抑制過擬合。

?局部相應(yīng)歸一化

ReLU具有讓人滿意的特性,它不需要通過輸入歸一化來防止飽和。如果至少一些訓(xùn)練樣本對ReLU產(chǎn)生了正輸入,那么那個神經(jīng)元上將發(fā)生學(xué)習(xí)。然而,我們?nèi)匀话l(fā)現(xiàn)接下來的局部響應(yīng)歸一化有助于泛化。${a_{x{,}y}^i}$表示神經(jīng)元激活,通過在(x,y)(位置應(yīng)用核${i}$然后應(yīng)用ReLU非線性來計算,響應(yīng)歸一化激活${b_{x{,}y}^i}$通過下式給定:

??????????? ${b_{x{,}y}^i = \frac{{a_{x{,}y}^i}}{{{{\left( {k + \alpha \sum\limits_{j = {max}\left( {{0,}{{{i - n}} \mathord{\left/
?{\vphantom {{{i - n}} 2}} \right.
?\kern-\nulldelimiterspace} 2}} \right)}^{{min(N - 1,}{{{i + n}} \mathord{\left/
?{\vphantom {{{i + n}} 2}} \right.
?\kern-\nulldelimiterspace} 2}{)}} {{{\left( {a_{x{,}y}^j} \right)}^2}} } \right)}^\beta }}}}$

其中,N是卷積核的個數(shù),也就是生成的FeatureMap的個數(shù);${k{,}\alpha {,}\beta {,}n}$是超參數(shù),論文中使用的值是${k = 2{,}\alpha? = {10^{ - 4}}{,}\beta? = 0.75{,}n = 5}$。輸出${b_{x{,}y}^i}$和輸入${a_{x{,}y}^i}$的上標(biāo)表示的是當(dāng)前值所在的通道,也即是疊加的方向是沿著通道進(jìn)行。將要?dú)w一化的值${a_{x{,}y}^i}$所在附近通道相同位置的值的平方累加起來${\sum\nolimits_{j = {max}\left( {{0,}{{{i - n}} \mathord{\left/
?{\vphantom {{{i - n}} 2}} \right.
?\kern-\nulldelimiterspace} 2}} \right)}^{{min(N - 1,}{{{i + n}} \mathord{\left/
?{\vphantom {{{i + n}} 2}} \right.
?\kern-\nulldelimiterspace} 2}{)}} {{{\left( {a_{x{,}y}^j} \right)}^2}} }$

Dropout

這個是比較常用的抑制過擬合的方法了。 引入Dropout主要是為了防止過擬合。在神經(jīng)網(wǎng)絡(luò)中Dropout通過修改神經(jīng)網(wǎng)絡(luò)本身結(jié)構(gòu)來實(shí)現(xiàn),對于某一層的神經(jīng)元,通過定義的概率將神經(jīng)元置為0,這個神經(jīng)元就不參與前向和后向傳播,就如同在網(wǎng)絡(luò)中被刪除了一樣,同時保持輸入層與輸出層神經(jīng)元的個數(shù)不變,然后按照神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法進(jìn)行參數(shù)更新。在下一次迭代中,又重新隨機(jī)刪除一些神經(jīng)元(置為0),直至訓(xùn)練結(jié)束。 Dropout應(yīng)該算是AlexNet中一個很大的創(chuàng)新,現(xiàn)在神經(jīng)網(wǎng)絡(luò)中的必備結(jié)構(gòu)之一。Dropout也可以看成是一種模型組合,每次生成的網(wǎng)絡(luò)結(jié)構(gòu)都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓(xùn)練時間即可實(shí)現(xiàn)模型組合(類似取平均)的效果,非常高效。 如下圖:

3、Alex網(wǎng)絡(luò)結(jié)構(gòu)

注:上圖中的輸入是224×224,不過經(jīng)過計算(224?11)/4=54.75并不是論文中的55×55,而使用227×227作為輸入,則(227?11)/4=55。

網(wǎng)絡(luò)包含8個帶權(quán)重的層;前5層是卷積層,剩下的3層是全連接層。最后一層全連接層的輸出是1000維softmax的輸入,softmax會產(chǎn)生1000類標(biāo)簽的分布網(wǎng)絡(luò)包含8個帶權(quán)重的層;前5層是卷積層,剩下的3層是全連接層。最后一層全連接層的輸出是1000維softmax的輸入,softmax會產(chǎn)生1000類標(biāo)簽的分布。

  • 卷積層C1

??????????該層的處理流程是: 卷積-->ReLU-->池化-->歸一化。
????????? 1)卷積,輸入是227×227,使用96個11×11×3的卷積核,得到的FeatureMap為55×55×96。
??????????2)ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。
????????? 3)池化,使用3×3步長為2的池化單元(重疊池化,步長小于池化單元的寬度),輸出為27×27×96((55?3)/2+1=27)。
????????? 4)局部響應(yīng)歸一化,使用k=2,n=5,α=10?4,β=0.75進(jìn)行局部歸一化,輸出的仍然為27×27×96,輸出分為兩組,每組的大小為27×27×48。

  • ?卷積層C2

??????????? 該層的處理流程是:卷積-->ReLU-->池化-->歸一化。
??????????? 1)卷積,輸入是2組27×27×48。使用2組,每組128個尺寸為5×5×48的卷積核,并作了邊緣填充padding=2,卷積的步長為1. 則輸出的FeatureMap為2組,每組的大小為 27×27 times128. ((27+2?2?5)/1+1=27)。
??????????? 2)ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。
????????????3)池化運(yùn)算的尺寸為3×3,步長為2,池化后圖像的尺寸為(27?3)/2+1=13,輸出為13×13×256。
??????????? 4)局部響應(yīng)歸一化,使用k=2,n=5,α=10?4,β=0.75進(jìn)行局部歸一化,輸出的仍然為13×13×256,輸出分為2組,每組的大小為13×13×128。

  • 卷積層C3

?????????? 該層的處理流程是: 卷積-->ReLU。
?????????? 1)卷積,輸入是13×13×256,使用2組共384尺寸為3×3×256的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為13×13 times384。
???????????2)ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。

  • 卷積層C4

???????????該層的處理流程是: 卷積-->ReLU
???????????該層和C3類似。
?????????? 1)卷積,輸入是13×13×384,分為兩組,每組為13×13×192.使用2組,每組192個尺寸為3×3×192的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為13×13 times384,分為兩組,每組為13×13×192。
???????????2)ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。

  • 卷積層C5

?????????? 該層處理流程為:卷積-->ReLU-->池化
???????????卷積,輸入為13×13×384,分為兩組,每組為13×13×192。使用2組,每組為128尺寸為3×3×192的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為13×13×256。
???????????ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數(shù)中。
???????????池化,池化運(yùn)算的尺寸為3×3,步長為2,池化后圖像的尺寸為 (13?3)/2+1=6,即池化后的輸出為6×6×256。

  • 全連接層FC6

????????? 該層的流程為:(卷積)全連接 -->ReLU -->Dropout
????????? 1)卷積->全連接: 輸入為6×6×256,該層有4096個卷積核,每個卷積核的大小為6×6×256。由于卷積核的尺寸剛好與待處理特征圖(輸入)的尺寸相同,即卷積核中的每個系數(shù)只與特征圖(輸入)尺寸的一個像素值相乘,一一對應(yīng),因此,該層被稱為全連接層。由于卷積核與特征圖的尺寸相同,卷積運(yùn)算后只有一個值,因此,卷積后的像素層尺寸為4096×1×1,即有4096個神經(jīng)元。
????????? 2)ReLU,這4096個運(yùn)算結(jié)果通過ReLU激活函數(shù)生成4096個值
????????? 3)Dropout,抑制過擬合,隨機(jī)的斷開某些神經(jīng)元的連接或者是不激活某些神經(jīng)元。

  • 全連接層FC7

??????????流程為:全連接-->ReLU-->Dropout
????????? 1)全連接,輸入為4096的向量。
????????? 2)ReLU,這4096個運(yùn)算結(jié)果通過ReLU激活函數(shù)生成4096個值。
????????? 3)Dropout,抑制過擬合,隨機(jī)的斷開某些神經(jīng)元的連接或者是不激活某些神經(jīng)元。

  • 輸出層

?????????? 第七層輸出的4096個數(shù)據(jù)與第八層的1000個神經(jīng)元進(jìn)行全連接,經(jīng)過訓(xùn)練后輸出1000個float型的值,這就是預(yù)測結(jié)果。

4)AlexNet參數(shù)數(shù)量

卷積層的參數(shù) = 卷積核的數(shù)量 * 卷積核 + 偏置
C1: 96個11×11×3的卷積核,96×11×11×3+96=34848
C2: 2組,每組128個5×5×48的卷積核,(128×5×5×48+128)×2=307456
C3: 384個3×3×256的卷積核,3×3×256×384+384=885120
C4: 2組,每組192個3×3×192的卷積核,(3×3×192×192+192)×2=663936
C5: 2組,每組128個3×3×192的卷積核,(3×3×192×128+128)×2=442624
FC6: 4096個6×6×256的卷積核,6×6×256×4096+4096=37752832
FC7: 4096?4096+4096=16781312
output: 4096?1000=4096000
卷積層 C2,C4,C5中的卷積核只和位于同一GPU的上一層的FeatureMap相連。從上面可以看出,參數(shù)大多數(shù)集中在全連接層,在卷積層由于權(quán)值共享,權(quán)值參數(shù)較少。

5)AlexNet模型TensorFlow實(shí)現(xiàn)

開發(fā)環(huán)境:?Python - 3.0、TensorFlow - 1.4.0、無GPU

# -*- coding: utf-8 -*- """ Created on 2017@author: 黃文堅、唐源 """ # 6.1 TensorFlow 實(shí)現(xiàn) AlexNet # 2012年 Hinton 的學(xué)生 ALex Krizhevsky 提出 # 為 LeNet的一種更深更寬的版本 # 首次在CNN 中成功應(yīng)用了 ReLU激活函數(shù)解決Sigmoid在網(wǎng)絡(luò)較深時的梯度彌散問題、 # Dropout 隨機(jī)忽略一部分神經(jīng)元,以避免模型過擬合(全連接層使用) # 使用重疊的最大池化,且步長比池化核的尺寸小,此前普遍使用的是平均池化,避免平均池化的模糊化效果 # 提出LRN層對局部神經(jīng)元的活動創(chuàng)建競爭機(jī)制,增強(qiáng)模型泛化能力 # 使用 GPU 進(jìn)行運(yùn)算加速、增強(qiáng)數(shù)據(jù) # 5個卷積層、其中3個卷積層后連接了最大池化層,最后還有3個全連接層from datetime import datetime import math import time import tensorflow as tfbatch_size=32 num_batches=100def print_activations(t):print(t.op.name, ' ', t.get_shape().as_list())def inference(images):parameters = []# conv1with tf.name_scope('conv1') as scope:#定義卷積層參數(shù):前兩個為尺寸 11*11(標(biāo)準(zhǔn)差0.1)、第三個為當(dāng)前層節(jié)點(diǎn)矩陣的深度 3、第四個為卷積層的深度 64kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], dtype=tf.float32,stddev=1e-1), name='weights')#tf.nn.conv2d 提供了一個方便的卷積層前向傳播函數(shù)#參數(shù)1:當(dāng)前層的節(jié)點(diǎn)矩陣,四維矩陣,第一維度對應(yīng)一個輸入batch,如第一張圖片,第二張圖片..#參數(shù)2:卷積層參數(shù)#參數(shù)3:不同維度上的步長(第一維、最后一維必須為1)#參數(shù)4:提供'SAME'和'VALLD'選擇,'SAME'為添加全0填充,'VALLD'為不添加conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='SAME')#定義偏置項為 1,及下一層節(jié)點(diǎn)矩陣的深度 1(參數(shù)共享)biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),trainable=True, name='biases')#tf.nn.bias_add提供給每個conv節(jié)點(diǎn)加上偏置項bias = tf.nn.bias_add(conv, biases)#將計算結(jié)果通過ReLU激活函數(shù)完成去線性化conv1 = tf.nn.relu(bias, name=scope)print_activations(conv1)parameters += [kernel, biases]# pool1lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='lrn1')#tf.nn.max_pool 提供了一個方便的最大池化層的前向傳播過程。#tf.nn.avg_pool 提供了一個方便的平均池化層的前向傳播過程,兩者參數(shù)一致。#參數(shù)1:四維矩陣,第一維度對應(yīng)一個輸入batch,如第一張圖片,第二張圖片.#參數(shù)2:ksize為過濾器參數(shù),常為[1, 2, 2, 1]、[1, 3, 3, 1]#參數(shù)3:不同維度上的步長(第一維、最后一維必須為1)#參數(shù)4:提供'SAME'和'VALLD'選擇,'SAME'為添加全0填充,'VALLD'為不添加pool1 = tf.nn.max_pool(lrn1,ksize=[1, 3, 3, 1],strides=[1, 2, 2, 1],padding='VALID',name='pool1')print_activations(pool1)# conv2with tf.name_scope('conv2') as scope:kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32,stddev=1e-1), name='weights')conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding='SAME')biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32),trainable=True, name='biases')bias = tf.nn.bias_add(conv, biases)conv2 = tf.nn.relu(bias, name=scope)parameters += [kernel, biases]print_activations(conv2)# pool2lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75, name='lrn2')pool2 = tf.nn.max_pool(lrn2,ksize=[1, 3, 3, 1],strides=[1, 2, 2, 1],padding='VALID',name='pool2')print_activations(pool2)# conv3with tf.name_scope('conv3') as scope:kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384],dtype=tf.float32,stddev=1e-1), name='weights')conv = tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding='SAME')biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32),trainable=True, name='biases')bias = tf.nn.bias_add(conv, biases)conv3 = tf.nn.relu(bias, name=scope)parameters += [kernel, biases]print_activations(conv3)# conv4with tf.name_scope('conv4') as scope:kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256],dtype=tf.float32,stddev=1e-1), name='weights')conv = tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding='SAME')biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),trainable=True, name='biases')bias = tf.nn.bias_add(conv, biases)conv4 = tf.nn.relu(bias, name=scope)parameters += [kernel, biases]print_activations(conv4)# conv5with tf.name_scope('conv5') as scope:kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256],dtype=tf.float32,stddev=1e-1), name='weights')conv = tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding='SAME')biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),trainable=True, name='biases')bias = tf.nn.bias_add(conv, biases)conv5 = tf.nn.relu(bias, name=scope)parameters += [kernel, biases]print_activations(conv5)# pool5pool5 = tf.nn.max_pool(conv5,ksize=[1, 3, 3, 1],strides=[1, 2, 2, 1],padding='VALID',name='pool5')print_activations(pool5)return pool5, parametersdef time_tensorflow_run(session, target, info_string): # """Run the computation to obtain the target tensor and print timing stats. # # Args: # session: the TensorFlow session to run the computation under. # target: the target Tensor that is passed to the session's run() function. # info_string: a string summarizing this run, to be printed with the stats. # # Returns: # None # """num_steps_burn_in = 10total_duration = 0.0total_duration_squared = 0.0for i in range(num_batches + num_steps_burn_in):start_time = time.time()_ = session.run(target)duration = time.time() - start_timeif i >= num_steps_burn_in:if not i % 10:print ('%s: step %d, duration = %.3f' %(datetime.now(), i - num_steps_burn_in, duration))total_duration += durationtotal_duration_squared += duration * durationmn = total_duration / num_batchesvr = total_duration_squared / num_batches - mn * mnsd = math.sqrt(vr)print ('%s: %s across %d steps, %.3f +/- %.3f sec / batch' %(datetime.now(), info_string, num_batches, mn, sd)) #計算每輪迭代耗時的評測函數(shù)(平均耗時、標(biāo)準(zhǔn)差)def run_benchmark(): # """Run the benchmark on AlexNet.""" with tf.Graph().as_default():# Generate some dummy images.image_size = 224# Note that our padding definition is slightly different the cuda-convnet.# In order to force the model to start with the same activations sizes,# we add 3 to the image_size and employ VALID padding above.images = tf.Variable(tf.random_normal([batch_size, #使用隨機(jī)圖片數(shù)據(jù) image_size,image_size, 3],dtype=tf.float32,stddev=1e-1))# Build a Graph that computes the logits predictions from the# inference model.pool5, parameters = inference(images) #得到池化層的輸出pool5和網(wǎng)絡(luò)中需要訓(xùn)練的參數(shù)集合# Build an initialization operation.init = tf.global_variables_initializer()# Start running operations on the Graph.config = tf.ConfigProto()config.gpu_options.allocator_type = 'BFC'sess = tf.Session(config=config)sess.run(init)# Run the forward benchmark.time_tensorflow_run(sess, pool5, "Forward") #計算運(yùn)行時間# Add a simple objective so we can calculate the backward pass.objective = tf.nn.l2_loss(pool5)# Compute the gradient with respect to all the parameters.grad = tf.gradients(objective, parameters)# Run the backward benchmark.time_tensorflow_run(sess, grad, "Forward-backward")if __name__ == "__main__":run_benchmark() View Code

參考文獻(xiàn)

[1]?https://www.cnblogs.com/wangguchangqing/p/10333370.html

[2]?Krizhevsky A , Sutskever I , Hinton G . ImageNet Classification with Deep Convolutional Neural Networks[C]// NIPS. Curran Associates Inc. 2012.

[3]?黃文堅、唐源等.?TensorFlow 實(shí)戰(zhàn) [M] , 北京:電子工業(yè)出版社,2017.

轉(zhuǎn)載于:https://www.cnblogs.com/ai-learning-blogs/p/11107819.html

總結(jié)

以上是生活随笔為你收集整理的CNN-2: AlexNet 卷积神经网络模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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