上一篇:《數(shù)據(jù)工程師,轉(zhuǎn)型人工智能崗位的理想時(shí)空通道》 序言:本節(jié)將帶您深入探索 TensorFlow 提供的關(guān)鍵工具和方法,涵蓋數(shù)據(jù)集管理和神經(jīng)網(wǎng)絡(luò)模型的構(gòu)建與訓(xùn)練。在現(xiàn)代人工智能框架中,TensorFlow 的數(shù)據(jù)集接口 (TensorFlow Datasets, 簡稱 TFDS) 與 Kera
上一篇:《數(shù)據(jù)工程師,轉(zhuǎn)型人工智能崗位的理想時(shí)空通道》
序言: 本節(jié)將帶您深入探索 TensorFlow 提供的關(guān)鍵工具和方法,涵蓋數(shù)據(jù)集管理和神經(jīng)網(wǎng)絡(luò)模型的構(gòu)建與訓(xùn)練。在現(xiàn)代人工智能框架中,TensorFlow 的數(shù)據(jù)集接口 (TensorFlow Datasets, 簡稱 TFDS) 與 Keras 模型庫為深度學(xué)習(xí)任務(wù)提供了極大的便利。本章將具體展示如何使用 TFDS 和 Keras 配合構(gòu)建神經(jīng)網(wǎng)絡(luò)架構(gòu),以實(shí)現(xiàn)高效的數(shù)據(jù)處理和模型訓(xùn)練。通過本節(jié)的實(shí)踐操作,您將掌握從數(shù)據(jù)加載、預(yù)處理到模型搭建的核心流程,為進(jìn)一步的人工智能模型研發(fā)奠定堅(jiān)實(shí)的基礎(chǔ)。
使用TFDS與Keras模型
在上一節(jié)中,我們學(xué)到了如何使用TensorFlow和Keras創(chuàng)建一個(gè)簡單的計(jì)算機(jī)視覺模型,使用Keras內(nèi)置的數(shù)據(jù)集(包括Fashion MNIST),代碼如下所示:
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
使用TFDS時(shí),代碼非常相似,但有一些小的變化。Keras的數(shù)據(jù)集直接給我們返回了可以在model.fit中原生使用的ndarray類型,但使用TFDS時(shí),我們需要進(jìn)行一些轉(zhuǎn)換:
(training_images, training_labels), (test_images, test_labels) = tfds.as_numpy(tfds.load('fashion_mnist', split=['train', 'test'], batch_size=-1, as_supervised=True))
在這里,我們使用了tfds.load,將fashion_mnist作為所需的數(shù)據(jù)集傳遞給它。我們知道這個(gè)數(shù)據(jù)集有訓(xùn)練集和測試集的劃分,所以在數(shù)組中傳入這些劃分項(xiàng)將返回包含圖像和標(biāo)簽的適配器數(shù)組。使用tfds.as_numpy在調(diào)用tfds.load時(shí)會(huì)將數(shù)據(jù)返回為Numpy數(shù)組。指定batch_size=-1會(huì)讓我們獲取所有數(shù)據(jù),而as_supervised=True則確保返回的格式為(輸入,標(biāo)簽)元組。
完成這些操作后,我們基本上獲得了與Keras數(shù)據(jù)集相同的數(shù)據(jù)格式,但有一個(gè)區(qū)別——在TFDS中,數(shù)據(jù)的形狀是(28, 28, 1),而在Keras數(shù)據(jù)集中是(28, 28)。
這意味著代碼需要做一些小的改動(dòng)來指定輸入數(shù)據(jù)的形狀為(28, 28, 1),而不是(28, 28):
import tensorflow as tf
import tensorflow_datasets as tfds
(training_images, training_labels), (test_images, test_labels) = tfds.as_numpy(tfds.load('fashion_mnist', split=['train', 'test'], batch_size=-1, as_supervised=True))
training_images = training_images / 255.0
test_images = test_images / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28, 1)),
tf.keras.layers.Dense(128, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(training_images, training_labels, epochs=5)
對(duì)于更復(fù)雜的示例,可以參考第3章中使用的“馬或人”數(shù)據(jù)集,這個(gè)數(shù)據(jù)集在TFDS中也可以使用。以下是使用它來訓(xùn)練模型的完整代碼:
import tensorflow as tf
import tensorflow_datasets as tfds
data = tfds.load('horses_or_humans', split='train', as_supervised=True)
train_batches = data.shuffle(100).batch(10)
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(train_batches, epochs=10)
正如你所見,這相當(dāng)直接:只需調(diào)用 tfds.load,傳入你想要的分割(在本例中是訓(xùn)練集),然后在模型中使用它。數(shù)據(jù)被批處理并打亂順序,以便更有效地進(jìn)行訓(xùn)練。
“Horses or Humans”數(shù)據(jù)集被劃分為訓(xùn)練集和測試集,因此如果你想在訓(xùn)練時(shí)驗(yàn)證模型,可以通過TFDS加載單獨(dú)的驗(yàn)證集,方法如下:
val_data = tfds.load('horses_or_humans', split='test', as_supervised=True)
你需要像處理訓(xùn)練集一樣批處理它。例如:
validation_batches = val_data.batch(32)
然后在訓(xùn)練時(shí),指定這些批次作為驗(yàn)證數(shù)據(jù)。你還需要顯式設(shè)置每個(gè)周期要使用的驗(yàn)證步數(shù),否則TensorFlow會(huì)報(bào)錯(cuò)。如果不確定,設(shè)置為1即可,如下:
history = model.fit(train_batches, epochs=10, validation_data=validation_batches, validation_steps=1)
加載特定版本
所有在TFDS中存儲(chǔ)的數(shù)據(jù)集都使用MAJOR.MINOR.PATCH編號(hào)系統(tǒng)。其保證如下:如果僅PATCH更新,則調(diào)用返回的數(shù)據(jù)相同,但底層組織可能發(fā)生變化。這種變化對(duì)開發(fā)者應(yīng)是無感知的。如果MINOR更新,則數(shù)據(jù)保持不變,但可能會(huì)在每條記錄中增加新的特性(非破壞性更改)。此外,對(duì)特定切片(參見第74頁的“使用自定義切片”)的數(shù)據(jù)不會(huì)重新排序。如果MAJOR更新,則記錄格式及其位置可能會(huì)發(fā)生變化,因此特定切片可能會(huì)返回不同的值。
在檢查數(shù)據(jù)集時(shí),你會(huì)看到何時(shí)有不同版本可用——例如,cnn_dailymail數(shù)據(jù)集就是這樣。如果你不想要默認(rèn)版本(本文撰寫時(shí)是3.0.0),而是希望使用早期版本,例如1.0.0,可以按以下方式加載:
data, info = tfds.load("cnn_dailymail:1.0.0", with_info=True)
請(qǐng)注意,如果你在Colab上使用TFDS,建議檢查Colab使用的TFDS版本。本文撰寫時(shí),Colab預(yù)裝的TFDS是2.0版,但其中存在一些加載數(shù)據(jù)集的bug(包括cnn_dailymail數(shù)據(jù)集),這些問題在TFDS 2.1及之后的版本中已修復(fù),因此建議使用這些版本,或者至少在Colab中安裝它們,而不是依賴內(nèi)置的默認(rèn)版本。
使用映射函數(shù)進(jìn)行數(shù)據(jù)增強(qiáng)
在前面的章節(jié)中,你見到了使用ImageDataGenerator為模型提供訓(xùn)練數(shù)據(jù)時(shí)的一些有用增強(qiáng)工具。你可能想知道如何在使用TFDS時(shí)實(shí)現(xiàn)同樣的功能,因?yàn)檫@時(shí)你不是從子目錄流式讀取圖像。實(shí)現(xiàn)此功能的最佳方法(或任何其他形式的轉(zhuǎn)換)是對(duì)數(shù)據(jù)適配器使用映射函數(shù)。讓我們看看如何實(shí)現(xiàn)這一點(diǎn)。
之前,我們對(duì)Horses or Humans數(shù)據(jù)集的處理只是從TFDS中加載數(shù)據(jù)并為其創(chuàng)建批次,如下所示:
data = tfds.load('horses_or_humans', split='train', as_supervised=True)
train_batches = data.shuffle(100).batch(10)
要對(duì)數(shù)據(jù)進(jìn)行變換并將其映射到數(shù)據(jù)集,你可以創(chuàng)建一個(gè)映射函數(shù)。這只是標(biāo)準(zhǔn)的Python代碼。例如,假設(shè)你創(chuàng)建了一個(gè)名為augmentimages的函數(shù),并讓它進(jìn)行一些圖像增強(qiáng),如下所示:
def augmentimages(image, label):
image = tf.cast(image, tf.float32)
image = (image/255)
image = tf.image.random_flip_left_right(image)
return image, label
然后你可以將其映射到數(shù)據(jù)上,創(chuàng)建一個(gè)名為train的新數(shù)據(jù)集:
train = data.map(augmentimages)
之后,在創(chuàng)建批次時(shí),使用train而不是data,如下:
train_batches = train.shuffle(100).batch(32)
在augmentimages函數(shù)中,你可以看到使用tf.image.random_flip_left_right(image)對(duì)圖像進(jìn)行左右隨機(jī)翻轉(zhuǎn)。tf.image庫中有很多可用于增強(qiáng)的函數(shù);詳細(xì)內(nèi)容請(qǐng)參閱文檔。
使用TensorFlow Addons
TensorFlow Addons庫包含更多可用函數(shù)。ImageDataGenerator增強(qiáng)中的一些功能(如旋轉(zhuǎn))僅在此庫中可用,因此建議查看它。
使用TensorFlow Addons非常簡單——只需安裝庫即可:
pip install tensorflow-addons
安裝完成后,可以將Addons混入到你的映射函數(shù)中。以下是將旋轉(zhuǎn)Addons用于前面映射函數(shù)的示例:
import tensorflow_addons as tfa
def augmentimages(image, label):
image = tf.cast(image, tf.float32)
image = (image/255)
image = tf.image.random_flip_left_right(image)
image = tfa.image.rotate(image, 40, interpolation='NEAREST')
return image, label
使用自定義分割
到目前為止,你一直使用的是預(yù)先分割為訓(xùn)練集和測試集的數(shù)據(jù)集。例如,F(xiàn)ashion MNIST有60,000和10,000條記錄,分別用于訓(xùn)練和測試。但如果你不想使用這些分割呢?如果你想根據(jù)自己的需求分割數(shù)據(jù)呢?TFDS的一個(gè)強(qiáng)大之處就在于——它提供了一個(gè)API,允許你精細(xì)地控制數(shù)據(jù)的分割方式。
實(shí)際上你已經(jīng)見過這種方式了,例如像這樣加載數(shù)據(jù)時(shí):
data = tfds.load('cats_vs_dogs', split='train', as_supervised=True)
注意split參數(shù)是一個(gè)字符串,這里你請(qǐng)求了train分割,它恰好是整個(gè)數(shù)據(jù)集。如果你熟悉Python的切片符號(hào),也可以使用它。這種符號(hào)可以總結(jié)為在方括號(hào)內(nèi)定義你想要的切片,如下所示:[
例如,如果你希望train的前10,000條記錄作為訓(xùn)練數(shù)據(jù),可以省略
data = tfds.load('cats_vs_dogs', split='train[:10000]', as_supervised=True)
你還可以使用%來指定分割。例如,如果你希望前20%的記錄用于訓(xùn)練,可以像這樣使用:20%:
data = tfds.load('cats_vs_dogs', split='train[:20%]', as_supervised=True)
你甚至可以更進(jìn)一步,組合多個(gè)分割。也就是說,如果你希望訓(xùn)練數(shù)據(jù)是前1000條記錄和最后1000條記錄的組合,可以這樣做(-1000:表示“最后1000條記錄”,“:1000”表示“前1000條記錄”):
data = tfds.load('cats_vs_dogs', split='train[-1000:]+train[:1000]', as_supervised=True)
Dogs vs. Cats數(shù)據(jù)集沒有固定的訓(xùn)練、測試和驗(yàn)證分割,但使用TFDS,創(chuàng)建自定義分割非常簡單。假設(shè)你希望分割為80%、10%、10%?梢赃@樣創(chuàng)建三個(gè)數(shù)據(jù)集:
train_data = tfds.load('cats_vs_dogs', split='train[:80%]', as_supervised=True)
validation_data = tfds.load('cats_vs_dogs', split='train[80%:90%]', as_supervised=True)
test_data = tfds.load('cats_vs_dogs', split='train[-10%:]', as_supervised=True)
一旦你有了它們,就可以像使用任何命名分割一樣使用它們。
需要注意的是,由于返回的數(shù)據(jù)集無法被探測其長度,因此通常很難確認(rèn)你是否正確地分割了原始數(shù)據(jù)集。要查看你在某個(gè)分割中的記錄數(shù)量,你必須遍歷整個(gè)數(shù)據(jù)集并一條條計(jì)數(shù)。以下是對(duì)你剛創(chuàng)建的訓(xùn)練集進(jìn)行計(jì)數(shù)的代碼:
train_length = [i for i, _ in enumerate(train_data)][-1] + 1
print(train_length)
這可能是一個(gè)較慢的過程,因此請(qǐng)確保僅在調(diào)試時(shí)使用它。
本節(jié)總結(jié): 本章介紹了如何使用 TensorFlow Datasets(TFDS)和 Keras 搭建神經(jīng)網(wǎng)絡(luò)模型,并探索了數(shù)據(jù)增強(qiáng)、分割和預(yù)處理等關(guān)鍵操作。通過將 TFDS 數(shù)據(jù)集與 Keras 模型結(jié)合,您學(xué)會(huì)了如何高效加載和轉(zhuǎn)換數(shù)據(jù),為神經(jīng)網(wǎng)絡(luò)模型的構(gòu)建和訓(xùn)練做好準(zhǔn)備。此外,我們還介紹了如何靈活地自定義數(shù)據(jù)分割和應(yīng)用數(shù)據(jù)增強(qiáng),為模型提供更加多樣化的訓(xùn)練數(shù)據(jù)。掌握了這些技能后,您將能夠更自如地應(yīng)用 TensorFlow 和 Keras 進(jìn)行各種深度學(xué)習(xí)項(xiàng)目的開發(fā),為復(fù)雜模型的搭建奠定堅(jiān)實(shí)的基礎(chǔ)。下一節(jié)我們將會(huì)為大家介紹從TFDS中下載出來的數(shù)據(jù)集是以什么形式保存下來的—TFRecord!
園子會(huì)員福利:華為云服務(wù)器一年免費(fèi)領(lǐng)取
閱讀構(gòu)建人工智能模型基礎(chǔ):TFDS和Keras的完美搭配
閱讀創(chuàng)建鴻蒙應(yīng)用的橫屏顯示直尺應(yīng)用全程解析
閱讀WiFi基礎(chǔ)(七):WiFi漫游與WiFi組網(wǎng)
閱讀遷移學(xué)習(xí):人工智能模型訓(xùn)練的絕學(xué)
閱讀如何使用 Pytorch 中的 DataSet 和 DataLoader
閱讀golang slice相關(guān)常見的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國產(chǎn)操作系統(tǒng)上實(shí)現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時(shí)相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計(jì)與RuoYi系統(tǒng)的借鑒
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)