2019年12月1日 星期日

raspberry pi 4 RealVNC 的問題"cannot currently show the desktop"

剛入手最新的raspberry pi 4並使用剛發布沒多久新版的Raspbian Buster,而pi不需外接鍵盤及滑鼠的操作可使用遠端操作軟體,現今RealVNC於Rasbian中已是預先pre-installed了,所以只要從桌面左上角的"偏好設定"選擇Raspberry Pi設定,就可啟用VNC,不需要再裝了,之後右上角會顯示 VNC icon,按一下可看一下位於同網域的ip address

不過當然要遠距連網的電腦還是要到RealVNC下載Viewer,可到此下載viewer

https://www.realvnc.com/en/

之後打開VNC Viewer 輸入 ip連結就可進行遠端操控了。

不過當拔掉HDMI的接頭後,可能會發現VNC遠端連線雖然連得上,但畫面卻顯示: 
cannot currently show the desktop

試了好久,終於發現問題,原來是monitor resolution必須要調整,以下是解法:


$ sudo raspi-config

            --choosing 7 Advanced options
-- choosing A5 Resolution
-- changing resolution to DMT Mode 82 1920x1080 60Hz 16:9

這樣居然就可以了,應是raspberry 4Raspbian BusterBug。

2019年6月29日 星期六

can't import matplotlib / python3.7

最近重裝了Anaconda,python版本為3.7。其實太新的版本通常不好用,但裝了也沒辦法,果然出問題囉:

import matplotlib 之後
出現下方訊息:

ImportError: cannot import name 'get_backend' from 'matplotlib' (/usr/lib/python3.7/site-packages/matplotlib/__init__.py)

解決方法就是upgrade 到 3.0.2:

conda install matplotlib==3.0.2

現在問題是解決了,希望不要有別的問題再發生囉!!





2019年3月10日 星期日

Flask + Bootstrap 暴力解

最近寫了一個機械學習(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月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為例來看看怎麼裝:
先下載檔案:
$ 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,實在還是有不得已的時候啊

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()一樣,不會改變原來資料:

如果資料是陣列的話,另一個優點是可指定陣列排列的方向:


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!!








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就會不同。

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/



2018年6月13日 星期三

jupyter lab module不能import的問題

Jupyter Lab是jupyter notebook的新版,但會常碰到一些module沒法成功import的問題。我就碰過幾次了,都會跑出這個結果:

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就可:




2018年6月3日 星期日

Python: Numpy介紹

List是Python中常用的資料結構,因Python動態型別的特性,可以建立"異質"的list,例如:

In[1]:  L1 = [2, True, 'a']
           [type(item) for item in L1]
Out[1]: [int, bool, str] 

不過這種"動態"的特性並不是免費的,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()應該看例子就可以理解用途了。