2018年10月28日 星期日

筆記:RNN及眾多應用





Recurrent Neural Networks 循環神經網路,在時間上傳遞的神經網絡,它的深度是時間的長度,也就是加入記憶的因素。RNN特別適用於處理聲音、時間序列或自然語言等序列資料。RNN與DNN的區別在於有一個反饋循環,將第n-1步的輸出反饋給NN,對第n步的輸出產生影響,之後的每一步也都以此類推。

RNN和DNN都能通過對讀取的數據建模來記住有關於現實世界的某些信息。但這兩種網絡的記憶模式完全不同。在定型之後,DNN會生成已學習數據的靜態模型,然後這個模型就可以接受新的樣例,進行準確的分類或聚類。相比之下,RNN則會生成動態模型,亦即會隨時間推移而變化的模型,這種變化可以讓模型依據輸入樣例的上下文來進行準確的分類。更精確的說法是,循環模型包含了決定同個序列中的前一次分類結果的隱藏狀態。在之後的每一步中,這一隱藏狀態會與新一步的輸入數據相加,生成一個新的隱藏狀態,再得出一個新的分類結果。每個隱藏狀態都會被循環利用,生成經過調整的後續隱藏狀態。

真的很抽象,就用個JAVA範例來說明。

RNN具有預測能力。它們可以隨著時間推移動態地把握數據結構,可以用於預測一個數據序列中的下一個元素。這樣的元素有可能是一個單詞中接下來的字母,或者一句話中接下來的單詞(自然語言生成);也可以是傳感器、經濟統計表格、股票價格動態等數據中的下一個數字。

大多數入門範例是MNIST,雖然圖像看似不是序列數據,但它們也可以被解讀為序列,然後輸入循環網絡中。MNIST也可以用基本RNN來處理,如test17.py,參考說明

其他範例
Google的塗鴉專案
音樂範例這裡。使用一般RNN技巧,但多了MIDI界面,就變得有趣。
Music-Generation-master
python main.py -d EDEN-midi
generate generated    output.mp3

LSTM RNN


RNN在處理長期依賴時(就是時間序列比較遠時)會遇到很大困難,因為計算距離較遠的節點之間的關聯會涉及矩陣多次相乘,這會帶來梯度消失或是梯度膨脹(大多是消失)的問題,解決的辦法就是使用Gated RNN,透過權重係數,允許RNN累積遠距離節點間的長期關係,而且在不同時刻改變這個係數,並且允許網路網際當前已經累積的信息。

LSTM結構如下,透過三個threshold,使得自循環的權重是變化的,這樣一來,在模型參數固定的狀態下,不同時刻的積分尺度可以動態改變,避免梯度消失或膨脹的問題。


每個LSTM的計算公式如圖,Ft遺忘threshold,It表示輸入threshold, ̃Ct表示前一時刻cell狀態,Ct表示cell狀態(loop循環),Ot表示輸出threshold,Ht表示當前單元的輸出,Ht-1表示前一時刻單元的輸出。

有些記憶會是最近形成的,而另一些則可能是在形成後經過許多個時間步才需要使用。能夠將時間間隔較遠的記憶與輸入有效聯繫起來的循環網絡稱作長短期記憶(LSTM)網絡。主要作法是不同的短期記憶應當在不同的時候調出,以便為當前的輸入指定正確的意義。


不過,實在還是不懂為什麼能夠記憶長期資料。


大多數RNN的應用都發現LSTM較RNN為佳。以RNN的MNIST正確率95%,改為LSTM(cell改成lstm),程式test15.py,正確率近百分之百。

其他範例test16.py,它讓nn自動追上一個sin的圖形,從範例中可以發現它越來越靠近。


另外的應用如,文字自動生成,先下載這個能處理中文版本的範例,它可運作,也會是後續更多應用的基礎。
Char-RNN-TensorFlow-master
訓練指令
python train.py \
  --use_embedding \
  --input_file data/poetry.txt \
  --name poetry \
  --learning_rate 0.005 \
  --num_steps 26 \
  --num_seqs 32 \
  --max_steps 10000
測試指令(必須把code中ipython拿掉)
python sample.py \
  --use_embedding \
  --converter_path model/poetry/converter.pkl \
  --checkpoint_path model/poetry/ \
  --max_length 300
自動接續故事專業版sequence2sequence介紹

筆記:ubuntu環境下開發工具安裝及使用

基本操作指令
  1. Alt + F2  輸入 gnome-terminal可開出terminal
  2. github
  3. unzip
  4. 輸入法:system settings  然後 Language Support  然後 install 缺少的package  然後登出再登入 ConfigureFcitx 選 + 選新酷音 關閉後會看到
  5. 繪圖軟體:KolourPaint
  6. 文字編輯器:notepadqq存檔的時候,記得設定語系,不然python會錯誤
  7. 文字編輯器:VIM sudo apt-get install vim  a : append  esc 跳回上層  VIM使用

GCC
  1. gcc -v是5.4.0太高,tensorflow build版本 用4.8 參考資料
  2. 決定全部降為4.8,參考文件 這裡
  3. sudo apt-get install gcc-4.8
  4. sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
  5. sudo update-alternatives --config gcc
  6. gcc -version   就是4.8.5
  7. 如果執行gcc-5 -v 就會看到原本
  8. 如果要全部變回來 sudo update-alternatives --remove gcc /usr/bin/gcc-4.8

循環登入問題
  1. 若不小心刪除或更新顯示卡的driver,就會造成螢幕解析度超大,GUI界面登入後不斷跳出要求重新登入的問題。例如安裝gnome-editor時居然也會出問題。
  2. 開機後,持續壓著shift按鈕,就會進入grub
  3. 選擇advance 繼續選擇 recovery mode (目前是 lunux 4.15.0-36-generic)  繼續選擇 root
  4. mount -o remount,rw /   參考說明
  5. mount --all
  6. sudo apt-get remove --purge nvidia-*
  7. reboot
  8. 進入系統後再重新安裝
  9. 不過,沒有用,下次的安裝還是會造成nvidia套件的問題,所以重灌了三次,唉
  10. 另外,軟體 text-editor 千萬不要裝,裝了似乎就會引起循環登入問題

File System Mount
  1. fisk -l 檢視目前硬碟狀況,條列每一個接上的硬碟
  2. 目前/dev/nvme0n1 是SSD 又分成三個 Linux(最大), Extended, Linux swap
  3. 目前/dev/sda 是傳統硬碟
  4. 目前/dev/sdb 是USB碟
  5. 目前/dev/sdb1,2,3,4 不知道是什麼
  6. ls /dev/[sh]d*   例如現在的/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  用不到
  7. df -h 顯示出目前硬碟的掛載狀態
  8. fdisk -l /dev/sda 可以確定是傳統硬碟
  9. fdisk /dev/sda
  10. p: 列出目前全部的partition
  11. d: 刪除某個partition
  12. n: 新增分割區,輸入 n 按 Enter。
  13. 選擇要建立 extended 還是 primary partition,因為我的硬碟全部只要一個分割區,所以我選 primary,輸入 p 按 Enter。
  14. 選擇 Partition number,primary 分割區最多可以有四個,隨便選都可以,不過建議選 1,免得以後看起來很奇怪,輸入 1 按 Enter。
  15. 輸入開始的 cylinder,用預設值就可以了,直接按 Enter。
  16. 輸入結束的 cylinder,若是要用最大的容量,就直接按 Enter,若是要指定分割區的大小,就用 +size{K,M,G} 的形式指定,例如指定為 100G 的大小就輸入 +100G 再按 Enter。
  17. 最後將分割表寫入硬碟,輸入 w 再按 Enter。
  18. 若是要離開 fdisk 就輸入 q 按 Enter 就可以了。
  19. format : mkfs -t ext4 /dev/sda1
  20. more /etc/fstab 硬碟的 UUID 就像是它的身分證字號,每一顆硬碟都可不同的 UUID,使用 UUID 來指定磁碟就不會因為安裝的順序不同而產生變化,這樣做的好處是若是當磁碟常常要拔來拔去時,系統管理者不用再去更改 fstab 的設定,系統會自動尋找對應的 UUID 來掛載。
  21. sudo blkid 可以看到每個硬碟的UUID,利用這個資料,更新 /etc/fstab
  22. 更新 /etc/fstab 依樣畫葫蘆,新增加一行 UUID=ac001b70-682c-454d-8b96-dca2fb5da992 /data2          ext4    defaults        0 1
  23. 重新開機 mount /data2 可是最後發現 根本不需要這麼麻煩 系統似乎會自動抓取

定時備份
  1. 實在無法解決nvidia的衝突問題,決定安裝timeshift連結,定時備份可以回朔
  2. 系統 軟體和更新 關閉全部的通知機制 參考
  3. 最近一次是因為pip -force 會自動刪除掉許多模組,導致下次無法順利開機,解決方式是,用ubuntu安裝USB,設定為開機磁區,進入後,起動內建的GNOME UBUNTU,然後
    apt-add-repository -y ppa:teejee2008/ppa
    apt-get update
    apt-get install timeshift
    然後起動timeshift,找到1T那個槽,選擇最新的檔案,選第一個,然後繼續就會出現一堆add delete update的表,反正不能改,就繼續進行,然後重開機就完成

JAVA
  1. sudo add-apt-repository ppa:webupd8team/java
  2. sudo apt-get update
  3. sudo apt-get install oracle-java8-installer
  4. sudo apt-get install oracle-java8-set-default
  5. java -version

Android studio安裝
  1. Eclipse用了好多年,配合安裝Ubuntu,拾起Studio。參考資料
  2. download 約1G,已經放在1T硬碟
  3. unzip,執行bin裡面的studio.sh,這邊需要透過terminal來安裝。cd android-studio/bin/./ studio.sh
  4. install some files ( UI automatically )
  5. UI launcher open Android Studio,click on Tools menu / Create Desktop Entry. / This should create an entry on the dash.
  6. try to build it. Studio automatically download the file in background ( SDK ... once )
  7. 過程中原本是要放在/usr/local,不過出了很多問題,乾脆就留在目前usr目錄
  8. build還是有問題,發現是sdk沒有經過同意 如下 ~/Android/Sdk/tools/bin$ ./sdkmanager --licenses都選擇同意
  9. 編譯成功,無法放在simulator上執行,重新開啟一個專案執行run,會出現需要simulator,選擇一個後,花很長時間下載,仍不成功
  10.  調整bios 將cpu設定成可以允許vt,模擬器顯示成功
  11. adb 位置在 /home/kayjean/Android/Sdk/platform-tools
  12. 自己的N8手機,開啟攝定,版本部分按很多下後,就會進入開發者模式,再進入開發者模式,允許USB偵錯。接上ubuntu,使用adb devies成功
  13. 實際安裝進手機時,似乎版本不合,取得新版本後成功
  14. 最基本的範例是my application2

Android studio使用
  1. gradle架構,最大的範圍是project,裡面包含許多小的module,各個小的module(可能是app也可能是lib)都會有自己的build.gradle,參考資料
  2. 一個project要把各個module包含起來,就要使用file的project structure
  3. 沒有DDMS了,位置在SDK/tools/monitor 代替

Android studio NDK
  1. 目前系統安裝v18,如果從中文頁面進入是16b,16b可順利編譯但每次啟動android studio會跳出更新訊息。
  2. 遇到No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android錯誤訊息,就參考,到這裡,下載不同版本
  3. NDK安裝方式
  4. 總之,以上的方式都太過複雜,真正嘗試後,還是有問題。最簡單方式是程式啟動時,依照wizard指示,選擇有c++ support的選項,就可完成(雖然沒有.h檔案)。例如my application3

 

WebCam

  1. 以程式控制webcam,最基本為v4l2,基本範圍為C
  2. 進階為OpenCV,又可以區分成基本的C語言
  3. OpenCV - Python
  4. OpenCV - Python Thread版本


Ubuntu上使用Github

  1. 為了能夠多地點儲存以及rollback開始使用github
  2. sudo apt-get install git
  3. git config --global user.name "kayjean"
    git config --global user.email "kayjean@gmail.com"
  4. mkdir github    cd github/
  5. git init Mytest  (會新增實體目錄Mytest)
  6. cd Mytest 接下來在這個目錄中操作
  7. gedit README type some messages
  8. gedit sample.c type some messages
  9. git add README
  10. git add sample.c
  11. git status 可以看到目前還有哪些沒有被commit
  12. git commit -m "my first commit"
  13. create a repository on github with the same name using UI function( 內部測試,都設定為private模式)
  14. git remote add origin https://github.com/kayjean/Mytest.git
  15. git push -u origin master 輸入帳號密碼 完成上傳和sync的動作
  16. try to update sample.c or create a new file sample2.c
  17. git add .
  18. git commit -m "my xxx commit" 重複上面push
  19. 取消:commit前,取消先前add的內容可以使用 git reset HEAD [filename 包括目錄]
  20. 取消:commit後,git log --oneline 看到最後一個動作的號碼 git reset e12最後一次號碼d8ef^
  21. 下一階段就是增添ignore目錄
  22. 下載github專案,拷貝URL後,到目錄下git clone 網址,會新增加那個目錄
  23. 其他參考  連結一  連結二  連結三

    2018年10月26日 星期五

    單車漫遊:睽違兩年再上武嶺

    第二次上武嶺

    西進武嶺是許多單車騎士心心念念的挑戰路線,自己在二年前和交大一群同學騎過(連結),這個夏天應楊爸邀約,因緣際會參加2018 Never Stop,再度騎上了3275公尺的武嶺之巔。

    活動前一晚是睡車裡,自從有車用蚊帳解決空氣流通問題後,就習慣在郊山或路跑、單車等活動前睡在車裡,主要原因是這些地方多半地處偏僻附近民宿少,集合時間也早,汽車的移動性高,能同時解決訂房和報到問題,更少了寄物的煩惱,一舉多得。

    當天凌晨四點即起,車外路燈照耀下,通往霧社的省道已被熱身的車手們佔據,數個車隊把馬路當成訓練場,封街般的順向逆向反覆穿梭滑行,路邊則有不少團體大家都圍聚著聽所屬車隊最後的指示,看大伙都結伴同行,自己雖說是和楊爸同行,卻始終無法聯絡上他,感覺有點形單影隻。還好有過登頂經驗,就算是單兵獨騎也沒問題。

    熱鬧的開幕

    近五點,會場氣球門後,由上千台彎把公路車構成的景象,讓人嘖嘖稱奇。時間一到,只見綿延不絕車陣通過拱門後就奮力向前衝去。由此地至人止關距離約15公里,地形上是沿著眉溪旁平緩公路緩慢上行。

    漆黑中,左側的守城大山和右側舊武界越山只剩輪廓,卻讓人更覺得深邃和孤高,只剩前方車燈匯集成的光之道路消失在深處,回望,則是由後車燈光標誌著的點點來時路。忽然感覺到自己也是這光之路中的一份子,像是長河中,朝聖的行者,快速在黑夜中奔馳而去。

    人止關前,兩側山嶺輻合,眉溪也驟然縮減猛向右鑽入峰谷中。此處崇山峻嶺,山高水深,地勢自成天險,清末漢人和原住民在此多有糾紛,卻也都無法跨越對方雷池一步。清吏就在此劃定界線,要漢人止步,也就是人止關的由來。過此處後,高度漸次提升,前面熱身結束,真正爬坡由此開始,沿路各種坡,差別僅是大坡、小坡和變態坡的區別。

    人止關前

    六點三十分抵達霧社,天已亮,再往清境去,七點四十分抵達清境國小稍稍休息,以往對清境的印象就是滿山遍野的民宿,實際上,從清境國小到武界,距離足足有五公里,除民宿外,還散佈著許多製茶和種植高山蔬果產業。他們沿途奉送茶水和水果,幫我們打氣,真是衷心感謝他們。

    路邊小妹妹幫著送香蕉

    畜牧中心前美麗景致

    武界附近公路景緻

    八點五十分到梅峰補給站大吃大喝,美其名是為後續艱難路程儲備體力,實際要賺回報名費。而且梅峰後,路線由背陽面轉入太陽曝曬區,在坡度不減狀況下氧氣卻一直減,騎起來真的會有欲仙欲死的感覺,真的要多吃些啊。

    補給站前滿地的單車

    從這裡開始,我也開始使用最輕的齒輪比,直到武嶺前,也都維持這種狀態。尤其是過鳶峰後,坞速低到走路都比騎車快的慘況,許多參賽者都下車當步兵。主辦單位Never Stop的口號早就被拋進對面山谷,建議日後改名為Never GiveUp比較貼切。

    我不愛牽車,採取定點休息兼拍照的策略,騎騎停停中還是盡力保持著騎的姿勢。沿途也會發現,身旁的參加者,雖然互有超越,但經歷這麼長距離彼此體力相近也就是這些熟面孔,雖然沒有言語,但都心照不宣專心一意的向前騎(走),很有命運共同體氣氛。

    令人恐懼的髮夾彎

    總算在時限七小時前龜上武嶺,如此隨興不專業,裝備也僅是平把公路車又缺卡踏的中年大叔,能如此心無旁鶩的投入且不放棄,自己都覺得驚奇與感動。拍照後,找到楊爸,兩人結伴下山,回程並由他們夫妻請吃美味午餐,真是謝謝他們。

    高山草原

    回想活動過程,因是首次參加大型單車活動,自然會和路跑相比較,兩者在流程、補給、獎勵機制上都類似。對參加者來說,受到團體動力的砥礪,過程中也會不由自主的想要精進自己,締造佳績。

    以我來說,從昆陽到武嶺這段路,若非看著其他車友都認真騎,自己鐵定會拖延更久,或是看到同樣路程,有人竟能在四小時完賽,也湧起有為者亦若是的心情。若再年輕十歲,或許真的就會投入配速和迴轉速或功率計等裝備的精進。但人的注意力總是有限,聚焦在本職學能更會有方向感(也更有貢獻吧),單車部分就維持著歡樂騎的心,保持著探山涉水好工具。

    和楊爸合影


    彩蛋區  遊山玩水,首選非東進武嶺,最近開始計劃 新城海邊至武嶺,預估輕鬆騎也要十小時。參考如下
    他人記畫一  他人記畫二
    住宿

    2018年10月21日 星期日

    散文集:傳奇莫言


    書名會誤導人以為是介紹莫言生平,實則是將莫言所寫的鄉野傳奇故事彙集成冊,與讀過的蛙(筆記連結)和生死疲勞相比,塊頭雖小但同樣精彩。

    莫言的筆下世界,總是圍繞著故鄉高密的人民和黑土地。而鄉野間,最不乏,就是離奇故事和怪談。長篇小說生死疲勞中,莫言就大量將離奇故事溶入他中國式的魔幻文學中。寫起短篇文集,當然是淋漓盡致、得心應手。

    全書十一篇短篇,情節都不複雜曲折,描寫卻很生動,個人依故事素材區分成五種標籤。揶揄名利類,神嫖、良醫。神怪故事類,夜漁、翱翔。奇聞異事類,天才、地震、屠戶的女兒。愛情類,辮子、初戀。最後一類是對北大荒飢荒和鬥爭的描寫,糧食、靈藥。

    莫言文體簡潔洗練描寫人物感情細緻複雜,對景致的描寫更是脫俗動人,不過小說能成為有價值的文學作品,除前述外,往往更因為加入了作者的思想。與現今人們相比,民初時代人務農者眾,普遍有民智未開現象,個性上大多無奈且聽天由命。若外在環境如天災頻仍或戰事波及,生活上受到巨大壓力時,外多半是退縮認命,而少數個性鮮明主角,就顯得原始又生猛有力。

    我喜歡莫言故事,總是能透過不同的視角和回顧,不帶成見的,給讀者留下想像和自我判斷的空間,即使是短篇傳奇亦如是。

    2018年10月19日 星期五

    筆記:CNN及眾多應用

    將高雄港邊夜景逆時鐘旋轉,好像CNN範例

    • 深度學習概念(連結)
    • CNN及眾多應用(連結)
    • RNN及眾多應用(連結)
    • TensorFlow安裝(連結)
    • TensorFlow語法與使用(連結)
    • Porting AI ( QCS605 QCS603 Android )(連結)

    CNN


    卷積神經網絡(Convolutional Neural Network,CNN)的出發點是利用圖像的局部信息,例如局部模式如輪廓和邊界,通過「卷積核」作為中介,圖像通過卷積操作後仍然保留原先的位置關係。



    卷積(convolution)乍聽之下會聯想到天上美美的卷積雲,但那是美麗的誤會。以離散的觀念可看成是向量平移和加權疊加。若用連續的觀念,就是不僅僅與當前時刻輸入有關,也跟之前若干時刻的輸入有關,是之前時刻的輸入信號經過一段過程,對現在時刻系統輸出的影響,就要考慮各個時刻連續性輸入的影響(疊加)。

    y(n)=x(n)∗h(n)
    y(n)的序列表示成y(0) y(1) y(2)代表系統的反映信號。
    x(n)的對應時間的序列x(0) x(1) x(2)。
    所謂的影響可以是減弱或增加,但是影響的方式和強度可以更進一步變成。h(t)這個函數與x(0)相乘來表達,方式為x(m)×h(m−n)

    若是圖像處理,最常見的例子就是MASK運算,常見應用於濾波處理。用一個模板和一個圖片進行卷積,對於圖像上的一個點,和模板相乘,然後各點的積相加,就得到了這點的卷積值。對圖像上的每個點都這樣處理,可以消除噪點,強化特徵。


    用下面這個平均矩陣,來平滑圖像,高頻的信號就會被周圍的數值平均成為平滑山峰。


    整張圖形的做法,則是類似下面的計算方式。


    DNN將二維圖形,以一維陣列來表示,雖然有效,但喪失了圖像的結構和附近點的彼此關聯。CNN類似人臉辨識時使用Eigen想法。有些特徵不需要看整張圖片才能捕捉起來,也就是將圖片解析度降維的方法。下面是各種由簡單到複雜的CNN模型和應用。

    除了CNN畢竟有許多要



    NormalLenet5AlexNetVGG
    MNISTpart1part2part3
    CIFAR10

    part4part5

    part1


    來原

    MNIST利用CNN處理後,正確率可以提升到百分之九十九,效果非常顯著。test12.py (和範例相比較,74行有變動)。
    1. Max-pooling 這是為了確保經過 Convolution 後圖片中的特徵可以被確實保留下來而採取的方法。
    2. 不同的 Activation Function 先前在添加神經網絡層的時候,如果沒有指定 Activation function 就是使用預設的線性函數,但是在 CNN 中會使用 ReLU(Rectified Linear Unit)作為 Activation function,模擬出非線性函數,確保神經元輸出的值在 0 到 1 之間。
    3. 新增 Dropout 函數 用來避免過度配適(Overfitting)。
    4. 更換 Optimizer 將我們先前一直使用的梯度遞減(Gradient descent)更換為 ADAM,是一個更進階且更成熟的梯度遞減演算法。

    輸入圖片(解析度 28x28 的手寫數字圖片)
    第一層是 Convolution 層(32 個神經元),會利用解析度 5x5 的 filter 取出 32 個特徵,然後將圖片降維成解析度 14x14
    第二層是 Convolution 層(64 個神經元),會利用解析度 5x5 的 filter 取出 64 個特徵,然後將圖片降維成解析度 7x7
    第三層是 Densely Connected 層(1024 個神經元),會將圖片的 1024 個特徵攤平輸出結果之前使用 Dropout 函數避免過度配適
    第四層是輸出層(10 個神經元),使用跟之前相同的 Softmax 函數輸出結果

    part2


    來源
    運作為目錄test23,先安裝sklearn( pip install -U scikit-learn ),並且把MNIST_data部份資料移動到mnist/train-labels.idx1-ubyte 等四個
    依序執行
    python  lenet5_train.py 訓練
    python  lenet5_evil.py 產生評估結果
    python  lenet5_test.py 需要在工作目錄下,製造20個檔案,正確率70%,並有比較圖
    最後是進行特殊測試kaggle,參考文章
    https://www.kaggle.com/competitions 選擇digit recognizer


    選擇data - download all
    用google帳號登入下載了全部,將test.csv解壓縮後,放在工作目錄執行
    python  lenet5_kaggle.py 結果 result.csv但是沒有比對正確答案,先擱置

    part3


    來源



    Alexnet架構如上
    參考的說明位置  建立新目錄test24並且還要建立mnist並且把四個檔案拷貝進來,依序執行
    alexnet_inference2
    alexnet_train2
    alexnet_eval2
    正確率97%

    part4

    同樣是Alexnet架構
    參考的說明位置  建立目錄test25
    需要先下載檔案 位置  有三種檔案,下載的是  CIFAR-10 binary version (suitable for C programs) 解壓縮後在工作目錄下狀態是 data/cifar-10-batches-bin 有許多bin檔案依序執行
    read_cifar.py  連續跳出兩張圖片
    cifar_inference.py
    cifar_train.py
    cifar_eval.py 正確率66%

    part5

    VGG模型
    VGG架構
    參考的說明位置  接續前面測試test25 依序執行
    vgg_inference.py
    vgg_train.py
    vgg_eval.py 正確率 80%
    vgg_test.py  需要自己做出20張 32*32大小的飛機照片,文章提到測試效果不好(並沒有實際測試)

    Grad-CAM

    連結
    連結
    連結
     

    其他範例

    ImageNet範例
    蘋果中文字辨識範例
    下棋範例
    自動著色
    Prisma;CNN的過程中,可以讓系統逐步學習到畫作的風格,累積眾多分類答案後,就成為分類器。若在風格這個層次暫停,讓系統記憶風格資料。當輸入一張新的圖片時,讓CNN將新畫作和記憶的風格相比較,當然會有很大的差異,差異越大,表示風格越不同。但是若在這時後,修改畫作,減少差距。逐漸累積後,新畫作就會成為新的風格。這就是Prisma的精神。應用上可以參考文章。必須具備有VGG。

    CNN延伸應用,物體位置辨識


    能夠在一個畫面中,找到各個項目,有許多精彩的演進。參考資料。基本精神是用openCV的想法,利用Sliding Window找不同範圍,效差不佳,開始有以Bound為基礎的各種加速手段。
    1. R-CNN:先取出約2000個可能的區域。
    2. Fast R-CNN:在 R-CNN 中,2000 多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的 CNN 很多都是重複算的。所以 Fast R-CNN 的原則就是全部只算一次 CNN 就好,CNN 擷取出來的特徵可以讓這 2000 多個區域共用。先透過 selective search 預選 region proposals。
    3. Faster R-CNN:與其預先篩選 region proposals,不如從 CNN 的 feature map 上選出 region proposals。實做的方式可以參考這個
    4. Mask R-CNN:使用FCN概念,建構於 Faster R-CNN。

    YOLO


    很娛樂化的名子,能在前面這麼多精彩論文下,開闢出新做法,並且大幅提升辨識率速度,雖然正確率不是最前段班,但考量速度這個因素,已經很難得。

    方式上,揚棄了bound的概念,是將整張圖視為一體進行訓練和測試。一開始不太能體會他的想法,後來漸漸掌握到,它每格的大小是固定的。每格內容不包括格子和整張圖的相對位置,而是和這個類別的相對資訊,還有框的大小,還有分類機率值。原本以為它和同一畫面中其他物件有關係,後來才發現那是錯誤的想法。

    後續的YOLO 2和3 還有更好表現。

    這是論文的原文版中文版概念介紹1概念介紹2  非常棒的演講 。很好的說明1 說明2

    實作部分,先建立tensor/yolo目錄,下載入門專案的code,解壓縮,依照指示就可完成。有幾點要記錄。

    1. 目錄在tensor/yolo
    2. train後的內容是以ckpt方式儲存,存放位置在model/中
    3. 如果下載已經預先訓練檔案 pretrain ckpt file ,移動到model/pretrain目錄後,直接執行就可以看到成果。test:python demo.py
    4. 如果依照pascal-Voc2007從無到有開始建立,過程包括下載檔案,放置到正確位置
    5. unzip pascal-Voc2007 train data and test data into the same folder / data ( train and test mixed together )  file1 file2  prepare a folder "VOCdevkit2007"  mv VOC2007 to "VOCdevkit2007"
    6. 開始執行,python tools/train.py -c conf/train.cfg
    7. 程式中設定是執行一百萬次,在目前機器上,大約一萬次一小時,中間中斷半成品也可以測試歐,只是準確率較低,也不知道能否接續訓練
    8. 未來,自行訓練需要格式。既然有pascal-Voc2007的執行範例,會發現前面有段先製作業,將資料轉換成需要形式,也就是說,未來可以訓練自己的資料格式 convert the Pascal-voc data to text_record file (python tools/preprocess_pascal_voc.py )
    隨便以chair為例,成功框出區塊


    程式碼對應說明:文章1 文章2   文章3  文章4
    其他git:  git  git

    2018年10月14日 星期日

    散文集:一本書讀懂西夏

    像風一樣消失了的草原民族 作者陳海波

    因為想去青海騎單車,書架上看到西夏書以為有關聯就翻閱起來。在此之前,對西夏的瞭解,僅停留在天龍八部中虛竹的西夏公主夢姑,以及駱以軍小說西夏旅館的程度。翻著翻著才發現,西夏和青海湖八竿子打不著,雖然有些失望,但能趁機補充歷史知識,還能領略作者用較宏觀角度解讀西夏與蒙古關係,無形中開拓了自身視野。

    西夏位於中國西部,也就是今甘肅和寧夏回族自治區附近,屬於黃河中上游。自漢朝通西域後,此處就是漢族重點治理區域,並沒有讓党項族自立的可能性。直到唐朝末年,党項族首領拓跋思恭因助唐朝平亂有功被賜姓李,封夏州節度使,成為此區的割據勢力。宋初,國家政策對各地的治理態度是極權管控,導致雙方衝突加劇,當時領導者李繼遷無法和宋朝抗衡,避走漠北。

    看似無望的建國路,卻因為遼的興起(907-1125)和北宋自我衰敗有了轉變,李繼遷後期,藉著與遼同盟和對宋不斷侵擾,逐步壯大了自己聲勢。

    西元1038年,子嗣李元昊正式立國稱帝。此時的西夏,社會上脫離部落形態,轉型為以儒教和佛教為主的社會,內部積極練兵秣馬,外部則是利用各方衝突,實現國家利益最大化,將國家帶到了一個前所未有的高度。之後幾場重要戰役讓宋朝不得不承認其獨立地位,爾後和宗主國遼對抗也告捷。形成從青藏高原到黃土高原,以夏州為中心的穩固政權。

    西元1125年,遼被東方新嶄露頭角勢力金國所滅。在這之前,西夏就展現其靈活之姿,改與金合作,並趁機佔領遼西邊許多土地。根據歷史所記,這段時期,政治上雖有外戚專制與任得敬分國事件,社會仍然穩定,直到西元1206年,北方草原上蒙古帝國崛起,敲起了西夏的喪鐘。

    面對強大的蒙古族,西夏沿襲以往策略,拋棄金國,改弦易轍聯蒙制金,並且金進行多年互相傷害的內戰。西元1225年,蒙古族成吉思汗完成貫通北方歐亞大陸的目標後,目光轉向南,首當其衝的就是西夏。經過兩年的血戰,蒙古於1227年攻破西夏首府中興府,結束190年西夏歷史。

    後人對於一個曾經以鐵血征戰奮起又輝煌的王朝,二百年間就如煙花殞落,當然會覺得錯愕,就像是恐龍滅絕般,總想尋覓它滅絕的原因。作者對此的看法很特別,作者認為,西夏國力弱小,戰爭潛力有限,經濟基礎薄弱,從西夏所處的地理環境來看,西夏整體處於高寒地帶,大多是山丘、沙漠等不毛之地,僅寧夏平原和河西走廊是兩大農牧區,但區域仍太小。這些都直接影響了西夏國的進一步發展壯大。

    反之,新興且更具活力的蒙古帝國能征服四十多個國家,攻占數千萬平方公里的疆土,不是偶然。而西夏獨特的地理位置,河西走廊地區是連接西域和中原的橋樑,是由大漠進入中原的交通要道,也是蒙古進出南方的主要通道,蒙古族必定會由此向南延伸,在彼此實力相差懸殊下,被蒙古征服只是時間早晚的問題,不是其執行什麼政策就能避免的。

    河西走廊南北都是高山

    作者將國族興衰用較高視點重新說明的方式,讓我想到有篇文章(連結)將數千年來氣候的冷暖波動、乾濕變化與中國北方民族政權疆域南界的緯度變化三者關係後發現,無論是王朝的興衰,還是遊牧民族的階段性南下及其南遷的幅度,都與氣候的週期性變化及其變化程度存在著大體同步的共振關係。類似以科學或系統化方式研究歷史,未嘗不是個方向。

    全書對西夏建國前後,如何在困境中,和敵人須以尾蛇,聯合強者打擊弱者,都有詳盡描述,更對金和蒙古的發展史做了生動說明。對從小僅受漢文化教育的我們,提供許多草原游牧民族的歷史知識。

    2018年10月10日 星期三

    小說集:海神家族


    海神家族是本半自傳體小說,既然是自傳型式,不免會想探究作者背景,作者陳玉慧,是位持續投入文學和編劇創作的女性作家,出生於1957年,台中人。

    作者父親是江蘇人,中國對日戰爭結束後,因緣際會來到台灣,短暫於軍中服務後,轉入公路局服務,中年捲入共諜案,出獄後隨解嚴後返鄉潮返回大陸探親,嘗盡人情冷暖後返台,從作者眼中看去,是位僅在乎自己私慾,毫無家庭觀念,不適合婚姻的失敗者。母親則因為從小失去父愛溫暖,還有操勞家計的壓力,情竇初開時便不顧家人反對和作者父親私定終身,婚後生活非常不順利卻無能為力,個性上,是作者一生想要避免的原型。

    再往上一代看,外公是位皇民化台灣人,也是二戰期間首先響應台籍日本兵行列的理想份子,戰後經歷創傷症候群,更在228事件後消失。外婆是沖繩人,看似柔弱卻有堅強個性,隻身來台後,經歷各式苦難,成為一肩扛起家庭重擔的偉大女性。中間還穿插外公的弟弟延伸出三角戀情,也因為他台灣共產黨的身分,更故事更為糾結和充滿張力。

    時代的動盪、複雜的環境,封閉了當時所有人的心靈,活著,若不是苟延殘喘沉默消極,就是像動物般以最自私的方式對待他人。

    作者並未經歷這些,身為下一代人,當然是無辜的,但巨變後激烈的迴聲是沒有道理可言,仍是讓人震耳欲聾。頭腦清醒的人就會痛苦,心思敏感的人,對身分認同,破碎的家庭關係,感到莫大失望。作者選擇帶著苦痛的成長記憶遠離家鄉,在國外流浪漂泊半生,成為無根的人直到2009年,偶然機會盼到靈魂伴侶,促成她以文學型式探究家族歷史軌跡。

    ----

    文章從作者自身逝去的夢,殘破的童年開始,透過回溯個人的尋根之旅,以三代女人為故事架構,完成家族的小歷史。橫跨了日治時期、國共戰爭、台灣接收後228與共諜案,各種歷史傷痕,單薄與病態的負面敘事,都成為她的養料。讓這本小說不只是家族祕辛,更牽引出時代、社會的現象

    家族與國族命運交疊下,每個角色都那麼孤單,出走也成為一種不得不然,最後,作者在文章中更不斷的自我質問。為何悲劇性生命不斷被下一代複製而無法掙脫?為什麼被愛、被認同、被在乎的渴望始終不能被滿足?為什麼用盡全力去愛的人卻無法被接納?

    這些宏大的問題,都是那麼難以回答。所以文章中總是不經意流露出憂傷的氛圍,和永無止境尋找失去家園的情景。

    我個人對這些疑問,始終抱持著較為客觀的看法。從作者外婆隻身來台篹起,距今可能九十年吧,看似不遠,但那時的人,身份都是被安排好的,就像是蜂窩裡面的蜜蜂,完全是社會化的組織和結構,因為都被規範好了,根本沒有自由不自由的問題。

    而作者父母這一代人,剛剛從前面時代轉過來,對「情愛男女」、「世代姻親」、「自我覺察」的能力很弱,加上環境劇烈變動,根本來不及思考,當然也就缺乏觀看自己處境的能力,更對家人和自我的調整非常陌生。

    現代人觀照的疏離無家感與悲觀生命基調,大多是到了現代,因為社會結構改變才產生的議題。要在當時背景中尋找現代人重視的愛與關懷,無非是奢求。若能抱持中立且寬容的態度,才有機會看見那些已經逝去的肉體和曾經出現過的情感軌跡,也才能讓仍在繁衍著的我們,得到借鏡

    ----

    相比於作者,我家族也有自身歷史。爺爺奶奶是江蘇人,一輩子不離開家鄉的人,因為對日抗戰跑到湖南生下我爸,外公外婆是距離更遙遠的河南與山東籍,也是因為戰亂,才有機會在上海相識生下我母親。若非姻緣,兩個完全不同家世的人,也不會在台灣海峽這端結婚生下了我,父母親相處方式雖然不像陳玉慧般負面,但也好不到哪去,因為這些關係,使我對這本小說特別有感應。或許哪天,我也能模仿作者,藉著書寫,解除些身上困境。

    2018年10月3日 星期三

    筆記:深度學習

    桌前孔雀魚的尾鰭 很像某種神經網路



    深度學習是人工智慧的一個分支,完整的人工智慧是假設機器具有和人類相同的思考能力,不過這個目標遠遠脫離我們想像,過於遙不可及。一般工程師會接觸到的人工智慧,僅能視為"初階"人工智慧,又分為統計為基礎的機器學習,和深度學習。

    統計概念


    統計中提到的評估方式,除了連續性回歸分析外,也是輔助和強化深度學習的基礎。
    1. VSM
    2. KNN分類
    3. 無母數統計
    4. 線性方程式
    5. SVM

    網路文件自動分類 自己論文

    線性迴歸。已知迴歸模型(y = 0.1x + 0.3)的係數(0.1)與截距(0.3)。亂術產生一組線性的數值,計算新產生數值和標準結果的差距,盡量讓這個差距縮小,經過多次的iterator,數值趨近正確。結果會是0.1和0.3。

    iterator的一個重要概念就是optimizer,常見的是GradientDescent,梯度下降法,利用跨的遠近以及產生的負值,因為有很大的負向,就會快速到達正確點。參考test1.py。另外一篇對梯度下降的介紹連結
    起始狀況,預測線距離很遠,斜率也完全不同

    經過四十次iterator,開始接近目標值

    深度學習


    深度學習與機器學習不同,出發點是仿生,模擬生物神經細胞鏈結和迴授特性(文章介紹)。雖然過程是黑盒,效果卻出奇的好。事實上,此概念早在三十年前成形,只是近幾年,因為網際網路興起,以往難以取得的訓練資料,突然隨手可能,且高效能GPU也普及,再經過AlphaGo的一戰成名,各大科技廠高調宣揚,還有媒體的推波助瀾,讓深度學習成為顯學。

    深度學習的特色是效果驚人,且有一致性,對人們來說,卻有無法解釋的缺陷。費曼有句名言What I cannot create, I do not understand。大意是說我不能創造的東西,我就不瞭解。套用在深度學習上,就是,我們幾乎無法對一個模型為何能運作成功,提供完整解釋。這個連結是google提供的視覺化觀察方法(連結)。

    接觸相關領域後,有兩個小心得,
    一是此領域實在是飛躍性的成長,尤其是CNN和物件識別部分,實在如同百花齊放。
    二是Deep learning 堆 layer 的方式,跟要處理的問題領域息息相關,背後所需要的經驗難度不亞於 feature engineering。情境一換就得重調參數。不論是模型選擇和參數調整,都牽涉許多基礎概念,不像網路或是資料庫般直觀或用簡單推論就可獲得。

    以下是由基礎到進階不同的神經網路。討論前,先介紹常見範例MNIST手寫數字,內有多張圖像,且都直接轉變成一維陣列。test9.py 會自動連結網路下載mnist檔案,存入MNIST_data目錄。test10.py 透過ui界面顯示圖形檔案。

    單層神經網路


     每一個圖形進來,都會轉變成784X10的權重矩陣(還要加上biases),softmax計算出來的數值,在每次iterator中,系統會自動更新weight和biases的數值(更新的方式就是梯度下降,數值就是使用的參數)。隨著iterator增加,正確率也會增加,直到沒有辦法再細微調整。其中使用了。
    oftmax_cross_entropy_with_logits進行lost計算(連結)。
    activate function Softmax為分類器
    函數將分類器輸出的分數(Evidence)轉換為機率(Probability),然後依據機率作為預測結果的輸出,可想而知深度學習模型的輸出層會是一個 Softmax 函數。



    test11.py 訓練和測試結果,準確率92%,並且會產生TensorBoard目錄。,僅單一hidden,且與一維陣列配對,即使如此抽象表現形態,MNIST表現上也有92%效果(說明)。test28.py,正確率約為89%,說明位置連結。兩者寫法不同,但是概念相似,奇特的是,就是始終有3%的差距。

    雙層神經網路

    以數學來解釋兩層的神經網路,可以用非線性迴歸的例子,test2.py。activate function可使用的函數如下。tf.nn.relu() tf.nn.sigmoid() tf.nn.tanh() tf.nn.elu() tf.nn.bias_add() tf.nn.crelu() tf.nn.relu6() tf.nn.softplus() tf.nn.softsign() tf.nn.dropout()

    輸入參數都相同,可隨時互換使用,函數概念也不相同,這也是設計神經網路時,需要具備的知識。


    套用不同activate function後,得到的結果如下。

    tanh,左右的開口是向外


    softplus,左右的開口是向內
    relu

    sigmoid,底部與tanh不同

    XOR

    類神經網路很大特點是,他能處理非線性的問題,例如下面xor圖就無法畫一條直線分割紅點與藍點。一個單層神經網路的的結構,如果用單層神經網路的結構只能找出一條直線或是一個超平面,無論在圖中哪個位置放處一條直線,都無法完美切割,所以不適合解決 XOR 這種非線性的問題。


    多層感知機的結構包含輸入層(Input layer)、隱藏層(Hidden layer)與輸出層(Output layer),如果只是將「資料 * 權重 + 偏差值」,無論向前傳遞幾層,都只是在做線性組合(Linear Combination),線性組合不管做幾次結果都還是線性,那麼多層感知機要怎麼解決非線性的問題呢?

    在資料每次經過一個節點時,都會通過一個激勵函數,激勵函數即是多層感知機能夠解決非線性問題的關鍵。通過激勵函數後,便是做了一次非線性轉換,假設隱藏層與輸出層共有 n 個節點,就是經過 n 次的非線性轉換。test26.py  連結


    後續神經網路都會用TensorFlow(或Caffe)為範例,這些都是很高階應用套件,若有興趣,也可用較簡易的Java範例描寫Neural Network 參考這裡。參考編譯方式連結



    MNIST
    MNIST辨識改進成為雙層test30.py,說明(連結),成效不顯著,但是文章內容豐富。

    Tic Tac Toe圈圈叉叉
    Tic Tac Toe本質是策略步驟,並不是分類的概念,但若不管成效,也可以透過DNN訓練。方法是,feature設定為每次要下的棋局,label設定為應該要下的那個座標。形式類似csv內容。實際執行後,發現分數並不高。
    test31,說明(連結  連結)。


    CNN,和延伸的物體辨識,和YOLO(點擊這裡)

    RNN(點擊這裡)



    這邊為止以上都是屬於Supervised learning。DNN是神經網路的基本架構,CNN是架構在DNN上的應用,RNN延續DNN精神,因為加入時間因素而更豐富。
    Supervised learning requires training data showing example inputs and outputs, e.g.
    an image classifier is trained using along with an expected text label.
    a spam classifier is trained using example emails along with a label indicating whether it is spam or not.
    a house price estimator is trained using data about a house along with its price.
    supervised learning is driving most of the machine learning applications in production today, so that's the best place to focus your attention for now.

    ----------------------

    GAN

    生成對抗網路Generative Adversarial Network是加入Discriminator network的概念,更進一步讓神經網路強大的方式。

    Unsupervised learning does not need training data. A typical example is performing clustering on data to find similar groups. Move and product recommendation engines work this way -- they don't need to understand anything about the thing being recommended, they just need to know that people who like X and Y, also like Z.

    GAN有兩個需要被訓練的model,一個是Discriminator network,另一個是Generator network。透過來回運作,Generator network就會逐漸修正自己,成為正確結果。有點像是在作夢,透過機制調整原本訓練模型。參考文章,文章1 文章2 文章3 文章4 

    程式是test18.py,算是標準範例,利用mnist資料,也就是所謂正常的圖片(不在乎label),不斷產生假資料,但是假資料會越來越接近真實。

    逐漸有筆劃的感覺

    GAN有"未來性",特別再挑範例研究test21,解壓縮後包括測試資料和眾多python檔案,使用pil軟體 sudo apt-get install python-pip    pip install Pillow

    test21中 先執行 python main.py 會產生需要的訓練資料,並且在result中陸續看到逐漸變好的雜點移除細果。執行 python main.py --is_trained 會清除照片上的雜點。

    Attention Mechanism

    理論基礎(連結)。例如AlphaFold,突破突破暴力方法,用人工智慧決定蛋白質的3D結構( 連結 )。

    Reinforce Learning

    強化學習(reinforce learning)的概念看似類似GAN,但更適合用在和環境交互影響。可以被視為通用性AI的架構環境。

    Reinforcement learning works on anything with a reward function. A reward function basically means anything with a score. A common example is AI for playing computer games -- the video frames are provided as input, the model decides which action to take, an the resulting score is used to reinforce the model. If it doesn't have a score, you can use the length of time that your character stays a live.

    以遊戲的概念來看,以猜拳遊戲來看,某個動作都會有對應輸贏,就可以轉化為分類行為,類似遊戲,只要讓專家多玩幾次這個遊戲,並且紀錄他們的行為,就可以訓練模型。但這實際上並不是人類學習的方式,人類可以在無指導無專家的情況下,自學遊戲,也就是無標記。強化學習就是不需要標記數據,而是通過以往的經歷。這和心理學很像,並沒有所謂正確的行為,而是給予獎勵和懲罰。模型接受環境訊號後,輸出一個動作,然後等待環境動作,持續下去。 參考 參考文章 參考code

    pip install keras==2.2.0
    建立一個catch目錄,將test19 test20拷貝到這下面
    步驟一 python test19.py
    步驟二 python test20.py
    步驟三 ffmpeg -i %03d.png output.gif -vf fps=1   將結果編成gif

    CATCH遊戲出來的結果

    其他項目

    Transfer Learning如果在已經擁有的訓練架構上,給予新的學習目標,可以大幅減化新事物的學習難度。

    優化神經網路的方法
    Overfitting的處理 神經網路中,常見overfitting現象,原因是訓練資料太少就會有類似情形。處理方式如下

    1. 使用L1計算方式
    2. 使用L2計算方式
    3. 隨機移除掉部分weight,讓系統不要過份依賴一些節點
    Batch Normalization:處理資料不敏感問題
    外部處理數據:文章
    聲音範例 NSynth,介紹
    資料庫 中文資料庫WIKI 中文斷詞
    以AI進行人工智慧繪圖,作者是中國清華大學學生,休學辦公司,清楚介紹這個領域的架構和演進(連結)。

    生成式 Stable Diffusion XL 1.0 (連結 連結 連結)

    軟體平台


    市面上已有許多網路資料或實體書(只是幾乎全來自中國大陸,覺得本地人才消失這現象實在不妙)介紹深度學習。基礎語言最常見就是PYTHON。平台以Caffe和TensorFlow為大宗。和以往邏輯性程式不同,類似的平台比較偏向描述思考(解題)的方式,而非親自撰寫程式。

    這些套件,都具備有基本統計和高階神經網路功能,下面的學理篇章也會盡量含括Caffe和TensorFlow兩種的範例。

    1. TensorFlow 出自Google,所以親合性、資源都有優勢。長期發展,或許會像Android獨佔開發市場。但提到獨佔,就不免培養出第二選項。
    2. Caffe 出自柏克萊,學術性高。因為高通範例是Caffe,希望投入這方案。參考書1 參考書2 參考書3
    主要參考書;機器學習實作

    學習文件  文件2  文件3  文件4  影片介紹  文件5

    2018年10月1日 星期一

    筆記:TensorFlow安裝

    • 深度學習概念(連結)
    • CNN及眾多應用(連結)
    • RNN及眾多應用(連結)
    • TensorFlow安裝(連結)
    • TensorFlow語法與使用(連結)
    • Porting AI ( QCS605 QCS603 & Android )(連結)

    深度學習是少數不需要許多高階伺服器就可入門的學門(當然啦,精熟之後,還是有許多機會要利用多台機器平行進行計算,那是另外的範疇多機器訓練 )。就利用手邊PC主機,參考兩篇文件,嘗試安裝TensorFlow。 參考文件1  參考文件2

    1. MB:ASUS H170PRO/USB3.1/1151全固態
    2. CPU;INTEL I7-6700K 六代  + 酷媽120V水冷
    3. RAM:美光16G*2/DDR4/2400
    4. SSD:INTEL 600P/512G(M.2),位置是SATA3,原本是windows開機碟
    5. HD:Seagate 1TB/64M,位置是SATA4
    6. GPU:MSI GTX1070 ARMOR 8GD5
    7. POWER:振華 550W/80銅牌
    8. CASE:松聖Mavoly

    OS Windows和IOS都可以安裝深度學習套件,但主流仍是採用Ubuntu

     

     

     ----最早版本16

    1. 選擇為 Ubuntu 桌面版本 16.04 LTS(支援至 2021 年 04 月) 64 位元版本,下載點
    2. ISO約1.5G,下載 Rufus 3.3 將ISO寫入USB,都維持預設,選擇剛下載的ISO,燒錄約三分鐘
    3. USB插入機殼後
    4. ASUS的BIOS UEFI,DEL進入MENU,滑鼠已可直接操作,選擇 2G的MASS STORAGE為開機硬碟,重開,進入安裝程序
    5. 起初想保留SATA3的WINDOWS,數次失敗後,決定放棄直接覆蓋
    6. 程序上,選擇繁體中文,不要安裝WIFI和MP3等

    GPU、更新Nvidia driver


    1. 單CPU也可運作,但有GPU的確很方便,首選NVidia的GTX和TESLA(p100),參考文章,GPU比CPU快80倍
    2. 1080ti 優於 1080 優於 1070ti 優於1070 ...依此類推
    3. $ sudo add-apt-repository -y ppa:graphics-drivers/ppa
    4. $ sudo apt-get update
    5. $ sudo apt-get install -y nvidia-367 (這是先前測試版本,不管啦,照著做,後來幾次發現,還是直接跳過好了)
    6. $ sudo apt-get install -y nvidia-384 (這是比較新的版本)
    7. reboot重新開機
    8. nvidia-smi 檢查安裝狀態 成功

    安裝cuda


    1. $ wget "https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run"
    2. $ sudo chmod u+x cuda_8.0.61_375.26_linux-run
    3. $ sudo apt-get install libglu1-mesa libxi-dev libxmu-dev libglu1-mesa-dev 
      (先前過程中 顯示四個.so沒有裝完 加入指令後就正常)
    4. $ sudo sh ./cuda_8.0.61_375.26_linux-run

    參考下面輸入選項

    Do you accept the previously read EULA? accept/decline/quit: accept
    Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 361.77? (y)es/(n)o/(q)uit: n     非常重要 不然前面的動作全毀
    Install the CUDA 8.0 Toolkit? (y)es/(n)o/(q)uit: y
    Enter Toolkit Location [ default is /usr/local/cuda-8.0]: enter
    Do you want to install a symbolic link at /usr/local/cuda? (y)es/(n)o/(q)uit:y
    Install the CUDA 8.0 Samples? (y)es/(n)o/(q)uit:y
    Enter CUDA Samples Location [ defualt is /home/kylebai ]: enter
    似乎會有一些warming訊息 不用在意
     
    在最後添加export CUDA_HOME=/usr/local/cuda-8.0
    注意:LPATH和LIBRARY_PATH是顯示卡安裝路徑,剛剛輸入是384 安裝不同版本 可能要更改數字。
    sudo vim ~/.bashrc

    export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
    export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64/${LD_LIBRARY_PATH:+: ${LD_LIBRARY_PATH}}
    export LPATH=/usr/lib/nvidia-384:$LPATH
    export LIBRARY_PATH=/usr/lib/nvidia-384:$LIBRARY_PATH

    儲存離開
    source ~/.bashrc
    nvcc -V
    可以看到CUDA的版本信息,如下所示
    nvcc: NVIDIA (R) Cuda compiler driver
    Built on Tue_Jan_10_13:22:03_CST_2017
    Cuda compilation tools, release 8.0, V8.0.61


    測試CUDA
    編譯sample
    /home/kayjean/NVIDIA_CUDA-8.0_Samples  (安裝目錄)
    make  (要先確定gcc是4.8)
    make結果報錯
    /usr/bin/ld: cannot find -lglut
    collect2: error: ld returned 1 exit status
    然后用关键词lglut搜索 sudo apt-get install freeglut3 freeglut3-dev

    make clean
    make


    執行CUDA sample
    /home/kayjean/NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody
    執行 ./nbody
    會跳出terminal 動態顯示如煙火圖片,成功


    CUDNN


    專門為neural network設計架構
    這裡 下載(經過一連串註冊過程  123Nvidia密 選擇 "Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0" "cuDNN v6.0 Library for Linux" 下載後位置是  /home/kayjean/下載是.tgz檔案 文件名稱是cudnn-8.0-linux-x64-v6.0.tgz)

    tar -xvf cudnn-8.0-linux-x64-v6.0.tgz
    sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
    sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
    sudo chmod a+r /usr/local/cuda/include/cudnn.h
    sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

    如果有裝5.X版本 要做這些動作 目前不需要cd /usr/local/cuda/lib64/
    sudo rm -rf libcudnn.so libcudnn.so.5 #删除原有动态文件
    # 以下的两步设置软连接时,
    一定要注意自己电脑的/usr/local/cuda/lib64/下的libcudnn.so.5.1.5名字,
    有的可能是libcudnn.so.5.0.5等,要依据自己的电脑上的文件来定
    sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成软链接
    sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接
    sudo ln -s libcudnn.so.5.1.10 libcudnn.so.5 #生成软链接
    sudo ln -s libcudnn.so.5 libcudnn.so #生成软链接

    anaconda 2

    Conda是套件管理系統,可用來建立虛擬環境 如果慣用pip的人對於conda的指令一定也可以馬上上手,因為它和pip指令非常非常的相似  使用說明
    使用說明2

    conda是anaconda內的功能 這個模組除了conda更重要的是能夠安裝許多數學套件

    在https://repo.continuum.io/archive/ 下載Anaconda2-4.4.0-Linux-x86_64.sh
    sudo bash Anaconda2-4.4.0-Linux-x86_64.sh
    讀完license  輸入yes
    後面兩個安裝位置都選擇預設值
    安裝程式會幫忙將path寫入bashrc 選擇 yes
    source ~/.bashrc

    目前python -v 是2.7
    conda create -n tensorflow pip python=2.7
    一堆訊息
    選擇y
    完成
    conda env list
    會看到tensorflow
    source activate tensorflow  準備啟用
    若成功 prompt就會改變

    安裝TensorFlow1.4


    tensorflow安裝區分成source code和binary

    source code安裝 當成參考
      $ git clone --recurse-submodules https://github.com/tensorflow/tensorflow
      安裝BAZEL

    目前使用的是binary安裝,在前面已經建立好的tensorflow環境中
    pip install https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.4.0-cp27-none-linux_x86_64.whl
    會陸續出現下載的bar (大概十個)安裝完畢,確認tensorflow能夠使用的方法
    打入python
    直接貼上內容
    import tensorflow as tf
    hello = tf.constant('Hello, TensorFlow!')
    sess = tf.Session()
    print(sess.run(hello))
    如果看到 Hello, TensorFLow! 就代表tensorflow安装好了

    exit() 離開python
    利用這個指令可以看到tensorflow的安裝位置
    python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))'
    source deactivate 就會退出這個虛擬環境

     

    ----較新版本18

    由同事取得18版本後,選擇清除就資料重新安裝(機器選擇短名子)。

    1. wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
    2. sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
    3. sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
    4. wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
    5. sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
    6. sudo apt updatesudo add-apt-repository ppa:graphics-drivers
    7. sudo apt-get update
    8. ubuntu-drivers devices 要能看到450
    9. sudo apt-get install nvidia-driver-450 nvidia-settings
    10. sudo reboot
    11. nvidia-smi

    繼續安裝加速功能CUDA和cudnn

    1. sudo apt install --no-install-recommends cuda-10-1
    2. cd /usr/local/cuda/samples/5_Simulations/nbody 用root身份make 並且執行./nbody就會看到執行的結果 確認有裝成功
    3. sudo apt install --no-install-recommends libcudnn7=7.6.5.32-1+cuda10.1
    4. sudo apt install --no-install-recommends libcudnn7-dev=7.6.5.32-1+cuda10
    5. 這是後來好像要安裝 ncvv另外安裝的sudo apt install nvidia-cuda-toolkit,不確定是否要裝
    6. nvcc -V

    anaconda 

    因為需要UI,所以不考慮docker,就繼續沿用anaconda,下載最新版本後Anaconda3-2020.07-Linux-x86_64.sh後,python預設為3.8(2的機會越來越少了)。套件管理系統是Conda,類似pip,可用來建立虛擬環境。

    1. bash Anaconda3-2020.07-Linux-x86_64.sh 最後選擇yes
    2. source ~/.bashrc
    3. conda info  前面的指標都變成base了
    4. conda create -n tensorflow_gpu pip python=3.7 opencv  (3.8好像有問題)  設定頗久
    5. 可以透過指令看已有的虛擬環境 conda env list
    6. 若要刪除某虛擬環境的話   conda env remove -n (虛擬環境名稱)
    7. 開始虛擬環境 conda activate tensorflow_gpu
    8. 離開虛擬環境 conda deactivate

    conda and tensorflow

    1. conda install -c anaconda tensorflow-gpu  這會去下載最新版本 似乎是2.1版本
    2. 測試安裝狀況 python / import tensorflow as tf / tf.__version__
    3. nvcc -V
    4. import tensorflow as tf
      a = tf.test.is_built_with_cuda() //check cuda
      b = tf.test.is_gpu_available(
          cuda_only=False,
          min_cuda_compute_capability=None
      ) //check GPU
      print(a)
      print(b)

      True
      True
      It works