Practical Aspects of Learning
轉載請注明作者:夢里風林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star洋闽,有問題可以到Issue區(qū)討論
官方教程地址
視頻/字幕下載
課程目標:學習簡單的數(shù)據展示苍狰,訓練一個Logistics Classifier,熟悉以后要使用的數(shù)據
Install Ipython NoteBook
可以參考這個教程
- 可以直接安裝anaconda称诗,里面包含了各種庫毒嫡,也包含了ipython;
- 推薦使用python2的版本,因為很多l(xiāng)ib只支持python2舞吭,而且python3在升級中,支持3.4還是3.5是個很糾結的問題析珊。
-
安裝anaconda后直接在終端輸入 ipython notebook羡鸥,則會運行一個ipython的server端,同時在你的瀏覽器中打開基于你終端目錄的一個頁面:
-
點開ipynb文件即可進入文件編輯頁面
上圖即為practical部分的教程忠寻,可以在github下載
官方推薦使用docker來進行這部分教程惧浴,但簡單起見我們先用ipython notebook
Install TensorFlow
安裝教程就在TensorFlow的github頁上>>>點擊查看
按照官方的流程裝就好了,這里講一下幾種方式的特點:
- pip: 安裝在全局的python解釋器中奕剃,簡單
- Third party: Virtualenv, Anaconda and Docker:都能創(chuàng)建tensorflow獨立的編譯環(huán)境衷旅,但就是多了一份包
- Source: 能夠適應不同的python版本(比如編譯一個3.5版的)捐腿,但源碼編譯可能有許多坑
ubuntu安裝時,需要注意自己的python - pip - tensorflow版本是否對應(比如是否都是2.7)柿顶,
使用sudo命令時茄袖,注意自己的環(huán)境變量是否變化(會導致pip或python命令對應的版本變化)
-
具體講一下ubuntu安裝tensorflow流程:
- 安裝anaconda2
- 確定自己終端的pip和python版本:
$ pip -V && python -V
確認使用的是否都來自anaconda,如果不是嘁锯,則應該使用類似這樣的命令運行對應的pip:
$ /home/cwh/anaconda2/bin/pip -V
使用sudo命令時最好也看一下版本
- 使用anaconda創(chuàng)建一個tensorflow虛擬環(huán)境:
$ conda create -n tensorflow python=2.7
- 切換到tensorflow環(huán)境下(實際上是更換了環(huán)境變量里的pip和python)绞佩,下載安裝tensorflow,需要sudo權限
$ source activate tensorflow (tensorflow)$ sudo pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.wh $ source deactivate
注意如果安裝的是gpu版本猪钮,還需要按照官網說明安裝cuda和cudaCNN
- 安裝成功后就可以在tensorflow的python環(huán)境下品山,執(zhí)行import tensorflow看看了。
notMNIST
修改的MNIST烤低,不夠干凈肘交,更接近真實數(shù)據,比MNIST任務更困難扑馁。
Todo
我將官方教程的一個文件拆成了多個(以文件持久化為邊界)涯呻,然后在schedule.py里統(tǒng)一調用,在各個文件里可以執(zhí)行各個部分的功能測試腻要。
-
下載
- 使用urlretrieve來獲取數(shù)據集notMNIST_large.tar.gz和notMNIST_small.tar.gz
代碼示例:load_data.py
-
解壓
- 使用tarfile模塊來解壓剛剛下載的壓縮包
代碼示例:extract.py
-
讀圖 - 展示 - 序列化
- 用ndimage讀取一部分圖片复罐,用pickle將讀取到的對象(ndarray對象的list)序列化存儲到磁盤
- 用matplotlib.plot.imshow實現(xiàn)圖片顯示,可以展示任意的numpy.ndarray雄家,詳見show_imgs(dataset)
- 這里展示的是二值化圖片效诅,可以設置顯示為灰度圖
- 將每個class對應的圖像數(shù)據集序列化到磁盤
代碼示例:img_pickle.py
-
整理數(shù)據集
- 用pickle讀取pickle文件,
- 從train_folder中為10個class分別獲取10000個valid_dataset和20000個train_dataset趟济,
- 其中對每個class讀取到的數(shù)據乱投,用random.shuffle將數(shù)據亂序化
- 將各個class及其對應的label序列化到磁盤,分別為訓練器和校驗集
- 從test_folder中為10個class分別獲取10000個test_dataset,
- 其中對每個class讀取到的數(shù)據顷编,用random.shuffle將數(shù)據亂序化
- 將各個class及其對應的label序列化到磁盤戚炫,作為測試集
代碼示例merge_prune.py
-
去除重復數(shù)據
load_pickle,加載dataset
先將valid_dataset中與test_dataset重復部分剔除媳纬,再將train_dataset中與valid_dataset重復部分剔除
每個dataset都是一個二維浮點數(shù)組的list双肤,也可以理解為三維浮點數(shù)組,
比較list中的每個圖钮惠,也就是將list1中每個二維浮點數(shù)組與list2中每個二維浮點數(shù)組比較
示例代碼即為clean_overlap.py中的imgs_idx_except
我們在拿list1中的一個元素跟list2中的一個元素比較時茅糜,總共需要比較len(list1) * len(list2) * image_size * image_size次,速度極慢
實際上這是有重復的計算的萌腿,就在于限匣,list2中的每個元素,都被遍歷了len(list1)次
因此有這樣的一個優(yōu)化,我們遍歷每個圖米死,用圖中的灰度值锌历,仿照BKDRHash,得到每個圖都不同的hash值峦筒,比較hash值來比較圖像
示例代碼即為clean_overlap.py中的imgs_idx_hash_except
這樣每個圖都只需要訪問一次究西,計算hash的時間變?yōu)?len(list1) + len(list2)) * image_size * image_size
比較的次數(shù)是len(list1) * len(list2)
由于我們的數(shù)據中,list1和list2的長度是大數(shù)物喷,所以節(jié)省的時間是相當可觀的
在我的機器上卤材,比較完valid_dataset和test_dataset需要的時間分別是25000秒(10000次比較,每次2-3秒)和60秒
然后再將清理后的數(shù)據序列化到磁盤即可
代碼示例: clean_overlap.py
-
訓練一個logistics 模型
- 將train_dataset作為輸入峦失,用valid_dataset進行驗證(預測成功率82.5%)
- 為了重復利用訓練后的分類器扇丛,將其序列化到磁盤
代碼示例: logistic_train.py
-
Measure Performance
分類器會嘗試去記住訓練集
遇到訓練集中沒有的數(shù)據時,分類器可能就沒轍了
所以我們應該measure的是尉辑,分類器如何產生新數(shù)據(生成能力(推導能力)越大帆精,說明它應對新數(shù)據能力越強)
僅measure分類器記憶數(shù)據集的能力并不能應對新數(shù)據(沒有學到規(guī)律),所以不應該拿舊數(shù)據去measure
因此measure的方式應該是拿新數(shù)據去看分類器的預測準確度(never see, can't memorize)
但是在measure的過程中隧魄,我們會根據測試數(shù)據去重新調整分類器卓练,使其對所有測試數(shù)據都生效
也就是說測試數(shù)據變成了訓練集的一部分,因此這部分數(shù)據我們只能作為valid_dataset购啄,而不能用于衡量最后的performance
解決方法之一即襟企,最終進行performance measure的數(shù)據集,必須是調整分類器的過程中沒有使用過的
即堅持一個原則狮含,測試數(shù)據不用于訓練
在機器學習比賽Kaggle中顽悼,有public data,validate data辉川,并有用于測試(選手未知)的private data表蝙,只有在訓練時自己的分類器時拴测,預先取一部分數(shù)據作為test data乓旗,
才能不會在train和valid的過程中被已有數(shù)據所蒙蔽 -
Validation dataset
- 驗證集越大,驗證的可信度越大
- 統(tǒng)計學上集索,調整分類器后屿愚,當30個以上預測結果的正確性發(fā)生變化的話,這種變化是可信的务荆,值得注意的妆距,小于30是噪音
- 因此Validation dataset通常數(shù)據要大于30000個,在準確率變化高于0.1%時函匕,認為分類器的performance變化
- 但這樣需要的數(shù)據往往偏多娱据,所以可以嘗試交叉驗證(cross validation),交叉驗證有個缺點是速度慢
覺得我的文章對您有幫助的話盅惜,點擊這里給個star吧
(程序員一定要有一個Github賬號爸惺!<纱)