第二周:彩色圖片分類

一、環(huán)境配置

python3.6.13,TensorFlow2.4.0-gpu,cuda 11.0,cudnn8.0.5

二、前期準(zhǔn)備

1.設(shè)置GPU

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
if gpus:
    gpu0 = gpus[0] #如果有多個(gè)GPU,僅使用第0個(gè)GPU
    tf.config.experimental.set_memory_growth(gpu0, True) #設(shè)置GPU顯存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")

2.導(dǎo)入數(shù)據(jù)

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
# 導(dǎo)入cifar10數(shù)據(jù),依次分別為訓(xùn)練集圖片、訓(xùn)練集標(biāo)簽、測試集圖片、測試集標(biāo)簽
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

3.歸一化

將像素的值標(biāo)準(zhǔn)化至0到1的區(qū)間內(nèi)。

train_images, test_images = train_images / 255.0, test_images / 255.0
print(train_images.shape,test_images.shape,train_labels.shape,test_labels.shape)
"""
(50000, 32, 32, 3) (10000, 32, 32, 3) (50000, 1) (10000, 1)
"""

4.可視化圖片

# 10個(gè)類別
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer','dog', 'frog', 'horse', 'ship', 'truck']
# 進(jìn)行圖像大小為20寬、10長的繪圖(單位為英寸inch)
plt.figure(figsize=(20,10))
for i in range(20):
    # 將整個(gè)figure分成2行10列,繪制第i+1個(gè)子圖。
    plt.subplot(2,10,i+1)
    # 設(shè)置不顯示x軸刻度
    plt.xticks([])
    # 設(shè)置不顯示y軸刻度
    plt.yticks([])
    # 設(shè)置不顯示子圖網(wǎng)格線
    plt.grid(False)
    # 將數(shù)組的值以圖片的形式展示出來,cmap參數(shù)用于設(shè)置顏色圖譜,"plt.cm.binary"為matplotlib.cm中的色表(具體內(nèi)容可網(wǎng)上搜索)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    # 設(shè)置x軸標(biāo)簽顯示為圖片對應(yīng)的標(biāo)簽
    plt.xlabel(train_labels[i])
# 顯示圖片
plt.show()
myplot.png

二、構(gòu)建CNN網(wǎng)絡(luò)模型

#構(gòu)建3層卷積2層池化1層全連接層
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),  # 卷積層1,卷積核3*3 輸入寬高32,通道3為彩色圖片
    layers.MaxPooling2D((2, 2)),  # 池化層1,2*2采樣
    layers.Conv2D(64, (3, 3), activation='relu'),  # 卷積層2,卷積核3*3
    layers.MaxPooling2D((2, 2)),  # 池化層2,2*2采樣
    layers.Conv2D(64, (3, 3), activation='relu'),  # 卷積層3,卷積核3*3

    layers.Flatten(),  # Flatten層,連接卷積層與全連接層
    layers.Dense(64, activation='relu'),  # 全連接層,特征進(jìn)一步提取
    layers.Dense(10)  # 輸出層,輸出預(yù)期結(jié)果
])

model.summary()  # 打印網(wǎng)絡(luò)結(jié)構(gòu)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 30, 30, 32)        896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 13, 13, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 4, 4, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
dense (Dense)                (None, 64)                65600     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 122,570
Trainable params: 122,570
Non-trainable params: 0
_________________________________________________________________

三、編譯模型

"""
這里設(shè)置優(yōu)化器、損失函數(shù)以及metrics
"""
# model.compile()方法用于在配置訓(xùn)練方法時(shí),告知訓(xùn)練時(shí)用的優(yōu)化器、損失函數(shù)和準(zhǔn)確率評測標(biāo)準(zhǔn)
model.compile(
    # 設(shè)置優(yōu)化器為Adam優(yōu)化器
    optimizer='adam',
    # 設(shè)置損失函數(shù)為交叉熵?fù)p失函數(shù)(tf.keras.losses.SparseCategoricalCrossentropy())
    # from_logits為True時(shí),會將y_pred轉(zhuǎn)化為概率(用softmax),否則不進(jìn)行轉(zhuǎn)換,通常情況下用True結(jié)果更穩(wěn)定
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    # 設(shè)置性能指標(biāo)列表,將在模型訓(xùn)練時(shí)監(jiān)控列表中的指標(biāo)
    metrics=['accuracy'])

四、訓(xùn)練模型

"""
這里設(shè)置輸入訓(xùn)練數(shù)據(jù)集(圖片及標(biāo)簽)、驗(yàn)證數(shù)據(jù)集(圖片及標(biāo)簽)以及迭代次數(shù)epochs
"""
history = model.fit(
    # 輸入訓(xùn)練集圖片
    train_images, 
    # 輸入訓(xùn)練集標(biāo)簽
    train_labels, 
    # 設(shè)置10個(gè)epoch,每一個(gè)epoch都將會把所有的數(shù)據(jù)輸入模型完成一次訓(xùn)練。
    epochs=10, 
    # 設(shè)置驗(yàn)證集
    validation_data=(test_images, test_labels))
"""
訓(xùn)練了10個(gè)epoch 最后精度達(dá)到0.7103
"""
Epoch 1/10
1563/1563 [==============================] - 8s 4ms/step - loss: 1.7340 - accuracy: 0.3617 - val_loss: 1.2603 - val_accuracy: 0.5387
Epoch 2/10
1563/1563 [==============================] - 5s 3ms/step - loss: 1.1849 - accuracy: 0.5786 - val_loss: 1.1559 - val_accuracy: 0.6003
Epoch 3/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.9992 - accuracy: 0.6472 - val_loss: 0.9702 - val_accuracy: 0.6639
Epoch 4/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.8702 - accuracy: 0.6899 - val_loss: 0.9143 - val_accuracy: 0.6812
Epoch 5/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.7830 - accuracy: 0.7253 - val_loss: 0.9222 - val_accuracy: 0.6837
Epoch 6/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.7226 - accuracy: 0.7430 - val_loss: 0.8695 - val_accuracy: 0.7051
Epoch 7/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.6677 - accuracy: 0.7649 - val_loss: 0.8878 - val_accuracy: 0.7009
Epoch 8/10
1563/1563 [==============================] - 5s 3ms/step - loss: 0.6139 - accuracy: 0.7830 - val_loss: 0.8839 - val_accuracy: 0.7098
Epoch 9/10
1563/1563 [==============================] - 6s 4ms/step - loss: 0.5656 - accuracy: 0.7981 - val_loss: 0.8782 - val_accuracy: 0.7149
Epoch 10/10
1563/1563 [==============================] - 5s 4ms/step - loss: 0.5224 - accuracy: 0.8131 - val_loss: 0.9054 - val_accuracy: 0.7103

五、預(yù)測

通過模型進(jìn)行預(yù)測得到的每一個(gè)類別的概率,數(shù)字越大該圖片為該類別的可能性越大

plt.imshow(test_images[1])
plt.show() #顯示要預(yù)測的圖片

import numpy as np
#預(yù)測圖片
pre = model.predict(test_images)
print(class_names[np.argmax(pre[1])])
ship.png
"""
預(yù)測結(jié)果 ship
"""

六、模型評估

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.xlim([1, 10]) #這里x軸和y軸的范圍都需要聲明,不然圖像會有一個(gè)默認(rèn)的范圍,會導(dǎo)致圖片變形
plt.ylim([0.5, 1])
plt.legend(loc='lower right')
plt.show()

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)
print(test_loss)
"""
313/313 - 0s - loss: 0.9054 - accuracy: 0.7103
"""
print(test_acc)
"""
0.7103000283241272
"""
Accuracy.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容