iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 20
1
AI & Data

從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型系列 第 20

二、教你怎麼看source code,找到核心程式碼 ep.13:如何把tfrecord轉成tf.data的dataset?

文章說明

文章分段

  1. 文章說明
  2. deeplab的簡單介紹、於我的意義
  3. tensorflow的程式碼特色
  4. 訓練流程的細節
  5. 逛deeplab的github程式,順序:train.py model.py datasets/data_generator.py …

 

前情提要

前面把怎麼建立tfrecord講完了,等於了解dataset的儲存格式,接著就要來看data_generator.py是怎麼把tfrecord處理成模型訓練可用的data。

 

在直接進入講data_generator.py之前,先回憶之前train.py是怎麼呼叫的吧。


在train.py裡面,在開啟一張tensor graph之後,294-310行呼叫了data_generator.py裡面的class,然後回傳了一個object存進dataset這個變數。

讓我們開始吧。

 

逛deeplab的github程式(cont.)

datasts/data_generator.py


首先comments的部分,說明了這是一個套裝程式,用來提供segmentation task的data與label。

並且說明他們目前有3個實作好的dataset可以直接呼叫使用。

 


import的package,需要額外了解的應該只有52行的collections跟56行的input_preprocess.py。

 


59行是用namedtuple去宣告關於dataset的資訊,原因是tuple一經宣告即不可改動,所以很適合儲存不需要「頻繁更動」的資料,而且使用namedtuple的話,他會變得跟dictionary一樣可以用key name去取得資料。

60-69行的意思是,宣告一個tuple叫DatasetDescriptor,然後他有三個欄位分別是:

  • splits_to_sizes:放資料集各種分類的資料數量
  • num_classes:資料集裡面的分類的總數
  • ignore_label:label中作為background,不會參與更新參數計算的label value。

 


於是接下來的71-80、82-91、93-100行,都是用宣告好的namedtuple,去一一輸入3個資料集的特性,像是82行的PASCAL_VOC,他原始的資料集有1464個資料,存在split為train的tfrecord裡,然後他還有另外建立一個有augmentation過的tfrecord。

這邊就延伸出兩種實作方式:一種是事先把資料處理好,然後存在另外的tfrecord裡,這會比較省時間;另一種是把原始資料集載入後,用程式把資料集擴展或處理,這樣則是比較省空間。

 


再來是把不同資料集的資訊欄,用dictionary整理起來,當今天呼叫的dataset是ade20k時,就將_ADE20K_INFORMATION這個tuple的資訊拿來使用。

 


像163行這裡,如果使用這個的dataset_name沒有支援的話,就會直接報錯,因此,如果想要接續拓展這個project支援的資料集的話,就按照他的格式新增吧。

 


109行的是tfrecord的file pattern,%s這裡就是資料集不同split的,然後後面-就是一個橫槓,接著*是代表不論什麼符號都可以的意思。

這裡的file pattern取決於在build_DATASET_data.py時,output_filename是怎麼設定的,而在Deeplab裡面是這樣設計的。

今天先這樣。


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.12:如何製作tfrecord? 4
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.14:如何把tfrecord轉成tf.data的dataset? 2
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言