Practical Aspects of Learning

Install Ipython NoteBook

可以參考這個教程

可以直接安裝anaconda,裡面包含了各種庫,也包含了ipython;

推薦使用python2的版本,因為很多lib只支持python2,而且python3在升級中,支持3.4還是3.5是個很糾結的問題。

安裝anaconda後直接在終端輸入 ipython notebook,則會運行一個ipython的server端,同時在你的瀏覽器中打開基於你終端目錄的一個頁面:

Google 深度學習筆記 - Practical Aspects of Learning

點開ipynb文件即可進入文件編輯頁面

Google 深度學習筆記 - Practical Aspects of Learning

上圖即為practical部分的教程,可以在github下載

官方推薦使用docker來進行這部分教程,但簡單起見我們先用ipython notebook

安裝tensorflow

notMNIST

修改的MNIST,不夠乾淨,更接近真實數據,比MNIST任務更困難。

Todo

我將官方教程的一個文件拆成了多個(以文件持久化為邊界),然後在schedule.py裡統一調用,在各個文件裡可以執行各個部分的功能測試。

下載

使用urlretrieve來獲取數據集notMNIST_large.tar.gz和notMNIST_small.tar.gz

代碼示例:load_data.py

解壓

使用tarfile模塊來解壓剛剛下載的壓縮包

代碼示例:extract.py

讀圖 - 展示 - 序列化

用ndimage讀取一部分圖片,用pickle將讀取到的對象(ndarray對象的list)序列化存儲到磁盤

用matplotlib.plot.imshow實現圖片顯示,可以展示任意的numpy.ndarray,詳見show_imgs(dataset)

這裡展示的是二值化圖片,可以設置顯示為灰度圖

將每個class對應的圖像數據集序列化到磁盤

代碼示例:img_pickle.py

整理數據集

用pickle讀取pickle文件,

從train_folder中為10個class分別獲取10000個valid_dataset和20000個train_dataset,

其中對每個class讀取到的數據,用random.shuffle將數據亂序化

將各個class及其對應的label序列化到磁盤,分別為訓練器和校驗集

從test_folder中為10個class分別獲取10000個test_dataset,

其中對每個class讀取到的數據,用random.shuffle將數據亂序化

將各個class及其對應的label序列化到磁盤,作為測試集

代碼示例merge_prune.py

去除重複數據

load_pickle,加載dataset

先將valid_dataset中與test_dataset重複部分剔除,再將train_dataset中與valid_dataset重複部分剔除

每個dataset都是一個二維浮點數組的list,也可以理解為三維浮點數組,

比較list中的每個圖,也就是將list1中每個二維浮點數組與list2中每個二維浮點數組比較

示例代碼即為clean_overlap.py中的imgs_idx_except

我們在拿list1中的一個元素跟list2中的一個元素比較時,總共需要比較len(list1) * len(list2) * image_size * image_size次,速度極慢

實際上這是有重複的計算的,就在於,list2中的每個元素,都被遍歷了len(list1)次

因此有這樣的一個優化,我們遍歷每個圖,用圖中的灰度值,仿照BKDRHash,得到每個圖都不同的hash值,比較hash值來比較圖像

示例代碼即為clean_overlap.py中的imgs_idx_hash_except

這樣每個圖都只需要訪問一次,計算hash的時間變為(len(list1) + len(list2)) * image_size * image_size

比較的次數是len(list1) * len(list2)

由於我們的數據中,list1和list2的長度是大數,所以節省的時間是相當可觀的

在我的機器上,比較完valid_dataset和test_dataset需要的時間分別是25000秒(10000次比較,每次2-3秒)和60秒

然後再將清理後的數據序列化到磁盤即可

代碼示例: clean_overlap.py

訓練一個logistics 模型

將train_dataset作為輸入,用valid_dataset進行驗證(預測成功率81.9%)

為了重複利用訓練後的分類器,將其序列化到磁盤

代碼示例: logistic_train.py

Measure Performance

分類器會嘗試去記住訓練集

遇到訓練集中沒有的數據時,分類器可能就沒轍了

所以我們應該measure的是,分類器如何產生新數據(生成能力(推導能力)越大,說明它應對新數據能力越強)

僅measure分類器記憶數據集的能力並不能應對新數據(沒有學到規律),所以不應該拿舊數據去measure

因此measure的方式應該是拿新數據去看分類器的預測準確度(never see, can't memorize)

但是在measure的過程中,我們會根據測試數據去重新調整分類器,使其對所有測試數據都生效

也就是說測試數據變成了訓練集的一部分,因此這部分數據我們只能作為valid_dataset,而不能用於衡量最後的performance

解決方法之一即,最終進行performance measure的數據集,必須是調整分類器的過程中沒有使用過的

即堅持一個原則,測試數據不用於訓練

在機器學習比賽Kaggle中,有public data,validate data,並有用於測試(選手未知)的private data,只有在訓練時自己的分類器時,預先取一部分數據作為test data, 才能不會在train和valid的過程中被已有數據所矇蔽

Validation dataset

驗證集越大,驗證的可信度越大

統計學上,調整分類器後,當30個以上預測結果的正確性發生變化的話,這種變化是可信的,值得注意的,小於30是噪音

因此Validation dataset通常數據要大於30000個,在準確率變化高於0.1%時,認為分類器的performance變化

但這樣需要的數據往往偏多,所以可以嘗試交叉驗證(cross validation),交叉驗證有個缺點是速度慢

驗證時,使用tensor.eval(input),相當於tf.get_default_session().run(tensor)

來源:ahangchen / https://github.com/ahangchen/GDLnotes ,只作分享,不作任何商業用途,版權歸原作者所有


分享到:


相關文章: