序言:資料工程師是從傳統軟體工程師向人工智慧方向轉型的最佳切入點之一。資料工程師的職責通常是為人工智慧專案收集和準備高質量的訓練資料集,包括從網際網路上獲取公開資料、或自行採集、清洗、整理資料集。儘管看似簡單,但資料工程師的工作至關重要,因為資料質量直接影響模型的效能,資料準備不當可能導致模型開發失敗。本文接下來的幾個小節將主要講解在谷歌的TensorFlow平臺上如何使用自帶資料集、第三方公開資料集以及自定義的資料集來支援模型訓練。
在本文的前幾節中,我們實際上已經使用了多種資料集來訓練模型,從Keras自帶的Fashion MNIST資料集,到需要下載並預處理的影像資料集如“Horses or Humans”和“Dogs vs. Cats”。我們可能已經意識到,獲取訓練模型的資料有很多不同的方法。
然而,許多公共資料集要求我們在設計模型架構之前,先掌握各種特定領域的技能。TensorFlow Datasets (TFDS)的目標就是簡化資料的獲取方式,使資料更易於使用,因為所有獲取資料的預處理步驟和將資料轉化為TensorFlow友好格式的操作都已為我們準備好。
在第1和第2篇中,我們已經看到了Keras處理Fashion MNIST資料集的這種理念。回顧一下,當時我們只需這樣做就可以獲取資料:
data = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = data.load_data()
TFDS基於這種理念,極大地擴充套件了可用資料集的數量和多樣性。可用資料集的列表正在不斷增長,涵蓋以下類別:
• 音訊:包括語音和音樂資料
• 影像:從“Horses or Humans”這樣的基礎學習資料集到如糖尿病視網膜病變檢測等高階研究資料集
• 目標檢測:包括COCO、Open Images等
• 結構化資料:包括“泰坦尼克號倖存者”、亞馬遜評論等
• 摘要生成:包括CNN和Daily Mail新聞、科學論文、wikiHow等
• 文字:包括IMDb評論、自然語言問題等
• 翻譯:包括各種翻譯訓練資料集
• 影片:包括“Moving MNIST”、“星際爭霸”等
請注意,TensorFlow Datasets是獨立於TensorFlow的安裝包,因此在執行任何示例之前務必先安裝它!如果我們使用的是Google Colab,它已經預裝了。
本章將介紹TFDS及其如何大大簡化訓練過程。我們將探索其底層的TFRecord結構,這一結構可以在不同型別的基礎資料間提供一致性。我們還將瞭解如何使用TFDS的提取-轉換-載入(ETL)模式,以高效地處理大量資料來訓練模型。
開始使用TFDS
讓我們透過一些簡單的例子來看看如何使用TFDS,以展示它如何為我們提供資料的標準介面,不論資料型別如何。
如果你需要安裝它,可以透過以下pip命令完成:
pip install tensorflow-datasets
安裝完成後,你可以透過tfds.load訪問一個資料集,只需傳入所需資料集的名稱。例如,如果你想使用Fashion MNIST資料集,可以使用以下程式碼:
import tensorflow as tf
import tensorflow_datasets as tfds
mnist_data = tfds.load("fashion_mnist")
for item in mnist_data:
print(item)
務必檢查從tfds.load命令返回的資料型別——列印item的輸出將是資料集中本身可用的不同分割。在這個例子中,它是一個包含兩個字串“test”和“train”的字典。這些是可用的分割。
如果你想將這些分割載入到包含實際資料的資料集中,只需在tfds.load命令中指定所需的分割,例如:
mnist_train = tfds.load(name="fashion_mnist", split="train")
assert isinstance(mnist_train, tf.data.Dataset)
print(type(mnist_train))
在這種情況下,你會看到輸出是一個DatasetAdapter,你可以遍歷它來檢查資料。這個介面卡的一個好處是可以直接呼叫take(1)來獲取第一條記錄。讓我們來檢查一下資料的樣子:
for item in mnist_train.take(1):
print(type(item))
print(item.keys())
第一個print的輸出會顯示每條記錄中的item型別是一個字典。當我們列印其鍵時,可以看到在此影像資料集中,型別是“image”和“label”。所以,如果我們想檢查資料集中的某個值,可以這樣做:
for item in mnist_train.take(1):
print(type(item))
print(item.keys())
print(item['image'])
print(item['label'])
你會看到“image”的輸出是一個28 × 28的陣列(在一個tf.Tensor中),取值範圍是0–255,表示畫素強度。“label”會輸出為tf.Tensor(2, shape=(), dtype=int64),指示該影像在資料集中屬於類別2。
在載入資料集時,還可以使用with_info引數來獲取資料集的相關資訊,例如:
mnist_test, info = tfds.load(name="fashion_mnist", with_info=True)
print(info)
列印info會提供資料集內容的詳細資訊。例如,對於Fashion MNIST,你會看到如下輸出:
tfds.core.DatasetInfo(
name='fashion_mnist',
version=3.0.0,
description='Fashion-MNIST是一個包含Zalando商品影像的資料集,包含6萬個訓練樣本和1萬個測試樣本。每個樣本是一個28x28的灰度影像,與10個類別中的某個標籤相關聯。',
homepage='https://github.com/zalandoresearch/fashion-mnist',
features=FeaturesDict({
'image': Image(shape=(28, 28, 1), dtype=tf.uint8),
'label': ClassLabel(shape=(), dtype=tf.int64, num_classes=10),
}),
total_num_examples=70000,
splits={
'test': 10000,
'train': 60000,
},
supervised_keys=('image', 'label'),
citation="""@article{DBLP:journals/corr/abs-1708-07747,
author = {Han Xiao and
Kashif Rasul and
Roland Vollgraf},
title = {Fashion-MNIST: a Novel Image Dataset for Benchmarking Machine Learning Algorithms},
journal = {CoRR},
volume = {abs/1708.07747},
year = {2017},
url = {http://arxiv.org/abs/1708.07747},
archivePrefix = {arXiv},
eprint = {1708.07747},
timestamp = {Mon, 13 Aug 2018 16:47:27 +0200},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1708-07747},
bibsource = {dblp computer science bibliography, https://dblp.org}
""",
redistribution_info=,
)
在這裡,你可以看到資料集的詳細資訊,比如前面演示過的分割和資料集中的特徵,還有額外的資訊如引用、描述和資料集版本。
本節主要為TFDS的使用做了一個入門介紹,接下來的兩章將詳細說明如何在實際場景中使用它。TFDS是TensorFlow Datasets的簡稱。TensorFlow Datasets是一個專門為人工智慧和機器學習模型開發提供支援的庫,內含多種預處理好的資料集,方便使用者直接在TensorFlow中使用,免去了編寫複雜的資料匯入和預處理程式碼的步驟。