2018年1月20日 星期六

Tensorflow (Start to "flow")

我們先前(看此篇)已經對TensorFlow做了初步的了解,但距離真正使用此資料庫進行機械學習的任務還有段距離,我們今天就繼續讀一讀TensorFlow的手冊吧。

先回顧一下,以下是定義兩個浮點node (node_1, node_2)並完成一個Session的完整程式:

但是到這邊僅是定義"張量"而已,根本還沒開始"流動",所以接下來我們看看怎把兩個數字加起來(流動!!)。首先先建立一個新的node_3,定義為藉由tf.add()相加後的結果:
如同我們先前看過的,若沒執行sess.run(),程式不會執行運算。執行sess.run(node_3)就可以把兩個node加起來了。

當然在多數的情況,我們不會僅使用常數(constant)執行運算,所以可以先建立placeholder,之後再接受輸入值。如建立下列的a及b,再定義adder_noder為兩個node的和,執行時利用一個dictionary{}輸入,如下方的例子:
如上述的第二個例子,a及b不一定只能用純量,向量也是可以的,將[1,2]及[3,4]兩個向量加起來得到[4,6]的結果。

可以再把結果乘兩倍:


在機械學習中,我們通常先提出一個可供輸入參數的模型(model),之後就可以"訓練"了,因此我們必須引入變數(Variable)於模型之中,如下方例子的變數W及b:
這邊我們先輸入起始值(分別為W=0.3; b=-0.3),model為W*x+b。不過tf.constant呼叫的時候就開始動作了,值也不會變動。但tf.Variable則不一樣,因此必須多一個呼叫啟動變數的指令tf.global_variables_initilizer(),另外,placeholder則輸入四個數字[1,2,3,4],最後就可以得到model運算後的結果[0, 0.3, 0.6, 0.9]。

也可以這樣寫:
with as 的語法好處是資源管理比較不會出錯。

好啦~現在有個model囉,但還是要知道這個model的好壞,所以再加入一個y的placeholder,另外引入一個評估model好壞的損失(loss)函數(這邊應該是指均方誤差,但略去1/2):
結果是23.66。

接著"手動"地變更W與b的值(W=-1; b=1),再算一次。
得到0 的結果,以損失函數來說是比較好的model。
接下來就是要以"機械"的方式取代"手動"的工作將W與b的值最佳化。


參考資料
Getting Started with TensorFlow



2018年1月18日 星期四

Tensorflow "Hello World!"

之前(上一篇)已完成TensorFlow的基本架構,我想就拿來試試寫寫看一般程式開始都會寫的"Hello World!"之類的程式,先試著輸入以下的程式:
出來的結果有點怪,除了有紅字外,輸出還多了個"b"?!!
上網爬了很久多文,算是找到一個解決的辦法:

所以看來是Python3解讀的問題,其他有些利用nightly build的建議方法則一直無法成功,總是受到在Anaconda環境中的限制,果然tensorflow的installtion在window中真的是問題不少。

參考資料
https://stackoverflow.com/questions/46439451/why-the-result-prints-bhello-python-when-i-use-tensorflow

Note for TensorFlow (Getting Started)

TensorFlow是Google發展的開放原始碼機器學習函式庫,能以流程圖的概念呈現資料的流動,是現在很熱門的機器學習開發工具。上網看了些文章後,今天開始來試試這個函式庫。

本篇主要根據官網tensorflow.org演練,而官網建議要看得懂基本的手冊(guide),需要:
1. 知道Python語言
2. 至少要知道一點array
3. 理想中要知道一點機器學習,但是如果你知道很少或是根本不懂,本手冊仍是第一個你應該讀的文件。(這點好像講了跟沒講一樣)

TensorFlow提供了不同的應用程式介面(Application Programming Interface, API)。最底層TensorFlow Core提供完全的程式控制,較高層的API典型上比較好學,例如tf.estimator可以管理資料、估計量(estimator)、訓練及介面。

我的工作環境是Anaconda的Jupyter NoteBook,當然要另外安裝tensorflow,安裝方法網路上資料應該不難找,就不多說囉。我的版本是1.4.0。

先來理解何謂Tensor(張量),在"張量流動"資料庫中,顧名思義"張量"是最基本的資料型態,它可以為零維的純量,一維的向量,二維的矩陣等等。例如下面是numpy建構的一維tensor:
 順便看一下幾個常用的屬性:
.ndim   (維度)
.shape  (array的形狀)
.dtype  (資料的型態)

張量流動資料庫的程序可以分成兩大部分,一為建立(Building)計算圖(computational graph),二為執行(Running)計算圖。首先是建立計算圖,計算圖中有許多節點(node),每個節點可以輸入零至多個tensor,輸出一個tensor,例如最簡單的j為constant,不接受輸入,自然輸出它所儲存的值,如下列兩個浮點node (node_1, node_2):
tf,constant()建立node,其中dtype定為32bit,可看到跟上述的64bit不同,這是因為通常資料很多,為省記憶體就先設為32 bit,當然如果空間很夠,64 bit當然也可。若都不設定,則仍預設為32 bit。定義完就print看看。結果出來的是:Tensor("const_2:0",.......),我咧怎麼回事?跟想像中不一樣。這是因為上述第二步驟(執行(Running)計算圖)還沒完成!
所以我們輸入以下指令:
目標終於達成!!
所謂的Session,是"張量流動"打包整個完全的資料與控制流程,所以必須run session才可得到最後的結果。

Tensorflow手冊上建議的寫法則是:

到這邊終於算是完成最簡單的Tesorflow程式了。

參考資料
Getting Started with TensorFlow

2018年1月16日 星期二

Keras (Tensorflow)的安裝問題:Win10

win10在Anaconda的tensorflow虛擬環境下安裝keras出現了下列問題:

parse() got an unexpected keyword argument 'transport_encoding'


爬了網路一些文之後看到一些不同的解法
看來基本上還是版本的問題

我的方式是在cmd執行以下指令:

> conda install --force html5lib



之後再重裝一次


> pip install keras


打開jupyter notebook測試看看



成功解決問題!!!



參考資料
https://stackoverflow.com/questions/46499808/pip-throws-typeerror-parse-got-an-unexpected-keyword-argument-transport-enco
http://it.kklife.cc/?p=232

2018年1月14日 星期日

Python: enumerate and zip

在資料當中如果我們想要給資料編號(index),可以使用enumerate()的函數,如下方的例子中我們有一個account的list,利用enumerate()的方法產生money的iterator,當然如果要看內容,還是必須使用list()

上述例子可以有更簡單的寫法:

不過依慣例index會從0開始,如果要從1開始,再給一個second argument "start=1":


另外一個很有趣的內建函數是zip(),可以將list中對應的元素一一打包成為新的tuple,之後將這些tuple形成一個新的list。

有何用處呢? 舉例來說,下方的例子可以成對地比較兩個list中對應元素的大小,結果會印出較大的值,若是相同則會進一步說明兩個值一樣。


當然不只兩個list,三個list中的元素比較也可以。

參考資料
datacamp
https://campus.datacamp.com/courses/python-data-science-toolbox-part-2

2018年1月13日 星期六

Python: iteration

Iteration就是反覆做一件事的過程,在Python中,iterable是可以取得iterator的物件,iterator一般就是指"反覆"的方法method。
例如我們可以先產生一個名稱為account的list(iterable),利用for的方式產生迴圈,達到iteration的效果。

不過上述方式無法只取得部分資料, 於是我們利用iter()的方法產生一個名稱為money的iterator,接 著就可以利用next()的方法一個一個取得資料。另外也能使用range()的方式快速建立一個list,並使用iter()就能產生名稱為one_four的iterator。


當然在上述的例子中,若要看到one_four的全貌,就只能多使用幾次next()了。

range()可以不需從0開始,例如range(4,9)可以得到從4開始到8的數字。另外list()的方法可以看到全部的內容,而sum()可以將list裡面所有數字都相加起來。


參考資料
datacamp
https://campus.datacamp.com/courses/python-data-science-toolbox-part-2

2018年1月12日 星期五

Python: *args and **kwargs

Python的函式允許輸入不同個數的arguments,在輸入變數前加*,可於函式多個argument。例如我們建立一個 test_funct的函式,輸入多個argument,python會以tuple的形式儲存。
另外若在輸入變數前加**,則會以dictionary的方式儲存,稱為keyword arguments。


上個例子裡並沒有輸入keyword arguments,所以只給了個空dictionary,下方例子則有keyword arguments。

要注意當argument與keyword arguments同時出現,順序很重要,若先輸入keyword arguments,就會有錯誤的訊息。

*args**kwargs的用法是慣例,雖然鼓勵這樣用,不過python也是可以使用任意名稱。

2018年1月7日 星期日

Pandas (學習筆記III)

如何匯出或匯入資料?

假設我們在user的子目錄裡已有一個example.csv

.read_csv()           #打開csv檔
如以下的例子先建立路徑 filepath,再利用.read_csv指令打開example1檔案,並指定為store物件。

我們先前已指定檔案為store物件,可以試試看是否為正確的檔案。以下以.iloc[ ] method取出store的片段資料。(可參考之前的文章Pandas(學習筆記I))

從上面的結果發現有所錯誤,第一行(row)的資料被當成表格的標題了。因此我們在.read_csv的argument中再加入 header = None (注意None第一個字母要大寫),表示資料中不包含表格的標題。
雖然這樣看來是對了,但好像還缺了甚麼,最好還是把表格的標題寫出來,這邊.read_csv的argument中加入 names = column (必須先定義column的內容)。這樣表格資料就完整多了。

最後可以利用.to_excel的method把store輸出為Excel的xlsx的檔案,但記得先指定路徑檔名為store.xlsx: store.xlsx = 'store.xlsx' 。執行後看不到任何回應,但回到剛才的目錄下可以發現多了一個store.xlsx的檔案,可以打開來看看是否正確。這樣就完成資料的修正啦!

假設檔案不是.csv而我們要直接讀Excel的檔案,則使用pd.read_excel()指令:



參考資料

datacamp



Pandas (學習筆記I)

Why Pandas?

Pandas是python中常用的套件之一,如同 numpy 能延伸 python 的 list,pandas 能延伸 python 的 dictionary 。

A little bit Review

  • python中的list是以[]將元素包起來。
  • tuple中的元素則不能變更,以tuple()的方式建立物件,或將list轉換成tuple。
  • set則是無序的集合,可以set()將list轉成set,要注意的是set中元素不重覆。
  • dictionary則是帶有鍵值(key)的list,以{}建立dictionary物件,或利用dict()函數轉換list成為dictionary。

pandas DataFrames

Method 1:
.iloc[,]            #可協助我們擷取資料的一部分

例如我們有下列的資料,已預設於df

.iloc[:3,:]      #擷取資料的前三row


.iloc[-3:,:]       #擷取資料的後三row

補充: iloc vs loc
上述index的數字跟一般python的"位移"概念是類似的。但是.loc (少個i)是明確的索引:

.iloc 背雖然好用,但背後的索引概念卻限制了遮罩(mask)的使用。如下列例子是mask的應用,必須使用明確index的.loc:



Method 2:
.head()           #可協助我們擷取起始資料的部分

.head(3)         #擷取資料的前三row

Method 3:

.tail()               #可協助我們擷取資料尾端的部分

.tail()               # 若不給argument,預設是顯示後five rows

.tail(3)    # 擷取資料尾端的部分
Attribute 1:
.info       # 顯示資料相關資訊,包含index種類、column的標籤等等
                            (因為本例較簡單,所以幾乎是整個表了)

Attribute 2:
.values           # 以numpy array的方式顯示表格資料

其他:

NaN  (Not-a-Number)可以用來表示資料中不見的data

參考資料

R 語言使用者的 Python 學習筆記系列

Pandas: Broadcasting (學習筆記II)

Broadcasting


"broadcasting" 是Python numpy中的特色之一,可用於Pandas之中快速產生DataFrame。

以下的例子來說:
我們想知道店裡有多少店員(Employee)及多少客人(customer),我們可以如下述第一個程式先建立三個list(Work_Day, num_cust, Empolyee),之後利用pd.DataFrame的method產生表格(注意Pandas神奇之處在於表格最左邊已預設每一row的編號了)。

不過我們建立表格時,發現店員人數並沒變化,因此根本不需要建立list,在建立dictionary時,直接輸入數字,就可以完成表格製作了(如第二個程式紅色框圈起來之處)。這就是所謂broadcasting的功能,可以幫助我們快速地建立資料。



 當然這個例子只有五個數據,程式差異並不大,但當數據很多時,會相當有用。



參考資料
datacamp
https://www.datacamp.com/courses/pandas-foundations


2017年12月30日 星期六

慢跑 and 慢跑App

隨著年紀步入中年
身體變化越來越明顯
年輕時體重是輕到不行
還被我父母懷疑我在吸毒
現在則是超重囉!!!
體力也越來越差
真的是要找時間"持續"運動

以前斷斷續續有在慢跑
所以從八月開始我第一個運動的選擇還是慢跑囉

以前覺得運動慢跑要持續最大的問題在於"太無聊"
還好現在進入行動裝置的時代了
可以邊聽音樂邊慢跑
真是享受

另外我自己還使用了一個慢跑App: Nike+RunClub
可以記錄跑步時間、距離
依自己狀況設定目標
還有語音教練等

看著自己每次都有進步
就會有更大的動力下次繼續挑戰
個人覺得是個不錯的運動輔助


改變Jupyter Notebook的預設瀏覽器

Jupyter Notebook是Python語言常用的IDE(Integrated Development Enviroment)
開發與編輯非常方便
不過Jupyter Notebook介面是經由預設的瀏覽器(如:Edge)
如果想使用不一樣的瀏覽器
除了可以經由改變電腦預設的瀏覽器之外
還可以利用下方的方式改變Jupyter Notebook預設的瀏覽器
這邊舉Chrome為例:

打開Anaconda Prompt
輸入以下指令

>jupyter notebook --generate-config

應該會看到以下回應:

Writing default config to C:..................(後面省略)

這個動作會在.jupyter目錄下開啟一個檔案:

jupyter_notebook_config.py

找到這個檔案後使用任一編輯器打開此檔  (看個人習慣,我自己使用的是免費的Notepad++)

此檔案中會看到一堆#開始的程式碼
找到下面一行程式碼

#c.NotebookApp.browser = ''

接著在下方輸入下列的三行程式碼 (注意不需要"#"在前面)

import webbrowser
webbrowser.register('chrome', None, webbrowser.GenericBrowser(u'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'))
c.NotebookApp.browser = 'Chrome'


(注意第二行程式中的路徑跟你當初安裝Chrome的目錄路徑有關)
存檔後,照著一般的方式開啟jupyter notebook
就會從預設的瀏覽器改為從Chrome開啟囉!!!

2017年12月29日 星期五

Jupyter Notebook 與 Spyder

在常見的Python的IDE(Integrated Development Enviroment)
Spyder算是我第一個使用的python編譯器
優點是介面簡潔、乾淨、清楚
還可以看看變數的改變

不過上網爬了許多文章,不少人都推薦Jupyter NoteBook
而且因為我是經由Anaconda安裝Python
兩種編輯介面都一起安裝了
所以某天好奇心驅使下也去試試

使用後發現
Jupyter Notebook最大的優點就是程式碼可以分區執行
對程式的理解很有幫助
確實是很適合初學者(像我自己)使用的IDE
用過就回不去囉!!