Tensorflow實(shí)現(xiàn)AlexNet


AlexNet把CNN的基本原理應(yīng)用到了深度神經(jīng)網(wǎng)絡(luò)中,同時(shí)應(yīng)用了許多新的技術(shù):

  1. 將ReLU作為CNN的激活函數(shù),成功解決了Sigmoid在網(wǎng)絡(luò)較深時(shí)的梯度彌散問題
  2. 訓(xùn)練時(shí)使用Dropout隨機(jī)忽略一部分神經(jīng)豹悬,以避免模型過擬合咳促。
過擬合是機(jī)器學(xué)習(xí)中一個(gè)常見的問題赵辕。Hinton教授團(tuán)隊(duì)提出了一個(gè)簡(jiǎn)單
有效的方法心包,Dropout,將神經(jīng)網(wǎng)絡(luò)某一層的輸出節(jié)點(diǎn)數(shù)據(jù)隨機(jī)丟棄一
部分障簿,實(shí)質(zhì)上等于創(chuàng)造出了很多新的隨機(jī)樣本盹愚,通過增大樣本、減少特
征數(shù)量來防止過擬合站故,可以理解為每次丟棄節(jié)點(diǎn)數(shù)據(jù)是對(duì)特征的一種采樣皆怕。
  1. 在CNN中使用重疊的最大池化。避免平均池化的模糊化效果西篓,同時(shí)讓步長(zhǎng)比池化核的尺寸小愈腾,這樣池化層的輸出之間會(huì)有重疊和覆蓋,提升了特征的豐富性污淋。
  2. 使用LRN層顶滩,對(duì)局部神經(jīng)元的活動(dòng)創(chuàng)建競(jìng)爭(zhēng)機(jī)制,使得其中響應(yīng)較大的值變得相對(duì)更大寸爆,并抑制其它反饋較小的神經(jīng)元礁鲁,增加了模型的泛化能力。
    5.數(shù)據(jù)增強(qiáng)赁豆。主要就是對(duì)原始圖像機(jī)型截取仅醇、翻轉(zhuǎn)等。使用了數(shù)據(jù)增強(qiáng)后可以大大減輕過擬合魔种,提升泛化能力析二。
  3. 對(duì)圖像的RGB數(shù)據(jù)進(jìn)行PCA處理,并對(duì)主成份分析做一個(gè)標(biāo)準(zhǔn)差為0.1的高斯擾動(dòng)节预,增加一些噪聲叶摄。

輸入的圖像是224x224x3的圖像,以下是每個(gè)處理層的尺寸大邪材狻:
conv1 [32, 56, 56, 64]
pool1 [32, 27, 27, 64]
conv2 [32, 27, 27, 192]
pool2 [32, 13, 13, 192]
conv3 [32, 13, 13, 384]
conv4 [32, 13, 13, 256]
conv5 [32, 13, 13, 256]
pool5 [32, 6, 6, 256]
fcl1 [32, 4096]
fcl2 [32, 4096]
fcl3 [32, 1000]


下面是使用Tensorflow的實(shí)現(xiàn):

# _*- coding:utf-8 _*_

import math
import time
import tensorflow as tf
from datetime import datetime

batch_size = 32
num_batches = 100

# 查看每一層網(wǎng)絡(luò)結(jié)構(gòu)
def print_activations(t):
    print(t.op.name, '  ', t.get_shape().as_list())

def inference(images):
    parameters = []

    # 第一個(gè)卷積層
    with tf.name_scope('conv1') as scope:
        kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], dtype=tf.float32, stddev=1e-1),
                             name='weights')
        conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='SAME')
        biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                             trainable=True, name='biases')
        bias = tf.nn.bias_add(conv, biases)
        conv1 = tf.nn.relu(bias, name=scope)
        parameters += [kernel, biases]
        print_activations(conv1)

    lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001/9, beta=0.75, name='lrn1')
    pool1 = tf.nn.max_pool(lrn1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool1')
    print_activations(pool1)

    # 第二個(gè)卷積層
    with 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)

    lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9, 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)

    # 第三個(gè)卷積層
    with tf.name_scope('conv3') as scope:
        kernel = tf.Variable(tf.random_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)

    # 第四個(gè)卷積層
    with 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)

    # 第五個(gè)卷積層
    with 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)

    pool5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='VALID', name='pool5')
    print_activations(pool5)

    # 第一個(gè)全連接層
    with tf.name_scope('fcl1') as scope:
        weight = tf.Variable(tf.truncated_normal([6 * 6 * 256, 4096], stddev=0.1), name='weights')
        biases = tf.Variable(tf.constant(0.0, shape=[4096], dtype=tf.float32), trainable=True, name='biases')
        h_pool5_flat = tf.reshape(pool5, [-1, 6 * 6 * 256])
        fcl1 = tf.nn.relu(tf.matmul(h_pool5_flat, weight) + biases, name=scope)
        drop1 = tf.nn.dropout(fcl1, 0.7)
        parameters += [weight, biases]
        print_activations(fcl1)

    # 第二個(gè)全連接層
    with tf.name_scope('fcl2') as scope:
        weight = tf.Variable(tf.truncated_normal([4096, 4096], stddev=0.1), name='weights')
        biases = tf.Variable(tf.constant(0.0, shape=[4096], dtype=tf.float32), trainable=True, name='biases')
        fcl2 = tf.nn.relu(tf.matmul(drop1, weight) + biases, name=scope)
        drop2 = tf.nn.dropout(fcl2, 0.7)
        parameters += [weight, biases]
        print_activations(fcl2)

    # 第三個(gè)全連接層
    with tf.name_scope('fcl3') as scope:
        weight = tf.Variable(tf.truncated_normal([4096, 1000], stddev=0.1), name='weights')
        biases = tf.Variable(tf.constant(0.0, shape=[1000], dtype=tf.float32), trainable=True, name='biases')
        fcl3 = tf.nn.relu(tf.matmul(drop2, weight) + biases, name=scope)
        parameters += [weight, biases]
        print_activations(fcl3)

    return fcl3, parameters


參考自《tensorflow實(shí)戰(zhàn)》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛤吓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糠赦,更是在濱河造成了極大的恐慌会傲,老刑警劉巖锅棕,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異淌山,居然都是意外死亡裸燎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門泼疑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來德绿,“玉大人,你說我怎么就攤上這事王浴〈嘌祝” “怎么了梅猿?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵氓辣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袱蚓,道長(zhǎng)钞啸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任喇潘,我火速辦了婚禮体斩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颖低。我一直安慰自己絮吵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布忱屑。 她就那樣靜靜地躺著蹬敲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莺戒。 梳的紋絲不亂的頭發(fā)上伴嗡,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音从铲,去河邊找鬼瘪校。 笑死,一個(gè)胖子當(dāng)著我的面吹牛名段,可吹牛的內(nèi)容都是我干的阱扬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哟楷!你這毒婦竟也來了扁耐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤用踩,失蹤者是張志新(化名)和其女友劉穎渠退,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脐彩,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碎乃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惠奸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅誓。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖佛南,靈堂內(nèi)的尸體忽然破棺而出梗掰,到底是詐尸還是另有隱情,我是刑警寧澤嗅回,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布及穗,位于F島的核電站,受9級(jí)特大地震影響绵载,放射性物質(zhì)發(fā)生泄漏埂陆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一娃豹、第九天 我趴在偏房一處隱蔽的房頂上張望焚虱。 院中可真熱鬧,春花似錦懂版、人聲如沸鹃栽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民鼓。三九已至,卻和暖如春私股,著一層夾襖步出監(jiān)牢的瞬間摹察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工倡鲸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留供嚎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓峭状,卻偏偏與公主長(zhǎng)得像克滴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子优床,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容