1. 程式人生 > 其它 >邏輯迴歸 | TensorFlow深度學習筆記

邏輯迴歸 | TensorFlow深度學習筆記

課程目標:學習簡單的資料展示,訓練一個Logistics Classifier,熟悉以後要使用的資料

Install Ipython NoteBook

可以參考這個 教程 (http://opentechschool.github.io/python-data-intro/core/notebook.html)

  • 可以直接安裝 anaconda (https://www.anaconda.com/download/),裡面包含了各種庫,也包含了ipython;
  • 推薦使用python2的版本,因為很多lib只支援python2,而且python3在升級中,支援3.4還是3.5是個很糾結的問題。

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

點開ipynb檔案即可進入檔案編輯頁面

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

(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/udacity)

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

Install TensorFlow

安裝教程就在TensorFlow的github頁上

按照官方的流程裝就好了,這裡講一下幾種方式的特點:

1、pip: 安裝在全域性的python直譯器中,簡單

2、Third party: Virtualenv, Anaconda and Docker:都能建立tensorflow獨立的編譯環境,但就是多了一份包

3、Source: 能夠適應不同的python版本(比如編譯一個3.5版的),但原始碼編譯可能有許多坑

4、ubuntu安裝時,需要注意自己的python - pip - tensorflow版本是否對應(比如是否都是2.7),

5、使用sudo命令時,注意自己的環境變數是否變化(會導致pip或python命令對應的版本變化)

6、具體講一下ubuntu安裝tensorflow流程:

1、安裝anaconda2 2、確定自己終端的pip和python版本

$ pip -V && python -V

確認使用的是否都來自anaconda,如果不是,則應該使用類似這樣的命令執行對應的pip:

$ /home/cwh/anaconda2/bin/pip -V

使用sudo命令時最好也看一下版本

3、使用anaconda建立一個tensorflow虛擬環境

$ conda create -n tensorflow python=2.7

4、切換到tensorflow環境下(實際上是更換了環境變數裡的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

notMNIST

修改的 MNIST(

http://yann.lecun.com/exdb/mnist/),不夠乾淨,更接近真實資料,比MNIST任務更困難。

Todo

我將官方教程的一個檔案拆成了多個(以檔案持久化為邊界),然後在schedule.py(https://github.com/ahangchen/GDLnotes/blob/master/src/assign_1/schedule.py) 裡統一呼叫,在各個檔案裡可以執行各個部分的功能測試。

下載

程式碼示例:load_data.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/load_data.py)

使用urlretrieve來獲取資料集notMNIST_large.tar.gz和notMNIST_small.tar.gz

解壓

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

程式碼示例:extract.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/extract.py)

讀圖-展示-序列化

1、用ndimage讀取一部分圖片,用pickle將讀取到的物件(ndarray物件的list)序列化儲存到磁碟

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

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

4、將每個class對應的影象資料集序列化到磁碟

程式碼示例:img_pickle.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/img_pickle.py)

整理資料集

1、用pickle讀取pickle檔案,

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

3、其中對每個class讀取到的資料,用random.shuffle將資料亂序化

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

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

6、其中對每個class讀取到的資料,用random.shuffle將資料亂序化

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

程式碼示例merge_prune.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/merge_prune.py)

去除重複資料

1、load_pickle,載入dataset

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

3、每個dataset都是一個二維浮點陣列的list,也可以理解為三維浮點陣列,

4、比較list中的每個圖,也就是將list1中每個二維浮點陣列與list2中每個二維浮點陣列比較

5、示例程式碼即為clean_overlap.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)中的imgs_idx_except

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

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

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

9、示例程式碼即為clean_overlap.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)中的imgs_idx_hash_except

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

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

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

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

14、然後再將清理後的資料序列化到磁碟即可

程式碼示例: clean_overlap.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)

訓練一個logistics 模型

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

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

程式碼示例: logistic_train.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/logistic_train.py)

Measure Performance

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

2、遇到訓練集中沒有的資料時,分類器可能就沒轍了

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

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

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

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

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

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

9、即堅持一個原則,測試資料不用於訓練

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

Validation dataset

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

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

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

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

Github地址:https://github.com/ahangchen/GDLnotes