Key Findings
  • 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]

  1. 資料前處理:自動將像素值正規化到 0–1 範圍,偵測輸入維度並自動 reshape(你不需要手動加 channel 維度)
  2. 架構搜尋(NAS):在一個預定義的搜尋空間中,嘗試不同的 CNN 組合——不同的卷積層數、filter 數量、是否加殘差連接、Dropout 比例等
  3. 超參數調校:底層使用 Keras Tuner[6] 的 Bayesian Optimization,不是暴力窮舉,而是根據前幾次嘗試的結果「聰明地」決定下一個要試的組合
  4. 模型選擇:根據驗證集表現,自動挑出 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 + OptunaPyTorch 使用者、研究導向最高中高最高

我的建議是這樣:

  • 剛入門、想感受 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%+ 準確率的模型時,那個「哦~」的感覺,是讀多少篇論文都換不來的。