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