代碼閱讀筆記1

代碼位置

代碼結(jié)構(gòu):

1.master文件夾
(1) dice_loss.py
(2) eval.py
(3) predict.py: ** 完全沒涉及pruning后的網(wǎng)絡(luò)**
(4) pruning.py:
(5) submit.py:** 完全沒涉及pruning后的網(wǎng)絡(luò)**
(6) train.py:** 完全沒涉及pruning后的網(wǎng)絡(luò)**
(7) 文件夾unet
<1> prune_layers.py
<2> prune_unet_model.py : class PruneUNet
<3> prune_unet_parts.py : 對p_double_conv, p_inconv, p_outconv, p_down, p_up 進(jìn)行了定義

<4> unet_model.py
<5> unet_parts.py
(8) 文件夾util
<1> load.py
<2> util.py
<3> data_vis.py
<4> crf.py

閱讀目的:

能用,能跑,放自己的數(shù)據(jù)能跑

閱讀筆記

A. pruning.py閱讀
  1. pruning.py中的line 91的net.train()的理解
    net的定義:
net = PruneUNet(n_channels=3, n_classes=1) 
  1. 中心for循環(huán)的理解
    for循環(huán)做了以下四件事情:
    對每個epoch:
    (1) reset the generator for training data and validation data.
    這里實際上對每一個epoch瘦赫,在開始時對數(shù)據(jù)都做了traditional augmentation,但是我們的數(shù)據(jù)量足夠多耐薯,不需要這么做。待改進(jìn)
    (2) 取validation dataset的前四項隘世,進(jìn)行prediction和計算accuracy可柿。
    這里因為validation dataset是自動生成的,所以雖然都是前4項丙者,但是validation dataset是不一樣的。
    (3) 用PruneUNet訓(xùn)練training dataset的前兩個batch:
    PruneUNet位于unet文件夾的prune_unet_model.py
  • model.eval() :Pytorch會自動把BN和Dropout固定住营密,不會取平均械媒,而是用訓(xùn)練好的值
  • model.train():讓model變成訓(xùn)練模式,此時 dropout和batch normalization的操作在訓(xùn)練時起到防止網(wǎng)絡(luò)過擬合的作用评汰。
    訓(xùn)練纷捞,算loss,反向傳播
    然后進(jìn)行prune被去,
    對每個epoch主儡,都要循環(huán)num_prune_iterations次,每一次運(yùn)行一遍net.prune惨缆。net.prune的具體內(nèi)容見B糜值,總結(jié)下來是去掉一個channel丰捷。

疑問:如果一直執(zhí)行net.prune,都是去掉最小值寂汇,但是去掉最小值之后如果不刪掉對應(yīng)prune_feature_map 里的值棘脐,那么每次刪掉的module里的filter不是一樣的嗎昏滴?
回答:每一次找到對應(yīng)layer_idx和filter_idx之后,對conv2d層執(zhí)行prune,都需要運(yùn)行位于prune_layer.py中的函數(shù)prune_feature_map煞抬,在這個函數(shù)中,執(zhí)行了下面兩步:

indices = Variable(torch.LongTensor([i for i in range(self.out_channels) if i != map_index]))
self.weight = nn.Parameter(self.weight.index_select(0, indices).data)

對bias和對weight有一樣的操作霹崎。
最后將輸出channel減一胯陋。
這里重點(diǎn)理解這個index_select函數(shù):
函數(shù)格式:

index_select(
    dim,
    index)

參數(shù)含義:

dim:表示從第幾維挑選數(shù)據(jù),類型為int值扒磁;index:表示從第一個參數(shù)維度中的哪個位置挑選數(shù)據(jù)硼被,類型為torch.Tensor類的實例;

(4) 繼續(xù)對第一次循環(huán)里的validation的數(shù)據(jù)用pruned的代碼進(jìn)行預(yù)測和計算loss渗磅。
(5) if save_cp時嚷硫,保存net.state_dict()

B. prune_unet_model.py閱讀

PruneUNet這個class中定義了4個函數(shù):
__ init __,forward始鱼,set_pruning和prune仔掸。
其中 __ init __里,所有的down和up layer 以及output layer 都是pruned layer医清。
其中prune是具體進(jìn)性layer prune的函數(shù)起暮,做了以下事情:
(1) 去掉model里的大的block
(2) 找到泰勒估計中,最小估計值所對應(yīng)的layer和filter的位置会烙,用prune_feature_map函數(shù)進(jìn)行prune负懦。
(3) 如果下一層不是最后一層,對應(yīng)去drop掉下一層的輸入channel
(4) down layer的channel改變之后柏腻,對應(yīng)up layer的channel也要改變纸厉,這里用hard code去寫。
進(jìn)一步去看:line68的taylor_estimates_by_module 和 estimates_by_f_map是怎么計算得到的五嫂。
對每一個module list的module颗品,在line64進(jìn)行了module.taylor_estimates,去進(jìn)行排序沃缘。

先取出每個module_list 的module.taylor_estimates和idx躯枢,
再從module.taylor_estimates里取出f_map_idx和對應(yīng)的估計值estimate。

C. prune_layers.py閱讀

在prune_layers.py中槐臀,定義了class PrunableConv2d(nn.Conv2d)class PrunableBatchNorm2d(nn.BatchNorm2d)锄蹂,對PrunableConv2d(nn.Conv2d),定義了屬性taylor_estimates

D. 提問:
問題1:

pruning.py基于前幾個training batch和幾個epoch和手動輸入的num_prune_iterations對unet進(jìn)行pruning水慨,那么如何用prune好的網(wǎng)絡(luò)對我們的數(shù)據(jù)進(jìn)行計算呢得糜?

num_prune_iterations = 100敬扛,
epochs=5

這里又涉及兩個問題:(a) prune完需要retrain嗎? (b) 如何用pruned的網(wǎng)絡(luò)進(jìn)行inference?
對問題(a),其實在pruning.py里掀亩,有反向傳播更新梯度值和權(quán)重值的過程了舔哪,未必要重新去train。
對問題(b)槽棍,需要繼續(xù)閱讀代碼捉蚤。
代碼里并沒有寫,可能需要自己在prediction的代碼里導(dǎo)入pruned_unet

問題2: 如何計算每個module的taylor_estimates

prune_layers.pyclass PrunableConv2d(nn.Conv2d)中有一個函數(shù)_calculate_taylor_estimate(self, _, grad_input, grad_output)專門計算taylor_estimates炼七。
這里有注釋:# skip dim 1 as it is kernel size
其中缆巧,_recent_activations是forward之后該conv2d層的output。

mul_(value)
mul()的直接運(yùn)算形式豌拙,即直接執(zhí)行并且返回修改后的張量

# skip dim 1 as it is kernel size
estimates = self._recent_activations.mul_(grad_output[0])
estimates = estimates.mean(dim=(0, 2, 3))        
# normalization
self.taylor_estimates = torch.abs(estimates) / torch.sqrt(torch.sum(estimates * estimates))

修改代碼據(jù)為己用:

A. pruning.py改動記錄

  1. 把optimizer從SGD改成Adam陕悬,和自己的UNet保持一致。(已完成)
  2. line61criterion = nn.BCELoss()改成自己定義的Diceloss
  3. line183的net的定義n_channel從3改成1
  4. summary(net, (3, 640, 640))注釋掉這一步可視化按傅,因為暫時不探究其參數(shù)含義捉超。
    B.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唯绍,隨后出現(xiàn)的幾起案子拼岳,更是在濱河造成了極大的恐慌,老刑警劉巖况芒,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惜纸,死亡現(xiàn)場離奇詭異,居然都是意外死亡绝骚,警方通過查閱死者的電腦和手機(jī)耐版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压汪,“玉大人粪牲,你說我怎么就攤上這事《昶牵” “怎么了虑瀑?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滴须。 經(jīng)常有香客問我,道長叽奥,這世上最難降的妖魔是什么扔水? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮朝氓,結(jié)果婚禮上魔市,老公的妹妹穿的比我還像新娘主届。我一直安慰自己,他們只是感情好待德,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布君丁。 她就那樣靜靜地躺著,像睡著了一般将宪。 火紅的嫁衣襯著肌膚如雪绘闷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天较坛,我揣著相機(jī)與錄音印蔗,去河邊找鬼。 笑死丑勤,一個胖子當(dāng)著我的面吹牛华嘹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播法竞,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼耙厚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岔霸?” 一聲冷哼從身側(cè)響起薛躬,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秉剑,沒想到半個月后泛豪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侦鹏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年诡曙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片略水。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡价卤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渊涝,到底是詐尸還是另有隱情慎璧,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布跨释,位于F島的核電站胸私,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳖谈。R本人自食惡果不足惜岁疼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缆娃。 院中可真熱鬧捷绒,春花似錦瑰排、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至字逗,卻和暖如春京郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扳肛。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工傻挂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挖息。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓金拒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親套腹。 傳聞我的和親對象是個殘疾皇子绪抛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355