使用 Hugging Face Transformers 微調 Vision Transformer (ViT) 以進行圖像分類

概述

Hugging Face 詳細說明了微調 Vision Transformer (ViT) 以進行圖像分類任務的工作流程。透過將圖像補丁 (patches) 視為標記 (tokens)——就像在自然語言處理 (NLP) 中處理單詞一樣——ViT 允許將基於 transformer 的架構應用於電腦視覺。此過程涉及將圖像分割成子圖像補丁的網格,使用線性投影對每個補丁進行嵌入 (embedding),然後將生成的標記序列傳遞給 transformer 模型。

使用 ViTImageProcessor 進行圖像預處理

正確的圖像轉換對於 ViT 模型性能至關重要,因為模型預期輸入遵循其原始訓練期間使用的特定歸一化和調整大小的參數。

為了確保一致性,使用 ViTImageProcessor 從預訓練模型(例如 google/vit-base-patch16-224-in21k)加載配置。該處理器處理以下操作:

  • 調整大小 (Resizing):將圖像調整為標準尺寸(例如,224x224 像素)。
  • 歸一化 (Normalization):對像素數據應用特定的平均值和標準差值。
  • 重採樣 (Resampling):確保圖像為模型正確採樣。

透過此工具處理圖像會返回一個包含 pixel_values 的字典,這是模型所需的數值張量表示。

使用 Transforms 進行高效的數據集處理

在處理圖像數據集時,透過 ds.map 對每個樣本應用轉換可能會在計算上非常昂貴且緩慢。相反,Hugging Face 建議使用 datasets 庫中的 with_transform 方法。

轉換是在索引樣本時即時進行的,而不是預處理整個數據集。這種方法需要一個轉換函數,該函數可以處理數據批次,將 PIL 圖像列表轉換為必要的 pixel_values 張量,同時保留相關的標籤。

微調流水線與配置

微調 ViT 模型涉及幾個關鍵組件,以確保模型收斂並正確評估:

數據整理 (Data Collation) 與指標

由於批次是以字典列表的形式交付的,因此需要自定義的 collate_fnpixel_valueslabels 堆疊成 torch 張量。對於評估,通常使用 evaluate 庫中的 accuracy 指標來比較模型的預測類別(透過 np.argmax 作用於預測結果)與真實標籤。

模型初始化

為了使預訓練的 ViT 適應特定任務,使用 ViTForImageClassification。模型使用 num_labels 進行初始化,以創建具有正確輸出單元數量的分類頭。此外,還提供了 id2labellabel2id 映射,以確保模型在 Hugging Face Hub 上託管時,其輸出是人類可讀的。

訓練參數 (Training Arguments)

TrainingArguments 中的關鍵配置包括:

  • remove_unused_columns=False:這點至關重要。預設情況下,trainer 會刪除模型前向傳播中未使用的列。然而,由於轉換函數需要 image 列來創建 pixel_values,因此必須保留它。
  • fp16=True:啟用混合精度訓練以減少內存使用量並加快訓練速度。
  • evaluation_strategy="settings":允許在訓練過程中進行定期評估。

性能結果

在提供的使用 beans 數據集的示例中(該數據集將健康的豆葉與不健康的豆葉進行分類),微調後的 ViT 模型在經過 4 個 epoch 的訓練後,達到了 0.985 的評估準確率和 0.0637 的評估損失。

Sources

相關