TensorFlow 深度學習筆記 邏輯迴歸 實踐篇

Practical Aspects of Learning

轉載請註明做者:夢裏風林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star,有問題能夠到Issue區討論
官方教程地址
視頻/字幕下載html

課程目標:學習簡單的數據展現,訓練一個Logistics Classifier,熟悉之後要使用的數據python

Install Ipython NoteBook

能夠參考這個教程linux

  • 能夠直接安裝anaconda,裏面包含了各類庫,也包含了ipython;
  • 推薦使用python2的版本,由於不少lib只支持python2,並且python3在升級中,支持3.4仍是3.5是個很糾結的問題。
  • 安裝anaconda後直接在終端輸入 ipython notebook,則會運行一個ipython的server端,同時在你的瀏覽器中打開基於你終端目錄的一個頁面:
  • 點開ipynb文件便可進入文件編輯頁面

上圖即爲practical部分的教程,能夠在github下載git

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

Install TensorFlow

安裝教程就在TensorFlow的github頁上>>>點擊查看github

按照官方的流程裝就行了,這裏講一下幾種方式的特色:docker

  1. pip: 安裝在全局的python解釋器中,簡單
  2. Third party: Virtualenv, Anaconda and Docker:都能建立tensorflow獨立的編譯環境,但就是多了一份包
  3. Source: 可以適應不一樣的python版本(好比編譯一個3.5版的),但源碼編譯可能有許多坑
  • ubuntu安裝時,須要注意本身的python - pip - tensorflow版本是否對應(好比是否都是2.7),
  • 使用sudo命令時,注意本身的環境變量是否變化(會致使pip或python命令對應的版本變化)
  • 具體講一下ubuntu安裝tensorflow流程:
    • 安裝anaconda2
    • 肯定本身終端的pip和python版本:
    $ pip -V && python -V

    確認使用的是否都來自anaconda,若是不是,則應該使用相似這樣的命令運行對應的pip:ubuntu

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

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

    • 使用anaconda建立一個tensorflow虛擬環境:
    $ conda create -n tensorflow python=2.7
    • 切換到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

    注意若是安裝的是gpu版本,還須要按照官網說明安裝cuda和cudaCNN數組

    • 安裝成功後就能夠在tensorflow的python環境下,執行import 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進行驗證(預測成功率82.5%)
    • 爲了重複利用訓練後的分類器,將其序列化到磁盤

      代碼示例: 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),交叉驗證有個缺點是速度慢

以爲個人文章對您有幫助的話,就給個star吧 (程序員必定要有一個Github帳號啊!)

相關文章
相關標籤/搜索