【AutoML 自動化機器學習:AutoKeras vs. Keras 建模比一比】 之前我們分享過如何用 AutoKeras 針對經典的 MNIST 手寫數字資料集做訓練,而且最少只需三行程式 (加上兩行程式來匯入資料集) 就能訓練完成: ``` from tensorflow.keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() ``` ``` import autokeras as ak clf = ak.ImageClassifier(max_trials=1) clf.fit(x_train, y_train, epochs=10) ``` AutoKeras 替我們產生的模型架構如下: ``` Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 28, 28)] 0 _________________________________________________________________ cast_to_float32 (CastToFloat (None, 28, 28) 0 _________________________________________________________________ expand_last_dim (ExpandLastD (None, 28, 28, 1) 0 _________________________________________________________________ normalization (Normalization (None, 28, 28, 1) 3 _________________________________________________________________ conv2d (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ conv2d_1 (Conv2D) (None, 24, 24, 64) 18496 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 12, 12, 64) 0 _________________________________________________________________ dropout (Dropout) (None, 12, 12, 64) 0 _________________________________________________________________ flatten (Flatten) (None, 9216) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 9216) 0 _________________________________________________________________ dense (Dense) (None, 10) 92170 _________________________________________________________________ classification_head_1 (Softm (None, 10) 0 ================================================================= Total params: 110,989 Trainable params: 110,986 Non-trainable params: 3 ``` 這是個有兩個二維卷積層、一個全域池化層、一個全連接層的模型,對 MNIST 這樣的簡單圖像集非常有效。它甚至包含了正規化層和將像素資料轉為 float32 浮點數的功能。 如果用 Keras Functional API 來建構以上的模型,你需要寫多少行程式呢? ``` from tensorflow.keras.datasets import mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train = x_train.astype('float32') x_test = x_test.astype('float32') from tensorflow.keras.models import Model from tensorflow.keras.layers import Conv2D, MaxPooling2D from tensorflow.keras.layers import Input, Dropout, Flatten, Dense from tensorflow.keras.layers.experimental.preprocessing import Normalization inputs = Input(shape=(28, 28, 1)) outputs = Normalization()(inputs) outputs = Conv2D(filters=64, kernel_size=3, activation='relu')(outputs) outputs = Conv2D(filters=64, kernel_size=3, activation='relu')(outputs) outputs = MaxPooling2D(pool_size=(2, 2))(outputs) outputs = Dropout(0.5)(outputs) outputs = Flatten()(outputs) outputs = Dropout(0.5)(outputs) outputs = Dense(10, activation='softmax')(outputs) model = Model(inputs=inputs, outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(x_train[:40000], y_train[:40000], validation_data=(x_train[40000:], y_train[40000:]), epochs=10, batch_size=32) ``` (修改來源:Packt 出版社的 Advanced-Deep-Learning-with-Keras (2018) MNIST 範例) 以上這個模型跟 AutoKeras 建出來的是幾乎一樣的,但可以發現寫起來複雜許多,得先對資料做更多預處理、得先理解模型的架構組成、而且還得自行從訓練集中分割出驗證集。AutoKeras 可替我們自動完成以上這些步驟,可說方便太多了。 AutoKeras 也能應付更複雜的圖像資料集。書中第四章我們即示範了針對 CIFAR-10 做訓練。這個資料集由六萬張 RGB 32 x 32 圖片組成,包含 10 種物件的分類,是由深度學習之父 Geoffrey Hinton 和他在多倫多大學的博士生 Alex Krizhevsky (著名的 AlexNet 的作者)、Ilya Sutskever (OpenAI 的聯合創始人兼董事) 收集的,目的是建立一個比 MNIST 手寫數字集更複雜、更真實和更多樣的圖像集來評估神經網路模型。 AutoKeras 在書中對 CIFAR-10 所產生的模型架構如下: ``` Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 32, 32, 3)] 0 _________________________________________________________________ cast_to_float32 (CastToFloat (None, 32, 32, 3) 0 _________________________________________________________________ normalization (Normalization (None, 32, 32, 3) 7 _________________________________________________________________ random_translation (RandomTr (None, 32, 32, 3) 0 _________________________________________________________________ random_flip (RandomFlip) (None, 32, 32, 3) 0 _________________________________________________________________ resizing (Resizing) (None, 224, 224, 3) 0 _________________________________________________________________ efficientnetb7 (Functional) (None, None, None, 2560) 64097687 _________________________________________________________________ global_average_pooling2d (Gl (None, 2560) 0 _________________________________________________________________ dense (Dense) (None, 10) 25610 _________________________________________________________________ classification_head_1 (Softm (None, 10) 0 ================================================================= Total params: 64,123,304 Trainable params: 63,812,570 Non-trainable params: 310,734 ``` 可以看到它採用了 2019 年由 Google 提出的 EfficientNet B7 深度殘差學習模型,並使其預測準確率達到 96%。實際檢視模型對圖片的預測結果,也可發現其表現相當良好 (參閱文章附圖,圖片看起來不清楚是因為只有 32 x 32 大小)。 ![](https://i.imgur.com/mJzTdy7.png) 96% 自然沒有目前論文中針對 CIFAR-10 提出的最佳模型 (99.5%) 那麼好,但後者的模型更加龐大而且使用了額外訓練資料,而有時與其追求最極致的模型,能否在時效內產生出一個可用的模型說不定是更為重要的。畢竟,你的老闆可能沒耐性等你慢慢生出一個史上最佳模型…對吧? 若你事先知道想用哪種架構來訓練模型,也可透過 AutoKeras 的 AutoModel 類別來自定搜尋空間。AutoModel 的寫法非常類似 Keras Functional API,而且目前支援標準 CNN、ResNet v1/v2、Xception、EfficientNet B0~B7。當中某些模型還可沿用論文的權重來進行遷移學習,有機會減少訓練時間。 在下一篇中,我們將拿另一個書上沒有的圖像資料集為例,展示 AutoKeras 實際產生模型並做預測的過程與其成效。 ![](https://i.imgur.com/bk0pmlx.jpg) 想了解更多請參第 1 本 AutoML 中文書《AutoML 自動化機器學習》AI 自動建模超上手 ! 天瓏網路→ https://pse.is/3y58hz