TensorFlow之slim

slim就是TensorFlow的簡(jiǎn)潔版。本篇就是介紹如何使用slim,因?yàn)樽约阂彩莿傞_(kāi)始接觸TensorFlow蕉堰,slim更是用得少,因此悲龟,本篇就當(dāng)做是slim的學(xué)習(xí)記錄屋讶,后面會(huì)不斷更新。
先貼出slim的github须教,這里更詳細(xì)
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim

首先皿渗,導(dǎo)入,在安裝TensorFlow時(shí)轻腺,slim包也一起安裝了乐疆,因此不需要再安裝。

import tensorflow.contrib.slim as slim

基礎(chǔ)操作
slim是TensorFlow的簡(jiǎn)潔版贬养,因此在實(shí)際操作過(guò)程中要簡(jiǎn)單得多挤土。
原生TensorFlow的一個(gè)卷積層:

inputs = ...
    ####conv1
    with tf.variable_scope('conv1') as scope:
        weights = tf.get_variable(scope.name+'_w1',
                               [3,3,3,16],
                               dtype=tf.float32,
                               initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))
        biases = tf.get_variable(scope.name+'_b1',
                               [16],
                               dtype=tf.float32,
                               initializer=tf.constant_initializer(0.1))

        conv = tf.nn.conv2d(inputs,weights,strides=[1,1,1,1],padding='SAME')
        pre_activation = tf.nn.bias_add(conv,biases)
        conv1 = tf.nn.relu(pre_activation,name=scope.name)

在slim中:

inputs = ...
net = slim.conv2d(inputs,16,[3,3],scope='conv1')

inputs就是網(wǎng)絡(luò)輸入;
16是輸出神經(jīng)元個(gè)數(shù)误算;
[3,3]是該層卷積核大小

很簡(jiǎn)單Q雒馈!更簡(jiǎn)單的是儿礼,Slim也提供了兩個(gè)元運(yùn)算符----repeat和stack咖杂,允許用戶(hù)可以重復(fù)地使用相同的運(yùn)算符。

net = ...
net = slim.conv2d(net,16,[3,3],scope='conv1')
net = slim.conv2d(net,16,[3,3],scope='conv1')
net = slim.conv2d(net,16,[3,3],scope='conv1')

上面可以替換為:

net = ...
net = slim.repeat(net,3,slim.conv2d,16,[3,3],scope='conv1')

這就是slim.repeat的作用蜘犁。
解釋?zhuān)?表示重復(fù)slim.conv2d這個(gè)操作3次翰苫,每次輸出神經(jīng)元個(gè)數(shù)都是16,卷積核都是3*3;
那么奏窑,要用不同的參數(shù)怎么辦导披?
可以用slim.stack:
輸出神經(jīng)元個(gè)數(shù)不同:

# Verbose way:  
x = slim.fully_connected(x, 32, scope='fc/fc_1')  
x = slim.fully_connected(x, 64, scope='fc/fc_2')  
x = slim.fully_connected(x, 128, scope='fc/fc_3')  
  
# Equivalent, TF-Slim way using slim.stack:  
slim.stack(x, slim.fully_connected, [32, 64, 128], scope='fc')

每層網(wǎng)絡(luò)的輸出神經(jīng)元個(gè)數(shù)和卷積核都不同:

# Verbose way:  
x = slim.conv2d(x, 32, [3, 3], scope='core/core_1')  
x = slim.conv2d(x, 32, [1, 1], scope='core/core_2')  
x = slim.conv2d(x, 64, [3, 3], scope='core/core_3')  
x = slim.conv2d(x, 64, [1, 1], scope='core/core_4')  
  
# Using stack:  
slim.stack(x, slim.conv2d, [(32, [3, 3]), (32, [1, 1]), (64, [3, 3]), (64, [1, 1])], scope='core')

scope
除了tensorflow中自帶的scope機(jī)制類(lèi)型(name_scope, variable_scope)外, TF-Slim添加了一種叫做arg_scope的scope機(jī)制。這種scope允許用戶(hù)在arg_scope中指定若干操作符以及一批參數(shù)埃唯,這些參數(shù)會(huì)傳給前面所有的操作符中撩匕。如果后面不需要這種參數(shù),可以重寫(xiě)墨叛,覆蓋止毕。
原始繁瑣的操作:

net = slim.conv2d(inputs, 64, [11, 11], 4, padding='SAME',  
                  weights_initializer=tf.truncated_normal_initializer(stddev=0.01),  
                  weights_regularizer=slim.l2_regularizer(0.0005), scope='conv1')  
net = slim.conv2d(net, 128, [11, 11], padding='VALID',  
                  weights_initializer=tf.truncated_normal_initializer(stddev=0.01),  
                  weights_regularizer=slim.l2_regularizer(0.0005), scope='conv2')  
net = slim.conv2d(net, 256, [11, 11], padding='SAME',  
                  weights_initializer=tf.truncated_normal_initializer(stddev=0.01),  
                  weights_regularizer=slim.l2_regularizer(0.0005), scope='conv3')

簡(jiǎn)單操作:

with slim.arg_scope([slim.conv2d], padding='SAME',  
                      weights_initializer=tf.truncated_normal_initializer(stddev=0.01)  
                      weights_regularizer=slim.l2_regularizer(0.0005)):  
    net = slim.conv2d(inputs, 64, [11, 11], scope='conv1')  
    net = slim.conv2d(net, 128, [11, 11], padding='VALID', scope='conv2')    ##這里的padding='VALID'會(huì)覆蓋原來(lái)默認(rèn)的padding='SAME'
    net = slim.conv2d(net, 256, [11, 11], scope='conv3')

嵌套操作:
這里最外面的一層scope包含slim.conv2d和slim.fully_connected兩個(gè)共有參數(shù),里面一層scope則只包括slim.conv2d的參數(shù)漠趁。

with slim.arg_scope([slim.conv2d, slim.fully_connected],  
                      activation_fn=tf.nn.relu,  
                      weights_initializer=tf.truncated_normal_initializer(stddev=0.01),  
                      weights_regularizer=slim.l2_regularizer(0.0005)):  
  with slim.arg_scope([slim.conv2d], stride=1, padding='SAME'):  
    net = slim.conv2d(inputs, 64, [11, 11], 4, padding='VALID', scope='conv1')  
    net = slim.conv2d(net, 256, [5, 5],  
                      weights_initializer=tf.truncated_normal_initializer(stddev=0.03),  
                      scope='conv2')  
    net = slim.fully_connected(net, 1000, activation_fn=None, scope='fc') 

下面來(lái)一個(gè)slim寫(xiě)的例子扁凛,vgg16的實(shí)現(xiàn):

def vgg16(inputs):  
  with slim.arg_scope([slim.conv2d, slim.fully_connected],  
                      activation_fn=tf.nn.relu,  
                      weights_initializer=tf.truncated_normal_initializer(0.0, 0.01),  
                      weights_regularizer=slim.l2_regularizer(0.0005)):  
    net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')  
    net = slim.max_pool2d(net, [2, 2], scope='pool1')  
    net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')  
    net = slim.max_pool2d(net, [2, 2], scope='pool2')  
    net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')  
    net = slim.max_pool2d(net, [2, 2], scope='pool3')  
    net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')  
    net = slim.max_pool2d(net, [2, 2], scope='pool4')  
    net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')  
    net = slim.max_pool2d(net, [2, 2], scope='pool5')  
    net = slim.fully_connected(net, 4096, scope='fc6')  
    net = slim.dropout(net, 0.5, scope='dropout6')  
    net = slim.fully_connected(net, 4096, scope='fc7')  
    net = slim.dropout(net, 0.5, scope='dropout7')  
    net = slim.fully_connected(net, 1000, activation_fn=None, scope='fc8')  
  return net 

是不是特別精簡(jiǎn)?但其中包含的東西卻很多闯传,需要細(xì)細(xì)體會(huì)谨朝,還好之前走過(guò)原生TensorFlow的路。
這里特別要注意:
在最后一個(gè)全連接層中activation_fn=None甥绿,因?yàn)樽詈笠粚硬恍杓せ詈瘮?shù)字币,而slim.fully_connected()是默認(rèn)使用激活函數(shù)tf.nn.relu的,因此在網(wǎng)絡(luò)模型最后一層中要添加activation_fn=None共缕。

上面的這個(gè)vgg16網(wǎng)絡(luò)就是slim內(nèi)已經(jīng)實(shí)現(xiàn)的網(wǎng)絡(luò)洗出,里面還有很多,可以直接拿來(lái)用图谷,最好還是自己寫(xiě)一下翩活,等有空了一定要全部自己重寫(xiě)一遍,先貼這里https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim/python/slim/nets

目前我接觸的就這些蜓萄,后面還會(huì)碰到隅茎,等自己理解了再來(lái)更新吧!嫉沽!

參考文章:
原po寫(xiě)得更多更詳細(xì)辟犀,學(xué)習(xí)了
http://blog.csdn.net/guvcolie/article/details/77686555

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绸硕,隨后出現(xiàn)的幾起案子堂竟,更是在濱河造成了極大的恐慌,老刑警劉巖玻佩,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件出嘹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咬崔,警方通過(guò)查閱死者的電腦和手機(jī)税稼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)烦秩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人郎仆,你說(shuō)我怎么就攤上這事只祠。” “怎么了扰肌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵抛寝,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我曙旭,道長(zhǎng)盗舰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任桂躏,我火速辦了婚禮钻趋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沼头。我一直安慰自己爷绘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布进倍。 她就那樣靜靜地躺著,像睡著了一般购对。 火紅的嫁衣襯著肌膚如雪猾昆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天骡苞,我揣著相機(jī)與錄音垂蜗,去河邊找鬼。 笑死解幽,一個(gè)胖子當(dāng)著我的面吹牛贴见,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躲株,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼片部,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霜定?” 一聲冷哼從身側(cè)響起档悠,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎望浩,沒(méi)想到半個(gè)月后辖所,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磨德,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年缘回,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吆视。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酥宴,死狀恐怖揩环,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幅虑,我是刑警寧澤丰滑,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站倒庵,受9級(jí)特大地震影響褒墨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擎宝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一郁妈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绍申,春花似錦噩咪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筋搏,卻和暖如春仆百,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奔脐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工俄周, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人髓迎。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓峦朗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親排龄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子波势,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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