【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