轉換圖片分類資料集,以便用於 Cloud TPU
本教學課程說明如何使用圖片分類資料轉換器範例指令碼,將原始圖片分類資料集轉換為 TFRecord 格式,用於訓練 Cloud TPU 模型。
TFRecord 可提高從 Cloud Storage 讀取大型檔案的效率,不必將每張圖片視為個別檔案讀取。您可以在使用 tf.data.Dataset 管道的任何位置使用 TFRecord。
如要進一步瞭解如何使用 TFRecord,請參閱下列 TensorFlow 文件:
如果您使用 PyTorch 或 JAX 架構,且未將 Cloud Storage 用於資料集儲存,可能無法從 TFRecord 獲得相同優勢。
轉換總覽
GitHub 上資料轉換器存放區中的圖片分類資料夾包含 converter 指令碼、image_classification_data.py 和範例實作 simple_example.py,您可以複製及修改這些內容,自行轉換資料。
圖像分類資料轉換器範例定義了兩個類別:ImageClassificationConfig 和 ImageClassificationBuilder。這些類別定義於 tpu/tools/data_converter/image_classification_data.py 中。
ImageClassificationConfig 是抽象基礎類別。您會將 ImageClassificationConfig 設為子類別,定義例項化 ImageClassificationBuilder 所需的設定。
ImageClassificationBuilder 是圖片分類資料集的 TensorFlow 資料集建構工具。這是 tdfs.core.GeneratorBasedBuilder 的子類別。這項工具會從資料集擷取資料範例,並轉換為 TFRecords。TFRecord 會寫入 ImageClassificationBuilder 的 __init__ 方法的 data_dir 參數所指定的路徑。
在 simple_example.py 中,SimpleDatasetConfig 子類別會實作 ImageClassificationConfig,定義支援的模式、圖片類別數量,以及產生器範例,該產生器會產生字典,其中包含資料集中每個範例的圖片資料和圖片類別。
main() 函式會建立隨機產生的圖片資料集,並例項化 SimpleDatasetConfig 物件,指定類別數量和磁碟上資料集的路徑。接著,main() 會例項化 ImageClassificationBuilder 物件,並傳入 SimpleDatasetConfig 例項。最後,main() 會呼叫 download_and_prepare()。呼叫這個方法時,ImageClassificationBuilder 例項會使用 SimpleDatasetConfig 實作的資料範例產生器載入每個範例,並將其儲存至一系列 TFRecord 檔案。
如需更詳細的說明,請參閱分類轉換器筆記本。
修改資料轉換範例,載入資料集
如要將資料集轉換為 TFRecord 格式,請將 ImageClassificationConfig 子類別定義為下列屬性:
num_labels:傳回圖片類別數量supported_modes:傳回資料集支援的模式清單 (例如:測試、訓練和驗證)text_label_map:傳回字典,模擬文字類別標籤和整數類別標籤之間的對應關係 (SimpleDatasetConfig不會使用這項屬性,因為不需要對應關係)download_path:下載資料集的路徑 (SimpleDatasetConfig不會使用這項屬性,example_generator()會從磁碟載入資料)
實作 example_generator() 產生器函式。這個方法必須產生字典,其中包含每個範例的圖片資料和圖片類別名稱。ImageClassificationBuilder 會使用 example_generator() 函式擷取每個範例,並以 TFRecord 格式寫入磁碟。
執行資料轉換範例
使用下列指令建立 Cloud Storage bucket:
gcloud storage buckets create gs://BUCKET_NAME --project=PROJECT_ID --location=LOCATION
更改下列內容:
- BUCKET_NAME:bucket 的名稱。
- PROJECT_ID:專案 ID。
- LOCATION:要建立 bucket 的位置。例如:
US-CENTRAL1。
使用
gcloud compute instances create指令建立 Cloud TPU。$ gcloud compute instances create TPU_NAME \ --machine-type=MACHINE_TYPE \ --zone=ZONE \ --image-family=IMAGE_FAMILY \ --image-project=IMAGE_PROJECT \ --maintenance-policy=TERMINATE
更改下列內容:
- TPU_NAME:TPU 的名稱。
- MACHINE_TYPE:TPU VM 要使用的機型。詳情請參閱「TPU 機器類型」一節。
- ZONE:要建立 TPU 的區域。
- IMAGE_FAMILY:您要使用的 OS 映像檔系列。系統會使用與該系列相關聯的最新未淘汰映像檔。如要指定特定映像檔,請將
--image-family標記替換為--image標記,並將值設為支援的 OS 映像檔。如需支援的作業系統清單,請參閱「TPU OS 映像檔」。 - IMAGE_PROJECT:OS 映像檔的專案 ID。如需與各個公開映像檔相關聯的專案 ID 清單,請參閱「TPU OS 映像檔」。
使用 SSH 連線至 TPU:
$ gcloud compute ssh TPU_NAME --zone=ZONE
連線至 TPU 時,殼層提示會從
username@projectname變更為username@vm-name。安裝必要套件。
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
建立指令碼使用的下列環境變數。
(vm)$ export STORAGE_BUCKET=gs://BUCKET_NAME (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
下載 TensorFlow TPU 存放區。
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
在虛假資料集上執行資料轉換器
simple_example.py 指令碼位於資料轉換器範例的 image_classification 資料夾中。使用下列參數執行指令碼,即可產生一組偽造圖片,並將其轉換為 TFRecord。
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
對其中一個原始資料集執行資料轉換器
為原始資料的位置建立環境變數。
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
執行
simple_example.py指令碼。(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
simple_example.py 指令碼會採用下列參數:
num_classes是指資料集中的類別數量。我們在此使用 1000 來比對 ImageNet 格式。generate決定是否要產生原始資料。data_path是指資料產生路徑 (如果為generate=True),或是原始資料儲存路徑 (如果為generate=False)。num_examples_per_class_low和num_examples_per_class_high會決定每個類別要生成多少範例。指令碼會在這個範圍內產生隨機數量的範例。save_dir是指儲存 TFRecords 的位置。如要在 Cloud TPU 上訓練模型,資料必須儲存在 Cloud Storage。可以是 Cloud Storage 或 VM 上的檔案。
將 TFRecord 重新命名並移至 Cloud Storage
以下範例使用 ResNet 模型搭配轉換後的資料。
將 TFRecord 重新命名為與 ImageNet TFRecord 相同的格式:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt update (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
將 TFRecord 複製到 Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
清除所用資源
如果您尚未中斷與 Cloud TPU 的連線,請中斷連線:
(vm)$ exit
系統現在顯示的提示訊息應為
user@projectname,代表您位於 Cloud Shell。在 Cloud Shell 中執行
gcloud compute instances delete指令,刪除 TPU VM。$ gcloud compute instances delete TPU_NAME \ --zone=ZONE
執行
gcloud compute instances list指令,確認 VM 已刪除。刪除作業可能需要幾分鐘才能完成。$ gcloud compute instances list --zone=ZONE
執行下列指令刪除 bucket,並將 BUCKET_NAME 替換為您為本教學課程建立的 bucket 名稱:
$ gcloud storage rm gs://BUCKET_NAME --recursive