文章目錄
- 一、前期作業
- 1. 設定GPU
- 2. 匯入資料
- 3. 查看資料
- 二、資料預處理
- 1. 加載資料
- 2. 可視化資料
- 3. 再次檢查資料
- 4. 配置資料集
- 三、呼叫官方網路模型
- 四、設定動態學習率
- 五、編譯
- 六、訓練模型
- 七、模型評估
- 1. Accuracy與Loss圖
- 2. 混淆矩陣
- 八、保存and加載模型
- 九、預測
一、前期作業
本文將通過對人眼狀態的識別達到檢測注意力的目的 ? 新增混淆矩陣模塊,
🚀 我的環境:
- 語言環境:Python3.6.5
- 編譯器:jupyter notebook
- 深度學習環境:TensorFlow2.4.1
- 資料鏈接: https://pan.baidu.com/s/1kIk75W8vLC1TkjKaA0odLw 提取碼:nolr
🚀 深度學習新人必看:
- 小白入門深度學習 | 第一篇:配置深度學習環境
- 小白入門深度學習 | 第二篇:編譯器的使用-Jupyter Notebook
🚀 往期精彩:
- 深度學習100例-卷積神經網路(CNN)實作mnist手寫數字識別 | 第1天
- 深度學習100例-卷積神經網路(CNN)彩色圖片分類 | 第2天
- 深度學習100例-卷積神經網路(CNN)服裝影像分類 | 第3天
- 深度學習100例-卷積神經網路(CNN)花朵識別 | 第4天
- 深度學習100例-卷積神經網路(CNN)天氣識別 | 第5天
- 深度學習100例-卷積神經網路(VGG-16)識別海賊王草帽一伙 | 第6天
- 深度學習100例-卷積神經網路(VGG-19)識別靈籠中的人物 | 第7天
- 深度學習100例-卷積神經網路(ResNet-50)鳥類識別 | 第8天
- 深度學習100例-回圈神經網路(RNN)實作股票預測 | 第9天
- 深度學習100例-回圈神經網路(LSTM)實作股票預測 | 第10天
- 深度學習100例-卷積神經網路(AlexNet)手把手教學 | 第11天
- 深度學習100例-卷積神經網路(CNN)識別驗證碼 | 第12天
- 深度學習100例-卷積神經網路(Inception V3)識別手語 | 第13天
- 深度學習100例-卷積神經網路(Inception-ResNet-v2)識別交通標志 | 第14天
- 深度學習100例-卷積神經網路(CNN)實作車牌識別 | 第15天
- 深度學習100例-卷積神經網路(CNN)識別神奇寶貝小智一伙 | 第16天
🚀 來自專欄:《深度學習100例》
1. 設定GPU
如果使用的是CPU可以注釋掉這部分的代碼,
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
if gpus:
tf.config.experimental.set_memory_growth(gpus[0], True) #設定GPU顯存用量按需使用
tf.config.set_visible_devices([gpus[0]],"GPU")
# 列印顯卡資訊,確認GPU可用
print(gpus)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
2. 匯入資料
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號
import os,PIL
# 設定隨機種子盡可能使結果可以重現
import numpy as np
np.random.seed(1)
# 設定隨機種子盡可能使結果可以重現
import tensorflow as tf
tf.random.set_seed(1)
import pathlib
data_dir = "D:/jupyter notebook/DL-100-days/datasets/017_Eye_dataset"
data_dir = pathlib.Path(data_dir)
3. 查看資料
image_count = len(list(data_dir.glob('*/*')))
print("圖片總數為:",image_count)
圖片總數為: 4307
二、資料預處理
1. 加載資料
使用image_dataset_from_directory方法將磁盤中的資料加載到tf.data.Dataset中
batch_size = 64
img_height = 224
img_width = 224
TensorFlow版本是2.2.0的同學可能會遇到module 'tensorflow.keras.preprocessing' has no attribute 'image_dataset_from_directory'的報錯,升級一下TensorFlow就OK了,
"""
關于image_dataset_from_directory()的詳細介紹可以參考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=12,
image_size=(img_height, img_width),
batch_size=batch_size)
Found 4307 files belonging to 4 classes.
Using 3446 files for training.
"""
關于image_dataset_from_directory()的詳細介紹可以參考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=12,
image_size=(img_height, img_width),
batch_size=batch_size)
Found 4307 files belonging to 4 classes.
Using 861 files for validation.
我們可以通過class_names輸出資料集的標簽,標簽將按字母順序對應于目錄名稱,
class_names = train_ds.class_names
print(class_names)
['close_look', 'forward_look', 'left_look', 'right_look']
2. 可視化資料
plt.figure(figsize=(10, 5)) # 圖形的寬為10高為5
plt.suptitle("資料展示")
for images, labels in train_ds.take(1):
for i in range(8):
ax = plt.subplot(2, 4, i + 1)
ax.patch.set_facecolor('yellow')
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(class_names[labels[i]])
plt.axis("off")

3. 再次檢查資料
for image_batch, labels_batch in train_ds:
print(image_batch.shape)
print(labels_batch.shape)
break
(64, 224, 224, 3)
(64,)
Image_batch是形狀的張量(8, 224, 224, 3),這是一批形狀240x240x3的8張圖片(最后一維指的是彩色通道RGB),Label_batch是形狀(8,)的張量,這些標簽對應8張圖片
4. 配置資料集
- shuffle() : 打亂資料,關于此函式的詳細介紹可以參考:https://zhuanlan.zhihu.com/p/42417456
- prefetch() :預取資料,加速運行,其詳細介紹可以參考我前兩篇文章,里面都有講解,
- cache() :將資料集快取到記憶體當中,加速運行
AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
三、呼叫官方網路模型
model = tf.keras.applications.VGG16()
# 列印模型資訊
model.summary()
Model: "vgg16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
_________________________________________________________________
......
_________________________________________________________________
flatten (Flatten) (None, 25088) 0
_________________________________________________________________
fc1 (Dense) (None, 4096) 102764544
_________________________________________________________________
fc2 (Dense) (None, 4096) 16781312
_________________________________________________________________
predictions (Dense) (None, 1000) 4097000
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________
四、設定動態學習率
這里先羅列一下學習率大與學習率小的優缺點,
- 學習率大
- 優點:1、加快學習速率,2、有助于跳出區域最優值,
- 缺點:1、導致模型訓練不收斂,2、單單使用大學習率容易導致模型不精確,
- 學習率小
- 優點:1、有助于模型收斂、模型細化,2、提高模型精度,
- 缺點:1、很難跳出區域最優值,2、收斂緩慢,
注意:這里設定的動態學習率為:指數衰減型(ExponentialDecay),在每一個epoch開始前,學習率(learning_rate)都將會重置為初始學習率(initial_learning_rate),然后再重新開始衰減,計算公式如下:
learning_rate = initial_learning_rate * decay_rate ^ (step / decay_steps)
# 設定初始學習率
initial_learning_rate = 1e-4
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps=20, # 敲黑板!!!這里是指 steps,不是指epochs
decay_rate=0.96, # lr經過一次衰減就會變成 decay_rate*lr
staircase=True)
# 將指數衰減學習率送入優化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
五、編譯
在準備對模型進行訓練之前,還需要再對其進行一些設定,以下內容是在模型的編譯步驟中添加的:
- 損失函式(loss):用于衡量模型在訓練期間的準確率,
- 優化器(optimizer):決定模型如何根據其看到的資料和自身的損失函式進行更新,
- 評價函式(metrics):用于監控訓練和測驗步驟,以下示例使用了準確率,即被正確分類的影像的比率,
model.compile(optimizer=optimizer,
loss ='sparse_categorical_crossentropy',
metrics =['accuracy'])
六、訓練模型
epochs = 10
history = model.fit(
train_ds,
validation_data=val_ds,
epochs=epochs
)
Epoch 1/10
54/54 [==============================] - 29s 377ms/step - loss: 1.0835 - accuracy: 0.6709 - val_loss: 0.6919 - val_accuracy: 0.7933
Epoch 2/10
54/54 [==============================] - 14s 268ms/step - loss: 0.2332 - accuracy: 0.9248 - val_loss: 0.1173 - val_accuracy: 0.9628
Epoch 3/10
54/54 [==============================] - 14s 259ms/step - loss: 0.1072 - accuracy: 0.9634 - val_loss: 0.0771 - val_accuracy: 0.9779
Epoch 4/10
54/54 [==============================] - 14s 256ms/step - loss: 0.0663 - accuracy: 0.9794 - val_loss: 0.0566 - val_accuracy: 0.9826
Epoch 5/10
54/54 [==============================] - 14s 258ms/step - loss: 0.0480 - accuracy: 0.9855 - val_loss: 0.0609 - val_accuracy: 0.9768
Epoch 6/10
54/54 [==============================] - 14s 258ms/step - loss: 0.0431 - accuracy: 0.9852 - val_loss: 0.0597 - val_accuracy: 0.9768
Epoch 7/10
54/54 [==============================] - 14s 256ms/step - loss: 0.0289 - accuracy: 0.9910 - val_loss: 0.0539 - val_accuracy: 0.9837
Epoch 8/10
54/54 [==============================] - 14s 259ms/step - loss: 0.0221 - accuracy: 0.9927 - val_loss: 0.0626 - val_accuracy: 0.9744
Epoch 9/10
54/54 [==============================] - 14s 257ms/step - loss: 0.0281 - accuracy: 0.9910 - val_loss: 0.0605 - val_accuracy: 0.9814
Epoch 10/10
54/54 [==============================] - 14s 257ms/step - loss: 0.0203 - accuracy: 0.9936 - val_loss: 0.0663 - val_accuracy: 0.9791
七、模型評估
1. Accuracy與Loss圖
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(epochs)
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

2. 混淆矩陣
Seaborn 是一個畫圖庫,它基于 Matplotlib 核心庫進行了更高階的 API 封裝,可以讓你輕松地畫出更漂亮的圖形,Seaborn 的漂亮主要體現在配色更加舒服、以及圖形元素的樣式更加細膩,
from sklearn.metrics import confusion_matrix
import seaborn as sns
import pandas as pd
# 定義一個繪制混淆矩陣圖的函式
def plot_cm(labels, predictions):
# 生成混淆矩陣
conf_numpy = confusion_matrix(labels, predictions)
# 將矩陣轉化為 DataFrame
conf_df = pd.DataFrame(conf_numpy, index=class_names ,columns=class_names)
plt.figure(figsize=(8,7))
sns.heatmap(conf_df, annot=True, fmt="d", cmap="BuPu")
plt.title('混淆矩陣',fontsize=15)
plt.ylabel('真實值',fontsize=14)
plt.xlabel('預測值',fontsize=14)
val_pre = []
val_label = []
for images, labels in val_ds:#這里可以取部分驗證資料(.take(1))生成混淆矩陣
for image, label in zip(images, labels):
# 需要給圖片增加一個維度
img_array = tf.expand_dims(image, 0)
# 使用模型預測圖片中的人物
prediction = model.predict(img_array)
val_pre.append(class_names[np.argmax(prediction)])
val_label.append(class_names[label])
plot_cm(val_label, val_pre)

八、保存and加載模型
這是最簡單的模型保存與加載方法哈
# 保存模型
model.save('model/17_model.h5')
# 加載模型
new_model = tf.keras.models.load_model('model/17_model.h5')
九、預測
# 采用加載的模型(new_model)來看預測結果
plt.figure(figsize=(10, 5)) # 圖形的寬為10高為5
plt.suptitle("預測結果展示")
for images, labels in val_ds.take(1):
for i in range(8):
ax = plt.subplot(2, 4, i + 1)
# 顯示圖片
plt.imshow(images[i].numpy().astype("uint8"))
# 需要給圖片增加一個維度
img_array = tf.expand_dims(images[i], 0)
# 使用模型預測圖片中的人物
predictions = new_model.predict(img_array)
plt.title(class_names[np.argmax(predictions)])
plt.axis("off")

往期精彩
- 深度學習100例-卷積神經網路(CNN)實作mnist手寫數字識別 | 第1天
- 深度學習100例-卷積神經網路(CNN)彩色圖片分類 | 第2天
- 深度學習100例-卷積神經網路(CNN)服裝影像分類 | 第3天
- 深度學習100例-卷積神經網路(CNN)花朵識別 | 第4天
- 深度學習100例-卷積神經網路(CNN)天氣識別 | 第5天
- 深度學習100例-卷積神經網路(VGG-16)識別海賊王草帽一伙 | 第6天
- 深度學習100例-卷積神經網路(VGG-19)識別靈籠中的人物 | 第7天
- 深度學習100例-卷積神經網路(ResNet-50)鳥類識別 | 第8天
- 深度學習100例-回圈神經網路(RNN)實作股票預測 | 第9天
- 深度學習100例-回圈神經網路(LSTM)實作股票預測 | 第10天
- 深度學習100例-卷積神經網路(AlexNet)手把手教學 | 第11天
- 深度學習100例-卷積神經網路(CNN)識別驗證碼 | 第12天
- 深度學習100例-卷積神經網路(Inception V3)識別手語 | 第13天
- 深度學習100例-卷積神經網路(Inception-ResNet-v2)識別交通標志 | 第14天
- 深度學習100例-卷積神經網路(CNN)實作車牌識別 | 第15天
- 深度學習100例-卷積神經網路(CNN)識別神奇寶貝小智一伙 | 第16天
🚀 來自專欄:《深度學習100例》
未完~
持續更新歡迎 點贊👍、收藏?、關注👀
點贊👍:點贊給我持續更新的動力
收藏??:收藏后你能夠隨時找到文章
關注👀:關注我第一時間接收最新文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289479.html
標籤:AI
