AutoKeras使用
我們在構建自己的神經網絡模型時,往往會基于預編譯模型上進行遷移學習。但不同的訓練數據、不同的場景下,各個模型表現不一,需要投入大量的精力進行調參,耗費相當多的時間才能得到自己滿意的模型。
而谷歌近期推出了AutoML,可以幫助人們在給定數據下自動找尋最優網絡模型,可謂讓不是專業的人也可以輕松構建合適自己的網絡模型,但唯一的問題是太貴了,每小時收費20美元啦。
幸好開源界也推出了autokeras,讓我們一眾屌絲也可以享受這免費的待遇,其官網是?https://autokeras.com/?。
官網的文檔和樣例目前不是很詳細,我研究了一番,寫篇簡單的入門貼,供大家參考。
一、 準備數據
先下載訓練和測試數據集,下載地址為?http://pan.baidu.com/s/1nuqlTnN,總共500張圖片,其中100張為測試數據,400張為訓練數據,圖片分為'bus', 'dinosaur', 'flower', 'horse', 'elephant'五類,分別以以3,4,5,6,7開頭進行按類區分
按照autokers的要求,我們需要做一個csv文件,記錄圖片與所屬標簽的映射關系,可以用如下代碼生成:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import?os import?csv ? TRAIN_IMG_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/train' TRAIN_CSV_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/train_labels.csv' TEST_IMG_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/test' TEST_CSV_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/test_labels.csv' ? def?mkcsv(img_dir, csv_dir): ????list?=?[] ????list.append(['File Name','Label']) ????for?file_name?in?os.listdir(img_dir): ????????if?file_name[0]?==?'3':???#bus ????????????item?=?[file_name,?0] ????????elif?file_name[0]?==?'4':?#dinosaur ????????????item?=?[file_name,?1] ????????elif?file_name[0]?==?'5':?#elephant ????????????item?=?[file_name,?2] ????????elif?file_name[0]?==?'6':?#flower ????????????item?=?[file_name,?3] ????????else: ????????????item?=?[file_name,?4]?#horse ????????list.append(item) ? ????print(list) ????f?=?open(csv_dir,?'w', newline='') ????writer?=?csv.writer(f) ????writer.writerows(list) ? mkcsv(TRAIN_IMG_DIR, TRAIN_CSV_DIR) mkcsv(TEST_IMG_DIR, TEST_CSV_DIR) |
最后生成的csv文件的格式是這樣:
| 1 2 3 4 5 6 | File Name,Label 473.jpg,1 675.jpg,3 556.jpg,2 584.jpg,2 339.jpg,0 |
二、 格式化圖片
訓練和測試圖片的大小不一,需要統一轉換成相同的格式才能被autokeras處理,可用如下代碼處理:
from tensorflow.keras.preprocessing import image import osTEST_IMG_DIR_INPUT = "/home/yourname/Documents/tensorflow/images/500pics2/test_origin" TEST_IMG_DIR_OUTPUT = "/home/yourname/Documents/tensorflow/images/500pics2/test" TRAIN_IMG_DIR_INPUT = "/home/yourname/Documents/tensorflow/images/500pics2/train_origin" TRAIN_IMG_DIR_OUTPUT = "/home/yourname/Documents/tensorflow/images/500pics2/train" IMAGE_SIZE = 28def format_img(input_dir, output_dir):for file_name in os.listdir(input_dir):path_name = os.path.join(input_dir, file_name)img = image.load_img(path_name, target_size=(IMAGE_SIZE, IMAGE_SIZE))path_name = os.path.join(output_dir, file_name)img.save(path_name)format_img(TEST_IMG_DIR_INPUT, TEST_IMG_DIR_OUTPUT) format_img(TRAIN_IMG_DIR_INPUT, TRAIN_IMG_DIR_OUTPUT)本例中我們把圖片大小統一轉換成(28, 28)的格式,為什么是這個值呢?我最初嘗試設置成224*224,但發現后來運行autokeras時,拋出了"RuntimeError: CUDA error: out of memory"的錯誤,autokeras是基于pyTorch,我覺得pyTorch對于內存的利用上需要優化下,同樣的數據集我在基于tensorflow的keras上是不會報內存不足的。不過也許你的內存足夠大的話,可以忽略我的建議。
三、 訓練
首先我們需要安裝autokeras:pip3 install autokeras
其次需要安裝graphviz: apt install graphviz,目的是為了最后能畫出我們生成的模型
以下是訓練代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | from?autokeras.image_supervised?import?load_image_dataset, ImageClassifier from?keras.models?import?load_model from?keras.utils?import?plot_model from?keras.preprocessing.image?import?load_img, img_to_array import?numpy as np ? TRAIN_CSV_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/train_labels.csv' TRAIN_IMG_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/train' TEST_CSV_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/test_labels.csv' TEST_IMG_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/test' ? PREDICT_IMG_PATH?=?'/home/yourname/Documents/tensorflow/images/500pics2/test/719.jpg' ? MODEL_DIR?=?'/home/yourname/Documents/tensorflow/images/500pics2/model/my_model.h5' MODEL_PNG?=?'/home/yourname/Documents/tensorflow/images/500pics2/model/model.png' IMAGE_SIZE?=?28 ? if?__name__?==?'__main__': ????# 獲取本地圖片,轉換成numpy格式 ????train_data, train_labels?=?load_image_dataset(csv_file_path=TRAIN_CSV_DIR, images_path=TRAIN_IMG_DIR) ????test_data, test_labels?=?load_image_dataset(csv_file_path=TEST_CSV_DIR, images_path=TEST_IMG_DIR) ? ????# 數據進行格式轉換 ????train_data?=?train_data.astype('float32')?/?255 ????test_data?=?test_data.astype('float32')?/?255 ????print("train data shape:", train_data.shape) ? ????# 使用圖片識別器 ????clf?=?ImageClassifier(verbose=True) ????# 給其訓練數據和標簽,訓練的最長時間可以設定,假設為1分鐘,autokers會不斷找尋最優的網絡模型 ????clf.fit(train_data, train_labels, time_limit=1?*?60) ????# 找到最優模型后,再最后進行一次訓練和驗證 ????clf.final_fit(train_data, train_labels, test_data, test_labels, retrain=True) ????# 給出評估結果 ????y?=?clf.evaluate(test_data, test_labels) ????print("evaluate:", y) ? ????# 給一個圖片試試預測是否準確 ????img?=?load_img(PREDICT_IMG_PATH) ????x?=?img_to_array(img) ????x?=?x.astype('float32')?/?255 ????x?=?np.reshape(x, (1, IMAGE_SIZE, IMAGE_SIZE,?3)) ????print("x shape:", x.shape) ? ????# 最后的結果是一個numpy數組,里面是預測值4,意味著是馬,說明預測準確 ????y?=?clf.predict(x) ????print("predict:", y) ? ????# 導出我們生成的模型 ????clf.load_searcher().load_best_model().produce_keras_model().save(MODEL_DIR) ????# 加載模型 ????model?=?load_model(MODEL_DIR) ????# 將模型導出成可視化圖片 ????plot_model(model, to_file=MODEL_PNG) |
最后給出生成的模型樣子,也許這個模型比不上你手工調參得來的模型高效,但這已經是autokeras給出的最優解了,而且我們不需要勞神勞力的去調參了。
? ?人生苦短,我用autokers!
?
總結
以上是生活随笔為你收集整理的AutoKeras使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome默认为浏览器并且设置外部调用
- 下一篇: Silverlight如何与JS相互调用