殘差網(wǎng)絡ResNet網(wǎng)絡原理及實現(xiàn)

論文地址:https://arxiv.org/pdf/1512.03385.pdf

1李剖、引言-深度網(wǎng)絡的退化問題

在深度神經(jīng)網(wǎng)絡訓練中尖飞,從經(jīng)驗來看琉挖,隨著網(wǎng)絡深度的增加,模型理論上可以取得更好的結(jié)果决摧。但是實驗卻發(fā)現(xiàn)亿蒸,深度神經(jīng)網(wǎng)絡中存在著退化問題(Degradation problem)≌谱可以看到边锁,在下圖中56層的網(wǎng)絡比20層網(wǎng)絡效果還要差。

上面的現(xiàn)象與過擬合不同波岛,過擬合的表現(xiàn)是訓練誤差小而測試誤差大茅坛,而上面的圖片顯示訓練誤差和測試誤差都是56層的網(wǎng)絡較大。

深度網(wǎng)絡的退化問題至少說明深度網(wǎng)絡不容易訓練则拷。我們假設(shè)這樣一種情況贡蓖,56層的網(wǎng)絡的前20層和20層網(wǎng)絡參數(shù)一模一樣,而后36層是一個恒等映射( identity mapping)煌茬,即輸入x輸出也是x斥铺,那么56層的網(wǎng)絡的效果也至少會和20層的網(wǎng)絡效果一樣,可是為什么出現(xiàn)了退化問題呢坛善?因此我們在訓練深層網(wǎng)絡時晾蜘,訓練方法肯定存在的一定的缺陷。

正是上面的這個有趣的假設(shè)浑吟,何凱明博士發(fā)明了殘差網(wǎng)絡ResNet來解決退化問題!讓我們來一探究竟耗溜!

2组力、ResNet網(wǎng)絡結(jié)構(gòu)

ResNet中最重要的是殘差學習單元:

對于一個堆積層結(jié)構(gòu)(幾層堆積而成)當輸入為x時其學習到的特征記為H(x),現(xiàn)在我們希望其可以學習到殘差F(x)=H(x)-x抖拴,這樣其實原始的學習特征是F(x)+x 燎字。當殘差為0時,此時堆積層僅僅做了恒等映射阿宅,至少網(wǎng)絡性能不會下降候衍,實際上殘差不會為0,這也會使得堆積層在輸入特征基礎(chǔ)上學習到新的特征洒放,從而擁有更好的性能蛉鹿。一個殘差單元的公式如下:

后面的x前面也需要經(jīng)過參數(shù)Ws變換,從而使得和前面部分的輸出形狀相同往湿,可以進行加法運算妖异。

在堆疊了多個殘差單元后惋戏,我們的ResNet網(wǎng)絡結(jié)構(gòu)如下圖所示:

3、ResNet代碼實戰(zhàn)

我們來實現(xiàn)一個mnist手寫數(shù)字識別的程序他膳。代碼中主要使用的是tensorflow.contrib.slim中定義的函數(shù)响逢,slim作為一種輕量級的tensorflow庫,使得模型的構(gòu)建棕孙,訓練舔亭,測試都變得更加簡單。卷積層蟀俊、池化層以及全聯(lián)接層都可以進行快速的定義钦铺,非常方便。這里為了方便使用欧漱,我們直接導入slim职抡。

import tensorflow.contrib.slim as slim

我們主要來看一下我們的網(wǎng)絡結(jié)構(gòu)。首先定義兩個殘差結(jié)構(gòu),第一個是輸入和輸出形狀一樣的殘差結(jié)構(gòu),一個是輸入和輸出形狀不一樣的殘差結(jié)構(gòu)转捕。

下面是輸入和輸出形狀相同的殘差塊祭衩,這里slim.conv2d函數(shù)的輸入有三個,分別是輸入數(shù)據(jù)缕坎、卷積核數(shù)量,卷積核的大小,默認的話padding為SAME郊丛,即卷積后形狀不變,由于輸入和輸出形狀相同瞧筛,因此我們可以在計算outputs時直接將兩部分相加厉熟。

def res_identity(input_tensor,conv_depth,kernel_shape,layer_name):
    with tf.variable_scope(layer_name):
        relu = tf.nn.relu(slim.conv2d(input_tensor,conv_depth,kernel_shape))
        outputs = tf.nn.relu(slim.conv2d(relu,conv_depth,kernel_shape) + input_tensor)
    return outputs

下面是輸入和輸出形狀不同的殘差塊,由于輸入和輸出形狀不同较幌,因此我們需要對輸入也進行一個卷積變化揍瑟,使二者形狀相同。ResNet作者建議可以用1*1的卷積層乍炉,stride=2绢片,來進行變換:

def res_change(input_tensor,conv_depth,kernel_shape,layer_name):
    with tf.variable_scope(layer_name):
        relu = tf.nn.relu(slim.conv2d(input_tensor,conv_depth,kernel_shape,stride=2))
        input_tensor_reshape = slim.conv2d(input_tensor,conv_depth,[1,1],stride=2)
        outputs = tf.nn.relu(slim.conv2d(relu,conv_depth,kernel_shape) + input_tensor_reshape)
    return outputs

最后是整個網(wǎng)絡結(jié)構(gòu),對于x的輸入岛琼,我們先進行一次卷積和池化操作底循,然后接入四個殘差塊,最后接兩層全聯(lián)接層得到網(wǎng)絡的輸出槐瑞。

def inference(inputs):
    x = tf.reshape(inputs,[-1,28,28,1])
    conv_1 = tf.nn.relu(slim.conv2d(x,32,[3,3])) #28 * 28 * 32
    pool_1 = slim.max_pool2d(conv_1,[2,2]) # 14 * 14 * 32
    block_1 = res_identity(pool_1,32,[3,3],'layer_2')
    block_2 = res_change(block_1,64,[3,3],'layer_3')
    block_3 = res_identity(block_2,64,[3,3],'layer_4')
    block_4 = res_change(block_3,32,[3,3],'layer_5')
    net_flatten = slim.flatten(block_4,scope='flatten')
    fc_1 = slim.fully_connected(slim.dropout(net_flatten,0.8),200,activation_fn=tf.nn.tanh,scope='fc_1')
    output = slim.fully_connected(slim.dropout(fc_1,0.8),10,activation_fn=None,scope='output_layer')
    return output

完整的代碼地址在:https://github.com/princewen/tensorflow_practice/tree/master/CV/ResNet

參考文獻:

1熙涤、論文:https://arxiv.org/pdf/1512.03385.pdf
2、https://blog.csdn.net/kaisa158/article/details/81096588?utm_source=blogxgwz4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灭袁,隨后出現(xiàn)的幾起案子猬错,更是在濱河造成了極大的恐慌,老刑警劉巖茸歧,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倦炒,死亡現(xiàn)場離奇詭異,居然都是意外死亡软瞎,警方通過查閱死者的電腦和手機逢唤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涤浇,“玉大人鳖藕,你說我怎么就攤上這事≈欢В” “怎么了著恩?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜻展。 經(jīng)常有香客問我喉誊,道長,這世上最難降的妖魔是什么纵顾? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任伍茄,我火速辦了婚禮,結(jié)果婚禮上施逾,老公的妹妹穿的比我還像新娘敷矫。我一直安慰自己,他們只是感情好汉额,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布曹仗。 她就那樣靜靜地躺著,像睡著了一般蠕搜。 火紅的嫁衣襯著肌膚如雪怎茫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天讥脐,我揣著相機與錄音遭居,去河邊找鬼啼器。 笑死旬渠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的端壳。 我是一名探鬼主播告丢,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼损谦!你這毒婦竟也來了岖免?” 一聲冷哼從身側(cè)響起岳颇,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颅湘,沒想到半個月后话侧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡闯参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年瞻鹏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹿寨。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡新博,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脚草,到底是詐尸還是另有隱情赫悄,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布馏慨,位于F島的核電站埂淮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熏纯。R本人自食惡果不足惜同诫,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望樟澜。 院中可真熱鬧误窖,春花似錦、人聲如沸秩贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毒费。三九已至丙唧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間觅玻,已是汗流浹背想际。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溪厘,地道東北人胡本。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像畸悬,于是被迫代替她去往敵國和親侧甫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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