我們在構建自己的神經網絡模型時,往往會基於預編譯模型上進行遷移學習。但不同的訓練數據、不同的場景下,各個模型表現不一,需要投入大量的精力進行調參,耗費相當多的時間才能得到自己滿意的模型。
而谷歌近期推出了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文件,記錄圖片與所屬標簽的映射關系,可以用如下代碼生成:
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文件的格式是這樣:
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 os TEST_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 = 28 def 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,目的是為了最后能畫出我們生成的模型
以下是訓練代碼:
from autokeras.image.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.export_keras_model(MODEL_DIR)
# 加載模型
model = load_model(MODEL_DIR)
# 將模型導出成可視化圖片
plot_model(model, to_file=MODEL_PNG)
最后給出生成的模型樣子,也許這個模型比不上你手工調參得來的模型高效,但這已經是autokeras給出的最優解了,而且我們不需要勞神勞力的去調參了。
人生苦短,我用autokers!

