最近寫了一個機械學習(machine learning)的program,想試試把它部署上網,所以開始學習利用Flask為架構建立自己的網站。Flask確實是個不錯的框架,非常簡單,幾行程式馬上就搞定了,真的很適合初學者或僅僅需要簡單架構網頁的選擇。
不過畢竟是網頁,還是希望不要太單調,而想要有美美的網頁,當然少不了Bootstrap,Bootstrap是個 HTML、CSS 和 JS 的開源工具包,有了Bootstrap的幫忙,可以更簡單地就寫好美美的網頁了。而一般使用Bootstrap最方便的方式就是使用CDN,只要在HTML多一行link就搞定,不過在Heroku上試了幾次好像不大成功。如果是使用Flask,官網上介紹是載入這個包:
https://pythonhosted.org/Flask-Bootstrap/
好像也是很麻煩,google之後發現一個很暴力絕對有用的方式,來源在這:
https://pythonprogramming.net/bootstrap-jinja-templates-flask/?completed=/basic-flask-website-tutorial/
還附有影片教學。其實原理很簡單,因為Bootstrap基本上是CSS與JS庫,就地安裝後直接copy CSS或JS的檔案直接部署到想要的地方,html內的<link>當然就是直接link到相對應的檔案夾就好,實在是夠暴力的,但簡單不少,檔案其實也不會很大,
2019年3月10日 星期日
2019年3月9日 星期六
Berry Conda
不過是深度學或是機器學習,不少人建立了model之後,選擇佈署(deploy)在raspberry pi上,不過現在就算是最新的raspberry pi 3 B+,多數符合能執行的套件仍是32bit,其ARM硬體架構也常常跟訓練模型時的不一樣,這導致佈署十困難重重。
例如大家很喜歡的conda,可以把本來很難裝的套件一個指令就裝好了,但在raspberry pi上Anaconda是不支持的,網路上不少人推薦miniconda,當然也是很好的選擇,不過python3的版本是3.4,甚至比官方的python3.5還低,總是有點不舒服的感覺。
現在除了miniconda之外,有個更棒的選擇了: berryconda!!!!
Github連結在此: https://github.com/jjhelmus/berryconda
以raspberry pi 3 B為例來看看怎麼裝:
先下載檔案:
最後輸入以下指令,使conda馬上生效。
還真不錯,之後就可以在raspberry pi中使用conda囉~~~
參考網站:
https://www.jianshu.com/p/ccad38dbb897
例如大家很喜歡的conda,可以把本來很難裝的套件一個指令就裝好了,但在raspberry pi上Anaconda是不支持的,網路上不少人推薦miniconda,當然也是很好的選擇,不過python3的版本是3.4,甚至比官方的python3.5還低,總是有點不舒服的感覺。
現在除了miniconda之外,有個更棒的選擇了: berryconda!!!!
Github連結在此: https://github.com/jjhelmus/berryconda
以raspberry pi 3 B為例來看看怎麼裝:
先下載檔案:
$ wget https://github.com/jjhelmus/berryconda/releases/download/v2.0.0/Berryconda3-2.0.0-Linux-armv7l.sh之後安裝:
$ bash Berryconda3-2.0.0-Linux-armv7l.sh最後加入路徑:
$ export PATH="/home/xxxxxx/berryconda3/bin:$PATH"注意上面xxxxxx只是舉例,看看您是裝到哪個路徑要記得改。
最後輸入以下指令,使conda馬上生效。
$ source ~/.bashrc應該完成了,可以試試conda的版本:
$ conda --version conda 4.3.22含有最重要的python版本
$ python --version Python 3.6.1是3.6.1喔.....
還真不錯,之後就可以在raspberry pi中使用conda囉~~~
參考網站:
https://www.jianshu.com/p/ccad38dbb897
python 2 or 3?
現在是2019年了
各位沒有看錯文章標題.........
或許答案顯而易見
我想多數人一定是回答python3,特別是對新手而言
不過真的有時還是會有無奈的選擇時候
像我最近寫了個machine learning的code,但依賴的包實在不好裝
偏偏這個函式庫非常重要,無替代方案
搞了快一個星期只好放棄
所以只好回去使用python2
沒辦法,自己功力不夠從最基本的開始寫
所以有時看別人使用python2不要覺得是old school,實在還是有不得已的時候啊
各位沒有看錯文章標題.........
或許答案顯而易見
我想多數人一定是回答python3,特別是對新手而言
不過真的有時還是會有無奈的選擇時候
像我最近寫了個machine learning的code,但依賴的包實在不好裝
偏偏這個函式庫非常重要,無替代方案
搞了快一個星期只好放棄
所以只好回去使用python2
沒辦法,自己功力不夠從最基本的開始寫
所以有時看別人使用python2不要覺得是old school,實在還是有不得已的時候啊
2018年10月20日 星期六
Pytorch Install
裝Pythorch很簡單不囉嗦!!!
到Pytorch官網
https://pytorch.org/
到官網上很清楚可以按照你的系統選擇如何install
例如我的系統是windows,Package習慣使用Conda,Language為 Python 3.6,不使用Cuda
官網就會給建議的Command (Run this Command):
conda install pytorch-cpu -c pytorch
pip install torchvision
檔案不大
一下就裝完了
2018年8月26日 星期日
Python 排序 (sort)
Python裡的排序有很多方法,在這邊歸納整一下。最基本的就是內建的sort()跟sorted()了。要注意的是兩者不大一樣喔。sort()是當場就直接了斷排序了,會改變本來的資料,sorted()是回傳排序後的資料,不影響舊資料:
numpy裡面也有sort函式,好處是速度快,另外跟sorted()一樣,不會改變原來資料:
如果資料是陣列的話,另一個優點是可指定陣列排列的方向:
numpy裡面也有sort函式,好處是速度快,另外跟sorted()一樣,不會改變原來資料:
如果資料是陣列的話,另一個優點是可指定陣列排列的方向:
2018年8月25日 星期六
Ipython特色與magic command
Ipython是Interactive Python (http://ipython.org )的簡寫,是一個超強的python開發環境,也是交談式控制台,其中大家很喜歡的Jupyter Notebook 或是新版Jupyter Lab粗略來說就是Ipython的網頁版,其中Ipython有不少好用的magic command可以幫助程式的開發,這篇就是簡單的筆記一下Ipython的特色與Ipython裡常用的magic command(魔術命令)。
? (help)
就是不懂或忘記程式怎使用的求救命令,會顯示指令的docstring。
使用時只要在指令後面加上"?"就可:
自己的function也可以:
是不是超神奇!!
另外外速鍵(Shift + Tab)也是可以的
?? (原始碼)
不多說,就是給你看看原始碼,不過你可能會發現,很多結果跟"?"是一樣的,因為不是Ipython裡寫的。
magic command主要都是肥宅喜歡的符號"%"開頭的。
%time
測量單一行指令的時間
%timeit
重複測量指令的時間 (執行幾次取平均,所以準確率高)
多行的程式可以嗎?
當然可以,就兩個%符號就行"%%" (肥宅們不要太興奮了!!)
Shell命令:
在Ipython中也可以直接執行shell的指令喔,不用視窗一直換來換去的了。
用棒子就可啦: "!"
真是cool!!
? (help)
就是不懂或忘記程式怎使用的求救命令,會顯示指令的docstring。
使用時只要在指令後面加上"?"就可:
自己的function也可以:
是不是超神奇!!
另外外速鍵(Shift + Tab)也是可以的
?? (原始碼)
不多說,就是給你看看原始碼,不過你可能會發現,很多結果跟"?"是一樣的,因為不是Ipython裡寫的。
magic command主要都是肥宅喜歡的符號"%"開頭的。
%time
測量單一行指令的時間
%timeit
重複測量指令的時間 (執行幾次取平均,所以準確率高)
多行的程式可以嗎?
當然可以,就兩個%符號就行"%%" (肥宅們不要太興奮了!!)
Shell命令:
在Ipython中也可以直接執行shell的指令喔,不用視窗一直換來換去的了。
用棒子就可啦: "!"
真是cool!!
2018年8月12日 星期日
VirtualBox與網路設定
最近在玩VirtualBox(版本 5.2.16 r123759 (Qt5.6.2)),希望能架設虛擬的電腦,其中特別是網路的設定讓我很困惑,爬了很多文,搞了很久才解決,不確定是否是很好的解決辦法,不過還是筆記一下。
我是裝Win 10的虛擬機,第一個問題就是Password,預設的passoword是"Passw0rd!",注意!就是o改成0啦,真是奇葩!!
接下來是希望能裝兩台虛擬機在同一個網路上,原本大致上都能work,但怪的是兩台虛擬機有同樣的ip,這就有點棘手,因為很多連線動作不能做。最後發現不能單單選定NAT,讓VirtualBox自動幫我們設定,所以我們必須先從VirtualBox(VB)管理員的"檔案"中選取"喜好設定",之後選擇"網路",如下面的畫面,點選右上角小小綠色的方塊,按一下就會有新的NAT網路出現:
之後,回到各個虛擬機本身的網路設定,記得不要單選NAT,要選擇NAT網路,下方就會自動顯現出我們剛剛設定的選項名稱,之後就完成網路設定啦,兩台虛擬機的ip就會不同。
我是裝Win 10的虛擬機,第一個問題就是Password,預設的passoword是"Passw0rd!",注意!就是o改成0啦,真是奇葩!!
接下來是希望能裝兩台虛擬機在同一個網路上,原本大致上都能work,但怪的是兩台虛擬機有同樣的ip,這就有點棘手,因為很多連線動作不能做。最後發現不能單單選定NAT,讓VirtualBox自動幫我們設定,所以我們必須先從VirtualBox(VB)管理員的"檔案"中選取"喜好設定",之後選擇"網路",如下面的畫面,點選右上角小小綠色的方塊,按一下就會有新的NAT網路出現:
之後,回到各個虛擬機本身的網路設定,記得不要單選NAT,要選擇NAT網路,下方就會自動顯現出我們剛剛設定的選項名稱,之後就完成網路設定啦,兩台虛擬機的ip就會不同。
2018年6月18日 星期一
Machine Learning: Polynomial Regression 多項式迴歸
線性迴歸(Linear Regression)是機器學習(Machine Learning)中常用且基本的model之一,但Sckit-Learn中線性迴歸不僅僅只是能處理線性資料,也能以簡單的方式以多項式迴歸(Polynomial Regression)對資料做擬合(fitting)。換句話說,也就是不儘是線性函數:
y = ax + b
也能以多項式擬合(fitting):
y = ax + bx^2 + cx^3+ ........
怎麼做呢? 基本上就是山不轉路轉,動不了特徵值,換個x值總可以吧。
來看看實際例子:
先import會用到的module:
其中PolynomialFeatures就是轉換座標的關鍵函式(Polynomial basis functions)。
舉例來說,若我本來輸入的x值是2,4,6,此函式就會幫我們轉成2次、3次等等。
只要利用.fit_transform就可以輕鬆達成!!!
看一下實際例子吧,假如我們有下列的資料:
這一看就明顯不是"線性",反而像正弦之類的函數,我們這邊嚐試利用多項式來解,
利用剛才的工具:
我們調用了sklearn.linear_model的LinearRegression,並用較高階的語法make_pipeline直接把x值轉換與模型建立一次完成了。注意在PolynomialFeatures中,我們使用到六次項(6)。
接著擬合剛建立的模型(poly_model)poly_model.fit(),其中xfit是我們自己建立的x值:
得到yfit後,再畫出本來的資料與得到的model,看來結果還不錯囉!!!
參考資料:https://jakevdp.github.io/PythonDataScienceHandbook/
y = ax + b
也能以多項式擬合(fitting):
y = ax + bx^2 + cx^3+ ........
怎麼做呢? 基本上就是山不轉路轉,動不了特徵值,換個x值總可以吧。
來看看實際例子:
先import會用到的module:
其中PolynomialFeatures就是轉換座標的關鍵函式(Polynomial basis functions)。
舉例來說,若我本來輸入的x值是2,4,6,此函式就會幫我們轉成2次、3次等等。
只要利用.fit_transform就可以輕鬆達成!!!
看一下實際例子吧,假如我們有下列的資料:
這一看就明顯不是"線性",反而像正弦之類的函數,我們這邊嚐試利用多項式來解,
利用剛才的工具:
我們調用了sklearn.linear_model的LinearRegression,並用較高階的語法make_pipeline直接把x值轉換與模型建立一次完成了。注意在PolynomialFeatures中,我們使用到六次項(6)。
接著擬合剛建立的模型(poly_model)poly_model.fit(),其中xfit是我們自己建立的x值:
得到yfit後,再畫出本來的資料與得到的model,看來結果還不錯囉!!!
參考資料:https://jakevdp.github.io/PythonDataScienceHandbook/
2018年6月13日 星期三
jupyter lab module不能import的問題
Jupyter Lab是jupyter notebook的新版,但會常碰到一些module沒法成功import的問題。我就碰過幾次了,都會跑出這個結果:
沒法import pandas-datareader
參考stackoverflow
我的方法就是重裝囉:
沒法import ipywidgets
參考ipywidgets官網
install the JupyterLab Extension
這應該能解決問題囉!!
ImportError: cannot import name 'is_list_like'
這邊把解法記下來:沒法import pandas-datareader
參考stackoverflow
我的方法就是重裝囉:
> pip install git+https://github.com/pydata/pandas-datareader.git
沒法import ipywidgets
參考ipywidgets官網
install the JupyterLab Extension
> jupyter labextension install @jupyter-widgets/jupyterlab-manager
這應該能解決問題囉!!
2018年6月10日 星期日
Python:刪除重複值
最近試著寫個有關於字串的程式,其中必須要把重複值去掉,這才發現沒想像中那麼簡單。把結果紀錄如下。
當然最直觀的做法就是寫個for 迴圈,找出重複的部分再重組成一個新的list,當然這樣做是可以的,但比較麻煩,也容易出錯,最"簡單"(程式碼較少)的作法是利用python的資料結構set。
我們都知道python中的set會把重複的部分去除(這是我們要的):
這邊我們有個list(new_list),內有重複的'def',我們將new_list轉成set,再轉回list就可以把重複值去除了。
但很明顯的是,這樣做的缺點是次序會被打亂,因此解決的方式就是另用sorted函式並加個key:
達成目標了!!!
不過或許會有疑問,為什麼不使用sort函式?
這是因為sort是inline的排列,並不會回傳排序後的新list(回傳值是None):
所以如果排序只是程式中的一個步驟,沒有回傳值會很麻煩,小弟才疏學淺,接下來我實在不知怎寫下去。
當然python資料處理就不能忘了資料清洗之王Pandas,有了pandas,我們就可以利用.drop_duplicates函式處理。先import pandas,再把資料轉成pandas的series:
接下來進行去重複值的工作:
這邊要注意的是,.drop_duplicates函式會回傳一個新的series,並不會更改原來的series。
到這邊好像跟之前的方法大同小異,還要import pandas,好像也沒有更簡單,不過如果這麼想,這就太小看pandas了,.drop_duplicates函式預設的是保留(keep)第一個重複的值(keep='first'),刪除其他的重複值,但如果是你想保留最後一個呢?嘿嘿~~~這就非得用pandas了,將函式中的keep值設為'last':
如果心情不好,重複的值都去掉也可以,keep設為False就可:
當然最直觀的做法就是寫個for 迴圈,找出重複的部分再重組成一個新的list,當然這樣做是可以的,但比較麻煩,也容易出錯,最"簡單"(程式碼較少)的作法是利用python的資料結構set。
我們都知道python中的set會把重複的部分去除(這是我們要的):
這邊我們有個list(new_list),內有重複的'def',我們將new_list轉成set,再轉回list就可以把重複值去除了。
但很明顯的是,這樣做的缺點是次序會被打亂,因此解決的方式就是另用sorted函式並加個key:
達成目標了!!!
不過或許會有疑問,為什麼不使用sort函式?
這是因為sort是inline的排列,並不會回傳排序後的新list(回傳值是None):
所以如果排序只是程式中的一個步驟,沒有回傳值會很麻煩,小弟才疏學淺,接下來我實在不知怎寫下去。
當然python資料處理就不能忘了資料清洗之王Pandas,有了pandas,我們就可以利用.drop_duplicates函式處理。先import pandas,再把資料轉成pandas的series:
接下來進行去重複值的工作:
這邊要注意的是,.drop_duplicates函式會回傳一個新的series,並不會更改原來的series。
到這邊好像跟之前的方法大同小異,還要import pandas,好像也沒有更簡單,不過如果這麼想,這就太小看pandas了,.drop_duplicates函式預設的是保留(keep)第一個重複的值(keep='first'),刪除其他的重複值,但如果是你想保留最後一個呢?嘿嘿~~~這就非得用pandas了,將函式中的keep值設為'last':
如果心情不好,重複的值都去掉也可以,keep設為False就可:
2018年6月3日 星期日
Python: Numpy介紹
List是Python中常用的資料結構,因Python動態型別的特性,可以建立"異質"的list,例如:
In[1]: L1 = [2, True, 'a']
[type(item) for item in L1]
In[1]: L1 = [2, True, 'a']
[type(item) for item in L1]
Out[1]: [int, bool, str]
不過這種"動態"的特性並不是免費的,list中的每一個項目必須包含了資料的型態、大小、參考計數等等額外的資料,所以list的缺乏運算的效率(或者說根本沒法做數學運算),因此若能儲存成同一型態,雖然缺乏型態上的彈性,但卻能大幅增加運算的效率。雖然python提供了標準的array模組,但真的好用且真正多數人使用的是numpy模組。numpy會把陣列中的資料轉成相同的型態,因而提升運算效能:
常用的numpy程式指令:
陣列的串接,可分成水平跟垂直的方式:
有人喜歡用reshape也可:
陣列分割,np.split()中的second argument是分割的位置:
創建陣列,如.linspace這個在往後繪圖中會常用到:
Universal Function提供了方便的矩陣運算,可以看看下列例子:
numpy內的亂數random也是很常用的,非常非常重要。
random函數其實並不是真的"隨機"取樣,而是偽亂數,就是有亂數的樣子,但實際上是先安排好的,所以其實可以避免每一次取的亂數不同,方法就是利用.RandomState(),argument輸入相同的數字,取得的"亂數"就會相同,可以確保每一次執行都有一樣的結果:
另外也可以使用條件式取得布林陣列(True或是False),並用np.sum()或np.count_nonzero()計算符合運算條件的資料數目,這個在數據的分析上非常有用的。
注意np.sum()可以axis=0 or 1限定以行或列的方向進行運算,另外np.any()、np.all()應該看例子就可以理解用途了。
不過這種"動態"的特性並不是免費的,list中的每一個項目必須包含了資料的型態、大小、參考計數等等額外的資料,所以list的缺乏運算的效率(或者說根本沒法做數學運算),因此若能儲存成同一型態,雖然缺乏型態上的彈性,但卻能大幅增加運算的效率。雖然python提供了標準的array模組,但真的好用且真正多數人使用的是numpy模組。numpy會把陣列中的資料轉成相同的型態,因而提升運算效能:
常用的numpy程式指令:
陣列的串接,可分成水平跟垂直的方式:
陣列的改造,如陣列互換,這個在Machine Learning中常用到,非常重要。
有人喜歡用reshape也可:
陣列分割,np.split()中的second argument是分割的位置:
創建陣列,如.linspace這個在往後繪圖中會常用到:
Universal Function提供了方便的矩陣運算,可以看看下列例子:
numpy內的亂數random也是很常用的,非常非常重要。
random函數其實並不是真的"隨機"取樣,而是偽亂數,就是有亂數的樣子,但實際上是先安排好的,所以其實可以避免每一次取的亂數不同,方法就是利用.RandomState(),argument輸入相同的數字,取得的"亂數"就會相同,可以確保每一次執行都有一樣的結果:
另外也可以使用條件式取得布林陣列(True或是False),並用np.sum()或np.count_nonzero()計算符合運算條件的資料數目,這個在數據的分析上非常有用的。
注意np.sum()可以axis=0 or 1限定以行或列的方向進行運算,另外np.any()、np.all()應該看例子就可以理解用途了。
2018年5月20日 星期日
Jupyter Lab
jupyter notebook利用直譯語言的特性可以即時輸出程式的結果,是很多人愛用的程式語言工具。而現在有更新版本出現囉!!!
jupyter lab是jupyter的新版,特別是針對檔案切換的不便作出改善。如下圖示jupyter lab的操作畫面,可以看到左邊多了檔案目錄的視窗,因此要找或轉換檔案比起jupyter notebook方便得多了。多了這些特性與功能,儼然演化成完整的的IDE了。
安裝jupyter lab很簡單:
>>>conda install -c conda-forge jupyterlab
不過有些套件module可能要重裝(pip or conda)。
執行時只要鍵入:
>>>jupyter lab
將出現下面畫面:
選擇Notebook,就大功告成囉!!!
現在jupyter lab版本仍然還是beta版,應該很快最會推出穩定的1.0版。
參考資料:
https://jupyterlab.readthedocs.io/en/latest/
jupyter lab是jupyter的新版,特別是針對檔案切換的不便作出改善。如下圖示jupyter lab的操作畫面,可以看到左邊多了檔案目錄的視窗,因此要找或轉換檔案比起jupyter notebook方便得多了。多了這些特性與功能,儼然演化成完整的的IDE了。
安裝jupyter lab很簡單:
>>>conda install -c conda-forge jupyterlab
不過有些套件module可能要重裝(pip or conda)。
執行時只要鍵入:
>>>jupyter lab
將出現下面畫面:
選擇Notebook,就大功告成囉!!!
現在jupyter lab版本仍然還是beta版,應該很快最會推出穩定的1.0版。
參考資料:
https://jupyterlab.readthedocs.io/en/latest/
2018年3月25日 星期日
Python: list comprehensive (Dictionary Comprehensive)
Python的list comprehensive是python語言中最強大的特色之一,可以讓你使用很簡單的句子就完成list的創建,python list comprehensive的通式如下:
[ __ for __ in ____ ]
舉例來說:
>>>list1 = [num for num in range(0,6)]
就可以創建出 [0, 1, 2, 3, 4]的list
後面還可以加入更複雜的條件式,如:
>>>list2 = [num for num in range(0,10) if num%2 == 0]
就可以創建出 [0, 2, 4, 6, 8]的list
當然還有不少有趣的例子,附在下方:
要注意的是其中最後一個例子運用在string上。
最後,python也允許有複雜的巢式(nested)的函式呼叫,例如:
2018/3/28 補充
此外,Dictionary Comprehensive與List Comprehensive非常類似,通式如下:
{ __:__ for __ in ____ }
例如:
第一個例子中,因預設(default)就是iterate鍵值(key),所以只看到keys。
而在第二個例子中,key及value都用到了,所以要注意最後in的後面必須改成.items,表示要iterate的整個item。
更多創建出dictionary的例子:
[ __ for __ in ____ ]
舉例來說:
>>>list1 = [num for num in range(0,6)]
就可以創建出 [0, 1, 2, 3, 4]的list
後面還可以加入更複雜的條件式,如:
>>>list2 = [num for num in range(0,10) if num%2 == 0]
就可以創建出 [0, 2, 4, 6, 8]的list
當然還有不少有趣的例子,附在下方:
要注意的是其中最後一個例子運用在string上。
最後,python也允許有複雜的巢式(nested)的函式呼叫,例如:
2018/3/28 補充
此外,Dictionary Comprehensive與List Comprehensive非常類似,通式如下:
{ __:__ for __ in ____ }
例如:
第一個例子中,因預設(default)就是iterate鍵值(key),所以只看到keys。
而在第二個例子中,key及value都用到了,所以要注意最後in的後面必須改成.items,表示要iterate的整個item。
更多創建出dictionary的例子:
訂閱:
文章 (Atom)





































