Python context manager

內文管理器 python with 語句,能讓我們更輕易的實行資源管理,例如數據、開啟文件,或是各種會lock的行為。 要保證處理完相關事情,資源有被釋放。 簡單行為中,我們會這樣去開啟文件 test_file = open('test.txt', 'w') try: test_file.write('line one') finally: test_file.close() 上述行為除了是非慣用以外, 若try-finally裡面邏輯複雜,還面臨著維護的困難。 這裡有著使用 with 的簡單用法 with open('test.txt', 'w') as test_file: test_file.write('line one') 上述程式碼中,當 with 內的語句執行結束後,會自動關閉該資源,且變數test_file也會結束。 實現context manager 若想實現 context manager的功能,則要定義好__enter__ 與 __exit__ 兩個函式,分別管理with的進入行為和結束行為。

2020-04-14 · 1 min · 38 words · KbWen

Python Iterable

要了解python 哪些對象是可以迭代的, 可以先了解兩個相似的名詞 Iterable Iterator Iterable 可以被迭代、遍歷(loop, iteration)的物件對象可以被稱為iterable, 從官方文件得知,要實現__iter__或是__getitem__的方法即可。 包含了常見的list、tuple、set、dict、str、range, >>> dir(str()) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', ......] 但若是使用collection去檢查是否是iterable 只有實現__getitem__的對象可以被迭代但不會是iterable Iterator https://docs.python.org/3.7/c-api/iter.html 從官方文件看出,含有__iter__和__next__的對象可稱為iterator, iterator是iterable的子集合, 上述提到的幾種方式是iterable但都不是iterator,可以使用上面用到的isinstance或是dir來確認, >>> from collections.abc import Iterable, Iterator >>> for i in ([1,2,3], "123", (1,2,3)): ... print(f"{i} is iterable: {isinstance(i, Iterable)}") ... print(f"{i} is iterator: {isinstance(i, Iterator)}") ... [1, 2, 3] is iterable: True [1, 2, 3] is iterator: False 123 is iterable: True 123 is iterator: False (1, 2, 3) is iterable: True (1, 2, 3) is iterator: False 而文件則是iterator >>> file_path = os.path.abspath("test.py") >>> with open(file_path) as ifile: ... isinstance(ifile, Iterator) ... True 結語 了解了iterable和iterator,以後開發時, 若想創造出可以被迭代的對象或是迭代器, 則要知道必須要包含哪些基礎功能 那麼Generator呢?

2020-04-11 · 1 min · 115 words · KbWen

python pdb

pdb — The Python Debugger 一段簡單的程式碼 print(f'file = {__file__}') 常見pdb幾種使用方式 1. 直接使用 python -m pdb file.py 執行上面指令會讓整個檔案進入pdb模式操作 ( P / d h f b o i ) m l e e / s = r c / _ t f e i s l t e . _ p _ y ( 1 ) < m o d u l e > ( ) 2. 設斷點 把上面程式碼改成 ...

2020-04-10 · 2 min · 221 words · KbWen

OPENCV 人臉辨識

做初始的人臉檢測,主要是用於人臉辨識的前置處理,我們要利用Haar特徵處理 在訓練的時候使用AdaBoost,也就是用弱分類來判別,每一步都拿出一個特徵值, 判斷是否人臉,是的話在進入下一步,這樣一步一步循序漸進; 廣義來看就像是讓所有的弱分類器投票,再根據準確率加成從而達到結果。 其組成的分類器是一個Cascade的形式,長的像是簡單的決策樹。 在實際使用發現Haar cascade的問題主要就是參數的正確性,尤其是scaleFactor和 MinNeighbors;第一個參數是控制比例變化,如果調大,檢測到的層樹就少,會導致發現的物 件也變少;而第二個參數則是看檢測到鄰居的數量決定。 由此可知,根據不同的圖片大小類型,都需要去調參數,這在使用上不可能辦到; 未來來嘗試其他方式。 原始文章,由此改的 檢測人臉和眼睛,圖片是由網路下載的USA volleyball national team 合照 My Github

2017-07-12 · 1 min · 19 words · KbWen

ML KNN

k-th nearest neighbor 又簡稱KNN,是_Supervised learning_ 的一種,看英文意思很簡明扼要,就是K個最相近的鄰居。 因此這個演算法在實作時,會找到附近K個最近的點,來判斷自己要歸在哪一類。 雖然說他是監督式學習的一種,但是他並不用去訓練參數,而是把資料都儲存起來做資料分類。 我們可以藉由增加K的數值來增加此演算法的noise margin。 此演算法會有著儲存空間大以及導致空間複雜度高的問題,還有著容易被數據不平衡所影響。 在這個問題的實作上就是算點到點之間的距離,因此我們使用Scipy的函數來實作,為了方便取K值等於1,並且拿來和SKlearn的KNN比較。 想法是用for迴圈來取test data對於每個train data的最近距離,那他就會是最近train data 的 label 準確率 sklearn knn : 0.973333333 手刻 knn : 0.9466666 My Github

2017-06-30 · 1 min · 29 words · KbWen

LSTM

原文網址 想像人在每次思考、閱讀一段文章時,不是從零開始,會保留過去的記憶;RNN就是來解決這方面的問題。 每次訓練時,會保留過去的訊息,然後一直傳遞下去。LSTM則是一種特殊的RNN形式。 The Problem of Long-Term Dependencies 很多情況下,會需要更多的上下文訊息,他們可能距離非常遠,這就會產生梯度消失,或是梯度爆炸。 LSTM LSTM,稱為長短期記憶網絡(Long Short Term Memory networks),是一種特殊的RNN。 不同於RNN在每個Cell裡只包含一個tanh,LSTM增加了input gate, output gate 和 forget gate,都是用來控制我們要怎麼操作這些資料;使用sigmoid 可以看做是記憶、讀取資料量的多寡,0代表不通過,1代表全部通過。 詳細推倒部分可以看看原文,他也介紹了GRU–一種更高效的LSTM。 值得注意的,現今我們從RNN得到的好結果,幾乎都是指LSTM~ 在Tensorflow中,LSTM叫出來用就可以了。 下圖是用紅虛線去學習黑線(x*sin(x))的結果

2017-06-29 · 1 min · 27 words · KbWen

Kaggle PM2.5 Prediction

嘗試用sklearn做分析 使用豐原站的觀測記錄,分成train set跟test set,train set是豐原站每個月的前20天所有資料。test set則是從豐原站剩下的資料中取樣出來。 train.csv:每個月前20天的完整資料。 test_X.csv:從剩下的10天資料中取樣出連續的10小時為一筆,前九小時的所有觀測數據當作feature,第十小時的PM2.5當作answer。一共取出240筆不重複的test data,請根據feauure預測這240筆的PM2.5。 sklearn在使用上看起來很直接 因此我們的feature使用最笨的方式:取出所有前九小時的值,甚麼都不做直接看結果。 不觀察feature也不簡化 在Private上排名在中間,略高於Baseline 因為是linear regression,對Gradient descent:算一次斜率,結束。 直接就找到解 My Github

2017-06-13 · 1 min · 19 words · KbWen

Kaggle Titanic

Kaggle The sinking of the RMS Titanic is one of the most infamous shipwrecks in history. On April 15, 1912, during her maiden voyage, the Titanic sank after colliding with an iceberg, killing 1502 out of 2224 passengers and crew. This sensational tragedy shocked the international community and led to better safety regulations for ships. One of the reasons that the shipwreck led to such loss of life was that there were not enough lifeboats for the passengers and crew. Although there was some element of luck involved in surviving the sinking, some groups of people were more likely to survive than others, such as women, children, and the upper-class. In this challenge, we ask you to complete the analysis of what sorts of people were likely to survive. In particular, we ask you to apply the tools of machine learning to predict which passengers survived the tragedy. 從題目可以知道,這是一個 binary classification 最初想到SVM和perception 從題目給的數據,選擇Decision Tree 或 Random Forest可能是比較合理的想法 不過這邊我想用 Logistic Regression 來試試(sigmoid + cross entropy) 把訓練資料的內容全部都變成0-1的數字,剩下的就交給NN去解決 因為我們最後一層的active function是sigmoid 為了避免梯度消失,因次在做cross entropy時把最大最小值定為0.00001和0.99999 做每次的訓練時才不會有Nan的問題 ...

2017-06-09 · 1 min · 191 words · KbWen

TENSORFLOW 練習4: word2vec

把字詞轉成word embedding 要在字詞中找到他們之間的某種關聯,而不是分散無意義的符號代表 做這個問題的概念是 假設兩個不同句子中的詞上下文相同,則代表兩個詞的語意相同 今天要來使用skip-gram模型,一個類似二分法的方式(像或著不像) 一開始也同之前的問題,先做數據處理 [(most count word1, n1),(second word2, n2)] 計算出現數量 文字轉成向量 The actual code for this tutorial is very short ([the, code], actual), ([actual, for], code), … skip-gram pairs (actual, the), (actual, code), (code, actual), … 在這之間都會給他編號,變成像是 (10,20),(10,30),(30,10),(30,40),.. 的形式 用上nce loss 我還不熟,大概是我們讓目標的機率越高越好,其餘K個數的機率很低,negative samples king - queen = man - woman ==> king - queen + woman = man 給queen加上負號,並取不要的值,我想是這種感覺吧?? 結果 會把相似的詞分的近些 原版 tensorflow 有用上sklearn的TSNE 來做降維,在很多地方都比PCA好,讀了以後可以來試試 My Github ...

2017-05-12 · 1 min · 71 words · KbWen

Tensorflow 練習3: 'FizzBuzz'

Joel Grus – FizzBuzz in tensorflow 從網路上看到的幽默問題 算是一個很有趣的使用,適合在做完 Classification 後 輸入資料處理和原版程式碼一樣,因為還蠻直觀的 1 – 000000001 – [0 0 0 0 0 0 0 0 1] 2 – 000000010 – [0 0 0 0 0 0 0 1 0] ……… 輸出則是用[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]來代表四個分類 輸入輸出都是一個矩陣的形式 利用兩層hidden layer 分別是 512和256 激勵函數選擇relu 剩下的就交給tensorflow分類 結果 一開始一直分不出來 都會卡再把每個資料都判定成同一類(0.533) 後來減低每次訓練丟進去的量就OK了 (忘記一開始做分類時也只丟一點點進去) 卡在0.533代表他受非5非3倍數的值影響很大,畢竟是機率最高的地方 也看成是local minimum,要跳出去就是使用batch 這是有加入0.8 dropout 的結果,可以看到訓練跟測試差不多,而且很快就達到1.0的準確率 ...

2017-05-08 · 1 min · 74 words · KbWen