- AutoKeras 讓你用不到 10 行核心程式碼就能完成 MNIST 手寫辨識,準確率可達 98% 以上——不需要自己設計網路架構
- 整個流程可在 Google Colab 免費 GPU 環境中完成,從安裝到出結果約 15–30 分鐘
- AutoKeras 的底層是 Neural Architecture Search(NAS),它會自動嘗試不同的 CNN 結構,幫你挑出最佳組合
- 2026 年的當下,KerasCV、Keras Tuner 和 PyTorch Lightning 提供了更靈活、更主流的替代路線
一、先聊聊:為什麼要用 AutoKeras?
如果你剛踏入深度學習的世界,大概會遇到一個很煩的問題:模型架構該怎麼設計?要幾層卷積?filter 要多少?要不要加 BatchNorm?Dropout 比例要多高?
這些問題,對老手來說是經驗直覺,對新手來說是一片迷霧。
AutoKeras 的出現就是為了解決這件事[1]。它是由德州農工大學 Xia "Ben" Hu 教授的團隊在 2019 年開發的 AutoML 工具,建立在 Keras 之上,核心概念很單純:你把資料丟進去,它自動幫你找出最好的模型架構。背後用的是 Neural Architecture Search(NAS)[3]——簡單說,就是讓演算法代替你做「試模型」這件苦差事。
而 MNIST[2]——那個經典的手寫數字辨識資料集——則是我們今天的練功場。70,000 張 28×28 的灰階手寫數字圖片,0 到 9,簡單到幾乎每篇深度學習教學都會用它開場[8]。正因為簡單,它特別適合拿來測試工具本身好不好用,而不是被資料的複雜度卡住。
二、在 Google Colab 上動手做
我們直接上手。打開 Google Colab,新建一個 Notebook。記得把執行環境切到 GPU(選單 → 執行階段 → 變更執行階段類型 → T4 GPU),這樣 NAS 搜尋會快很多。
2.1 安裝 AutoKeras
Colab 已經預裝了 TensorFlow,我們只需要額外裝 AutoKeras:
# 安裝 AutoKeras(會自動拉 keras-tuner 依賴)
!pip install autokeras -q
安裝完畢後,重啟一下 runtime(Colab 會提示),然後跑下一格:
import autokeras as ak
import tensorflow as tf
import numpy as np
print(f"TensorFlow version: {tf.__version__}")
print(f"AutoKeras version: {ak.__version__}")
print(f"GPU available: {len(tf.config.list_physical_devices('GPU')) > 0}")
如果你看到 GPU available: True,就代表環境準備好了。
2.2 載入 MNIST 資料
# 直接用 TensorFlow 內建的 MNIST 資料集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(f"訓練集: {x_train.shape}, 測試集: {x_test.shape}")
print(f"標籤範圍: {y_train.min()} ~ {y_train.max()}")
print(f"像素值範圍: {x_train.min()} ~ {x_train.max()}")
你會看到訓練集有 60,000 張圖,測試集 10,000 張,每張 28×28 像素,值域 0–255。
2.3 核心:用 AutoKeras 做圖像分類
這是整篇文章最精華的部分,也是 AutoKeras 最驚人的地方——核心程式碼真的只有幾行:
# ★ AutoKeras 核心——就這幾行 ★
# 建立影像分類器,最多嘗試 10 種架構
clf = ak.ImageClassifier(
overwrite=True,
max_trials=10 # NAS 會嘗試 10 種不同的模型架構
)
# 開始訓練(AutoKeras 會自動做資料前處理、架構搜尋、超參數調校)
clf.fit(x_train, y_train, epochs=10)
跑起來之後,你會看到 AutoKeras 在背景做了一大堆事:它會嘗試不同的 CNN 架構——有些淺、有些深、有些加了 skip connection——然後根據驗證集的表現自動挑出最好的那一個。這就是 NAS 的威力[3]。
依照 Colab 的 GPU 等級,這個過程大約需要 10–25 分鐘。max_trials=10 代表最多嘗試 10 種架構。你也可以設成 3 來加快速度(犧牲一點搜尋廣度),或設成 25 來更仔細地搜(但會跑更久)。
2.4 評估模型
# 在測試集上評估
loss, accuracy = clf.evaluate(x_test, y_test)
print(f"\n測試集準確率: {accuracy:.4f}")
print(f"測試集 Loss: {loss:.4f}")
通常你會看到準確率在 98.5%–99.2% 之間——這已經是很不錯的成績了,而你完全沒有手動設計過任何一層網路。
2.5 看看 AutoKeras 挑了什麼架構
# 匯出最佳模型,看看長什麼樣
best_model = clf.export_model()
best_model.summary()
你通常會看到一個類似這樣的架構:幾層卷積 + 池化 + BatchNorm,最後接 Dense 層輸出 10 個類別。AutoKeras 自動幫你決定了 filter 數量、kernel size、是否要加 Dropout 等等。
2.6 實際預測並視覺化
import matplotlib.pyplot as plt
# 隨機抽 16 張測試圖片來預測
predictions = clf.predict(x_test[:16])
fig, axes = plt.subplots(4, 4, figsize=(10, 10))
for i, ax in enumerate(axes.flat):
ax.imshow(x_test[i], cmap='gray')
pred_label = predictions[i].item() if hasattr(predictions[i], 'item') else int(predictions[i])
true_label = y_test[i]
color = 'green' if pred_label == true_label else 'red'
ax.set_title(f"預測: {pred_label} / 實際: {true_label}", color=color, fontsize=11)
ax.axis('off')
plt.tight_layout()
plt.show()
綠色標題代表預測正確,紅色代表錯誤。以 98%+ 的準確率來說,16 張裡面通常全對,偶爾會有一兩張特別潦草的數字會判錯。
2.7 儲存模型
# 儲存最佳模型,方便之後載入使用
best_model.save("autokeras_mnist_best.keras")
print("模型已儲存!")
# 之後要載入時:
# loaded_model = tf.keras.models.load_model("autokeras_mnist_best.keras")
三、完整程式碼(一鍵複製版)
如果你只是想快速跑起來,這裡是完整版,一格 Colab cell 搞定:
# === AutoKeras MNIST 手寫辨識 完整版 ===
# 環境:Google Colab + GPU runtime
# Step 1: 安裝
!pip install autokeras -q
# Step 2: 匯入
import autokeras as ak
import tensorflow as tf
import numpy as np
# Step 3: 載入 MNIST
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# Step 4: 建立分類器 & 訓練
clf = ak.ImageClassifier(overwrite=True, max_trials=10)
clf.fit(x_train, y_train, epochs=10)
# Step 5: 評估
loss, accuracy = clf.evaluate(x_test, y_test)
print(f"測試集準確率: {accuracy:.4f}")
# Step 6: 匯出最佳模型
best_model = clf.export_model()
best_model.summary()
# Step 7: 儲存
best_model.save("autokeras_mnist_best.keras")
四、AutoKeras 做了什麼?拆解黑箱
看起來很像魔法,但其實 AutoKeras 背後做了這些事[4]:
- 資料前處理:自動將像素值正規化到 0–1 範圍,偵測輸入維度並自動 reshape(你不需要手動加 channel 維度)
- 架構搜尋(NAS):在一個預定義的搜尋空間中,嘗試不同的 CNN 組合——不同的卷積層數、filter 數量、是否加殘差連接、Dropout 比例等
- 超參數調校:底層使用 Keras Tuner[6] 的 Bayesian Optimization,不是暴力窮舉,而是根據前幾次嘗試的結果「聰明地」決定下一個要試的組合
- 模型選擇:根據驗證集表現,自動挑出
max_trials次嘗試中的最佳模型
簡單說,AutoKeras 把「資深工程師花兩天調模型」這件事,壓縮成一個 clf.fit() 呼叫。代價是什麼?時間(NAS 要跑很多次訓練)和靈活性(你對架構的控制力有限)。
五、2026 年的當下,有更好的選擇嗎?
老實說——有。AutoKeras 作為 AutoML 的入門教具依然很棒,但如果你要做「正經」的影像分類專案,2026 年的生態系已經進化了不少。以下是三條更主流的路線:
5.1 KerasCV:官方嫡系,功能更全
KerasCV[5] 是 Keras 官方的電腦視覺套件,提供了預訓練模型(EfficientNet、ResNet、ConvNeXt 等)、資料增強(CutMix、MixUp、RandAugment)和完整的訓練 pipeline。
# KerasCV 做 MNIST 的方式(更主流的做法)
!pip install keras-cv -q
import keras_cv
import keras
import numpy as np
# 載入 MNIST
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 轉成 3 通道(預訓練模型需要 RGB)
x_train = np.stack([x_train]*3, axis=-1).astype("float32") / 255.0
x_test = np.stack([x_test]*3, axis=-1).astype("float32") / 255.0
# 使用預訓練的 EfficientNetV2 作為 backbone
backbone = keras_cv.models.EfficientNetV2Backbone.from_preset(
"efficientnetv2_b0_imagenet"
)
model = keras.Sequential([
keras.layers.Input(shape=(28, 28, 3)),
keras.layers.Resizing(224, 224), # EfficientNet 需要較大輸入
backbone,
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dense(10, activation="softmax")
])
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
model.fit(x_train, y_train, epochs=5, validation_split=0.1, batch_size=64)
KerasCV 的優勢在於:你用的是業界主流的預訓練模型,遷移學習的效果好、收斂快,而且生態系活躍、文件完整。對 MNIST 來說有點殺雞用牛刀,但換成真實世界的影像分類任務時,這才是正規做法。
5.2 Keras Tuner:精準控制的超參數搜尋
如果你想自己設計模型架構、但讓機器幫你調超參數,Keras Tuner[6] 是更好的選擇。它其實就是 AutoKeras 的底層引擎,但給你更多控制權:
# Keras Tuner:自訂架構 + 自動調參
!pip install keras-tuner -q
import keras_tuner as kt
import keras
def build_model(hp):
model = keras.Sequential()
model.add(keras.layers.Input(shape=(28, 28, 1)))
# 讓 Tuner 決定要幾層卷積
for i in range(hp.Int("num_conv_layers", 1, 3)):
model.add(keras.layers.Conv2D(
filters=hp.Choice(f"filters_{i}", [32, 64, 128]),
kernel_size=hp.Choice(f"kernel_{i}", [3, 5]),
activation="relu",
padding="same"
))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(
hp.Int("dense_units", 64, 256, step=64),
activation="relu"
))
model.add(keras.layers.Dropout(hp.Float("dropout", 0.2, 0.5, step=0.1)))
model.add(keras.layers.Dense(10, activation="softmax"))
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
return model
# Bayesian Optimization 搜尋
tuner = kt.BayesianOptimization(
build_model,
objective="val_accuracy",
max_trials=15,
directory="tuner_results",
project_name="mnist"
)
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train[..., None].astype("float32") / 255.0
x_test = x_test[..., None].astype("float32") / 255.0
tuner.search(x_train, y_train, epochs=5, validation_split=0.2)
best_model = tuner.get_best_models(1)[0]
best_model.evaluate(x_test, y_test)
Keras Tuner 的甜蜜點在於:你保有對模型架構的設計權,但把「哪個組合最好」的苦工交給演算法。比 AutoKeras 靈活,比全手動輕鬆。
5.3 PyTorch Lightning:PyTorch 生態系的選擇
如果你偏好 PyTorch 生態系,PyTorch Lightning[7] 搭配 Optuna 是目前最主流的組合:
# PyTorch Lightning + Optuna 做 MNIST
!pip install lightning optuna -q
import lightning as L
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
class MNISTModel(L.LightningModule):
def __init__(self, num_filters=32, dropout=0.3, lr=1e-3):
super().__init__()
self.save_hyperparameters()
self.conv1 = nn.Conv2d(1, num_filters, 3, padding=1)
self.conv2 = nn.Conv2d(num_filters, num_filters*2, 3, padding=1)
self.fc1 = nn.Linear(num_filters*2 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
self.dropout = nn.Dropout(dropout)
self.pool = nn.MaxPool2d(2)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(x.size(0), -1)
x = self.dropout(F.relu(self.fc1(x)))
return self.fc2(x)
def training_step(self, batch, batch_idx):
x, y = batch
loss = F.cross_entropy(self(x), y)
self.log("train_loss", loss)
return loss
def validation_step(self, batch, batch_idx):
x, y = batch
pred = self(x)
acc = (pred.argmax(1) == y).float().mean()
self.log("val_acc", acc, prog_bar=True)
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=self.hparams.lr)
# 資料
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_ds = datasets.MNIST("data", train=True, download=True, transform=transform)
val_ds = datasets.MNIST("data", train=False, transform=transform)
train_loader = DataLoader(train_ds, batch_size=128, shuffle=True, num_workers=2)
val_loader = DataLoader(val_ds, batch_size=256, num_workers=2)
# 訓練
model = MNISTModel(num_filters=32, dropout=0.3, lr=1e-3)
trainer = L.Trainer(max_epochs=5, accelerator="auto")
trainer.fit(model, train_loader, val_loader)
PyTorch Lightning 的好處是:程式碼結構清晰、除錯容易、跟整個 PyTorch 生態(Hugging Face、torchvision)無縫整合。如果你之後想做更複雜的事(物件偵測、生成模型、多 GPU 訓練),Lightning 的擴展性遠勝 AutoKeras。
六、該選哪個?一張表搞定
| 工具 | 適合誰 | 控制力 | 學習曲線 | 生態活躍度 |
|---|---|---|---|---|
| AutoKeras | 初學者、快速原型 | 低 | 極低 | 中等 |
| KerasCV | 需要預訓練模型的實務專案 | 中高 | 中等 | 高 |
| Keras Tuner | 想自訂架構但自動調參 | 高 | 中等 | 高 |
| Lightning + Optuna | PyTorch 使用者、研究導向 | 最高 | 中高 | 最高 |
我的建議是這樣:
- 剛入門、想感受 AutoML 的魔法:用 AutoKeras,體驗那個「我什麼都不用做就有 98% 準確率」的驚喜感
- 要做正經專案:直接上 KerasCV(Keras 派)或 Lightning + Optuna(PyTorch 派)
- 想理解模型、同時偷懶調參:Keras Tuner 是最佳平衡點
七、常見問題 FAQ
Q:AutoKeras 在 2026 年還能用嗎?
可以。AutoKeras 仍在 keras-team 組織下維護[4],支援 Keras 3 的多後端架構(TensorFlow、PyTorch、JAX)。但社群活躍度確實不如 2020–2022 年的高峰期,部分進階功能(如 StructuredDataClassifier)已被移除。作為學習工具依然推薦,但生產環境建議考慮更主流的方案。
Q:Colab 免費版的 GPU 夠用嗎?
對 MNIST 來說綽綽有餘。即使只用 CPU 也跑得動,只是 NAS 搜尋會從 15 分鐘變成 40 分鐘左右。如果你要拿去跑 CIFAR-100 或更大的資料集,建議用 Colab Pro 的 A100 或 V100。
Q:max_trials 設多少比較好?
MNIST 這種簡單任務,10 就很夠了。更複雜的任務可以設 25–50,但要有耐心等。經驗法則:先設小值(如 5)快速看一輪,確認沒問題後再加大。
Q:AutoKeras 找到的模型可以部署嗎?
可以。用 clf.export_model() 匯出的就是標準的 Keras 模型,你可以用 model.save() 儲存,之後用 TF Serving、TF Lite 或 ONNX 轉換後部署到任何環境。
八、結語:工具會過時,觀念不會
AutoKeras 是一個很好的「第一次接觸 AutoML」的入口。它把 NAS 這個本來很硬核的研究題目,包裝成了任何人都能用的 API。但更重要的是它背後傳達的觀念:模型架構不是靠靈感,而是可以被系統性搜尋的。
不管你最後選了 AutoKeras、KerasCV、Keras Tuner 還是 Lightning,這個核心觀念都一樣。工具會迭代、API 會改版,但「讓機器幫你探索設計空間」這件事,只會越來越重要——尤其是在模型越來越大、架構越來越複雜的 2026 年。
好了,打開 Colab,把程式碼貼進去跑跑看吧。第一次看到機器自己選出一個 98%+ 準確率的模型時,那個「哦~」的感覺,是讀多少篇論文都換不來的。



