轉換圖片分類資料集,以便用於 Cloud TPU
本教學課程將說明如何使用圖片分類資料轉換器範例指令碼,將原始圖片分類資料集轉換為用於訓練 Cloud TPU 模型的 TFRecord 格式。
與將每張圖片視為個別檔案讀取相比,TFRecord 可更有效率地從 Cloud Storage 讀取大型檔案。您可以在使用 tf.data.Dataset
管道的任何地方使用 TFRecord。
請參閱下列 TensorFlow 文件,進一步瞭解如何使用 TFRecord:
如果您使用 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
的子類別。這項指令碼會從資料集中擷取資料範例,並將這些資料轉換為 TFRecord。TFRecord 會寫入 data_dir
參數指定的路徑,該路徑是 ImageClassificationBuilder
的 __init__
方法。
在 simple_example.py 中,SimpleDatasetConfig
是 ImageClassificationConfig
的子類別,實作定義支援模式、圖像類別數量的屬性,以及範例產生器,產生字典,其中包含資料集中每個範例的圖像資料和圖像類別。
main()
函式會建立隨機產生的圖片資料資料集,並將 SimpleDatasetConfig
物件例項化,指定類別數量和磁碟上資料集的路徑。接著,main()
會將 SimpleDatasetConfig
例項傳入,並建立 ImageClassificationBuilder
物件。最後,main()
呼叫 download_and_prepare()
。呼叫此方法時,ImageClassificationBuilder
例項會使用 SimpleDatasetConfig
實作的資料範例產生器,載入每個範例並將其儲存為一系列 TFRecord 檔案。
如需更詳細的說明,請參閱分類轉換器 Notebook。
修改資料轉換範例,以便載入資料集
如要將資料集轉換為 TFRecord 格式,請將 ImageClassificationConfig
類別設為子類別,並定義下列屬性:
- num_labels:傳回圖片類別數
- supported_modes:傳回資料集支援的模式清單 (例如:測試、訓練和驗證)
- text_label_map:傳回字典,用於模擬文字類別標籤和整數類別標籤之間的對應關係 (SimpleDatasetConfig 不會使用此屬性,因為不需要對應)
- download_path:下載資料集的路徑 (SimpleDatasetConfig 不會使用此屬性,example_generator 會從磁碟載入資料)
實作 example_generator 產生器函式。這個方法必須產生字典,其中包含每個範例的圖片資料和圖片類別名稱。ImageClassificationBuilder
會使用 example_generator()
函式擷取每個範例,並以 TFRecord 格式寫入磁碟。
執行資料轉換範例
請使用下列指令來建立 Cloud Storage 值區:
gcloud storage buckets create gs://bucket-name --project=your-project-id --location=us-central2
使用
gcloud
指令啟動 Cloud TPU。$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.1-pjrt
使用 SSH 連線至 TPU:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
連線至 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
會決定是否產生原始資料。- 如果是
generate=True
,data_path
是指資料產生的路徑;如果是generate=False
,則是指原始資料的儲存路徑。 num_examples_per_class_low
和num_examples_per_class_high
會決定每個類別要產生的範例數量。指令碼會在這個範圍內隨機產生數個範例。save_dir
是指儲存 TFRecords 的位置。如要在 Cloud TPU 上訓練模型,資料必須儲存在 Cloud Storage 中。可以是 Cloud Storage 或 VM。
重新命名 TFRecords 並將其移至 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
,刪除 VM 資源。$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
執行
gcloud compute tpus tpu-vm list
來驗證是否已刪除 VM。刪除作業可能需要幾分鐘才能完成。如果畫面顯示類似下方的回應,即代表已成功刪除執行個體。$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
執行下列 gcloud CLI 指令,並將 bucket-name 替換為您為本教學課程建立的 Cloud Storage 值區名稱:
$ gcloud storage rm gs://bucket-name --recursive