您的位置:首頁 > 軟件教程 > 教程 > 構(gòu)建人工智能模型基礎(chǔ):TFDS和Keras的完美搭配

構(gòu)建人工智能模型基礎(chǔ):TFDS和Keras的完美搭配

來源:好特整理 | 時(shí)間:2024-11-05 09:45:50 | 閱讀:122 |  標(biāo)簽: a T 基礎(chǔ) 完美 K S 搭配 智能 人工 人工智能   | 分享到:

上一篇:《數(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

構(gòu)建人工智能模型基礎(chǔ):TFDS和Keras的完美搭配

上一篇:《數(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)定義你想要的切片,如下所示:[ : : ]。它是一種相當(dāng)復(fù)雜的語法,賦予了很大的靈活性。

例如,如果你希望train的前10,000條記錄作為訓(xùn)練數(shù)據(jù),可以省略 ,直接調(diào)用train[:10000](一個(gè)有用的記憶技巧是將前導(dǎo)冒號(hào)讀作“前”,所以這將讀作“train前10,000條記錄”):

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!

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

a 1.0
a 1.0
類型:休閑益智  運(yùn)營狀態(tài):正式運(yùn)營  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對(duì)日常生活中的各種雜亂物
人工智能 1.0.5
人工智能 1.0.5
類型:休閑益智  運(yùn)營狀態(tài):正式運(yùn)營  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

《人工智能》是開發(fā)商FELF開發(fā)的一款A(yù)I休閑益智類游戲,玩家可以和游戲中的AI小姐姐聊天,她不僅能聽懂你

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(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)