深度學習應用系列(三)| 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文件,記錄圖片與所屬標簽的映射關系,可以用如下代碼生成:

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!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM