使用 TensorFlow 進行影象分類:開發資料管道(第1部分)

介紹

在本文中,我們將討論使用 Tensorflow 進行二進位制影象分類,我們將使用 TensorFlow 資料集(TensorFlow 社群提供給我們的資料管道)。

本文分為兩個部分作為一個完整的指南,每個部分都足以讓你理解其中提到的概念,遵循這兩個部分並沒有壓力。

第1部分

討論資料管道和模型訓練

第2部分

將在第 1 部分之後進行選擇,並在流資料上使用正則化和資料增強來克服過度擬合。

目錄

資料管道

提取、轉換、載入 (ETL)

Tensorflow 資料集

Horses-or-Human 資料集

資料管道

這個術語僅意味著在原始輸入資料和我們從中得到的輸出資料之間包含了一系列步驟/操作。如果我打算在使用資料之前對其進行一些預處理,則可以在應用預處理後使用資料管道來獲取資料。

更明確地說,將資料管道視為一種自動化機制,以避免手動固定的預處理步驟,並讓資料透過資料管道中定義的步驟自動轉換。

提取、轉換、載入 (ETL)

儘管涉及更多複雜性,但這個高階詞彙組合已經告訴我們資料管道的功能。作為初學者,瞭解就足夠了。

提取

意味著從資料來源中檢索資料。

轉換

意味著應用特定資料管道中涉及的所有步驟,並將該資料轉換為你需要的資料。

載入

意味著從轉換中獲取輸出資料並將該資料用於模型以開始訓練或推理。

TensorFlow 資料集

這是 TensorFlow 社群為我們提供的資料管道的名稱,我們可以在我們的 TensorFlow 程式碼中使用它,並製作更強大和生產就緒的機器學習或深度學習模型。

Horses-or-Human 資料集

這是我們將在程式碼中使用的資料集。該資料集由 Laurence Moroney 建立,包含分佈在兩個類(馬和人類)之間的 300×300 影象。在此處瞭解有關資料的更多資訊:http://www。laurencemoroney。com/horses-or-humans-dataset/

讓我們編碼

你需要首先使用以下命令將 tensorflow 資料集安裝為一個包:

!pip install tensorflow-datasets

然後匯入所有需要的庫

import numpy as np

import matplotlib。pyplot as plt

import tensorflow as tf

import tensorflow_datasets as tfds

提取階段

如上所述,這裡我們將從 tensorflow 資料集伺服器中提取資料並檢視有關它的一些資訊。

train_dataset,info = tfds。load(‘horses_or_humans’, with_info = True, split=‘train’, as_supervised=True)

val_dataset,val_info = tfds。load(“horses_or_humans”, with_info=True, split=‘test’, as_supervised=True)

‘info’ 和 ‘val_info’ 都以下面提到的格式給出相同的資訊,因為它們都指向同一個資料集,train_dataset 和 val_dataset 中的影象數量在“split”鍵下分別提取為 train 和 test。

注意:

train_dataset 和 val_dataset 是

tf.data.Dataset

物件

print(info)

使用 TensorFlow 進行影象分類:開發資料管道(第1部分)

透過 TensorFlow Datasets 將已經拆分的資料放入訓練集和測試集就是這麼簡單。

轉換階段

現在讓我們進入

轉換階段

,在此我們應用預處理步驟來更改結果資料。在我們的例子中,我們只對訓練資料進行打亂和批處理,只對驗證資料進行批處理。

train_dataset = train_dataset。shuffle(100)。batch(32)

val_dataset = val_dataset。batch(32)

在這裡,我應用了函式連結來在一行中獲得最終輸出(shuffle() 之後的batch())。

shuffle(BUFFER_SIZE)

是一個對資料進行打亂的函式,其中 BUFFER_SIZE 表示可用於打亂的空間,更多的空間可以進行更好的打亂,反之亦然。

batch(batch_size)

是一個函式,將資料子集分成大小為->batch_size 的批次;對於單個訓練步驟,並透過小批次梯度下降改進學習。

model = tf。keras。models。Sequential([

tf。keras。layers。Conv2D(filters=8, kernel_size = 3, input_shape = [300,300,3], activation=‘relu’),

tf。keras。layers。MaxPooling2D(),

tf。keras。layers。Conv2D(filters = 16, kernel_size = 3, activation = ‘relu’),

tf。keras。layers。MaxPooling2D(),

tf。keras。layers。Conv2D(filters = 32, kernel_size = 3, activation = ‘relu’),

tf。keras。layers。MaxPooling2D(),

tf。keras。layers。Flatten(),

tf。keras。layers。Dense(units=64, activation = ‘relu’),

tf。keras。layers。Dense(units = 2, activation=‘softmax’)

])

model。summary()

使用 TensorFlow 進行影象分類:開發資料管道(第1部分)

轉換後的最後一步是使用資料載入階段。讓我們像在任何其他模型中一樣載入資料,並在 train_dataset 上簡單地訓練我們的卷積神經網路。

model。compile(loss=‘sparse_categorical_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])

history = model。fit(train_dataset, epochs=8, validation_data=val_dataset)

在這裡,我保持較小的訓練,因為它已經給出了

100% 的訓練準確度

82% 的驗證準確度

,這有過度擬合的痕跡。讓我們檢查這個想法。

損失圖

plt。figure(figsize=(8, 4))

plt。plot(range(8), history。history[‘loss’], ‘r’, label=‘training loss’)

plt。plot(range(8), history。history[‘val_loss’], ‘b’, label=‘validation Loss’)

plt。legend()

plt。xlabel(‘Number of Epochs’)

plt。ylabel(“Loss”)

plt。show()

使用 TensorFlow 進行影象分類:開發資料管道(第1部分)

精度圖

plt。figure(figsize=(8, 4))

plt。plot(range(8), history。history[‘accuracy’], ‘r’, label=‘training accuracy’)

plt。plot(range(8), history。history[‘val_accuracy’], ‘b’, label=‘validation accuracy’)

plt。legend()

plt。xlabel(‘Number of Epochs’)

plt。ylabel(“Accuracy”)

plt。show()

使用 TensorFlow 進行影象分類:開發資料管道(第1部分)

兩個圖中訓練和驗證資料線之間的差距表示過度擬合,因此驗證了我們的疑問。

過擬合可以透過各種方法去除。

(一些著名的是資料增強,使用正則化等)。

☆ END ☆

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「uncle_pn」,歡迎新增小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。