TensorFlow 中的 CIFAR-10 圖像分類

?

?

  1. 先決條件:
  2. 圖像分類
  3. 卷積神經網絡,包括基本池化、神經網絡中具有歸一化的卷積層和 dropout。
  4. 數據增強。
  5. 神經網絡。
  6. Numpy 數組。

?

?
在本文中,我們將討論如何使用 TensorFlow 對圖像進行分類。 圖像分類是一種將圖像分類為其各自類別類的方法。CIFAR-10 數據集,正如它所暗示的那樣,其中包含 10 種不同類別的圖像。共有 60000 張圖像,分為 10 個不同的類別,分別命名為飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車。所有圖像的大小均為 32×32。總共有 50000 張 train 圖像和 10000 張測試圖像。

為了構建圖像分類器,我們使用 tensorflow 的 keras API 來構建我們的模型。為了構建模型,建議支持 GPU,或者您也可以使用 Google colab 筆記本。

?

逐步實施:

  • 編寫任何代碼的第一步是導入所有需要的庫和模塊。這包括導入 tensorflow 和其他模塊,如 numpy。如果該模塊不存在,那么您可以在 命令提示符(適用于 Windows)上使用 pip install tensorflow 下載它,或者如果您使用的是 jupyter 筆記本,則只需在單元格中鍵入 !pip install tensorflow 并運行它即可下載該模塊。其他模塊也可以類似地導入。
import tensorflow as tf   

# Display the version
print(tf.__version__)     

# other imports
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten, Dropout
from tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.models import Model

 輸出: 

2.4.1

上述代碼的輸出應顯示您正在使用的 tensorflow 版本,例如 2.4.1 或任何其他版本。

  • 現在我們有了所需的模塊支持,所以讓我們加載我們的數據。CIFAR-10 的數據集可以在 tensorflow keras API 上找到,我們可以使用 tensorflow.keras.datasets.cifar10 在本地機器上下載它,然后使用 load_data() 函數將其分發到訓練和測試集。

    ?

# Load in the data
cifar10 = tf.keras.datasets.cifar10

# Distribute it to train and test set
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)

輸出:

上述代碼的輸出將顯示所有四個分區的形狀,如下所示

?

編輯

在這里,我們可以看到我們有 5000 張訓練圖像和 1000 張測試圖像,如上所述,所有圖像的大小都是 32 x 32 的大小,并且有 3 個顏色通道,即圖像是彩色圖像。此外,還可以看到每個圖像只分配了一個標簽。

  • 到目前為止,我們隨身攜帶著我們的數據。但是,我們仍然無法將其直接發送到我們的神經網絡。我們需要處理數據才能將其發送到網絡。該過程的第一件事是減少像素值。目前,所有圖像像素都在 1-256 的范圍內,我們需要將這些值減少到 0 到 1 之間的值。這使我們的模型能夠輕松跟蹤趨勢和高效訓練。我們只需將所有像素值除以 255.0 即可完成此作。

我們要做的另一件事是使用 flatten() 函數展平(簡單地說,以行的形式重新排列它們)標簽值。

# Reduce pixel values
x_train, x_test = x_train / 255.0, x_test / 255.0

# flatten the label values
y_train, y_test = y_train.flatten(), y_test.flatten()
  • 現在是查看我們數據集的幾張圖片的好時機。我們可以以子圖網格形式可視化它。由于圖像大小僅為 32×32,因此不要對圖像抱有太大期望。那會是個模糊的。我們可以使用 matplotlib 中的 subplot() 函數進行可視化,并循環訪問訓練數據集部分的前 25 張圖像。
# visualize data by plotting images
fig, ax = plt.subplots(5, 5)
k = 0

for i in range(5):
    for j in range(5):
        ax[i][j].imshow(x_train[k], aspect='auto')
        k += 1

plt.show()

輸出: 

?

編輯

雖然圖像不清晰,但有足夠的像素供我們指定這些圖像中存在哪個對象。

  • 完成所有步驟后,現在是構建模型的時候了。我們將使用卷積神經網絡或 CNN 來訓練我們的模型。它包括在此中使用卷積層,即 Conv2d 層以及池化和歸一化方法。最后,我們將它傳遞到一個 dense 層和最后一個 dense 層,即我們的輸出層。我們正在使用 'relu' 激活函數。輸出層使用 “softmax” 函數。
# number of classes
K = len(set(y_train))

# calculate total number of classes 
# for output layer
print("number of classes:", K)

# Build the model using the functional API
# input layer
i = Input(shape=x_train[0].shape)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(i)
x = BatchNormalization()(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)

x = Flatten()(x)
x = Dropout(0.2)(x)

# Hidden layer
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)

# last hidden layer i.e.. output layer
x = Dense(K, activation='softmax')(x)

model = Model(i, x)

# model description
model.summary()

輸出: 

?

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1