【深度学习实验】—— TensorFlow 实现明星识别
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
文章目录
1. 简介 & 数据集介绍
利用 TensorFlow,通过构建三层卷积神经网络(CNN)实现明星识别。数据集中有 Angelina Jolie, Brad Pitt, Denzel Washington, Hugh Jackman, Jennifer Lawrence, Johnny Depp, Kate Winslet, Leonardo DiCaprio, Megan Fox, Natalie Portman, Nicole Kidman, Robert Downey Jr, Sandra Bullock, Scarlett Johansson, Tom Cruise, Tom Hanks, Will Smith 17个明星图片,每类数据 100 张左右的图片。
2. 环境
- 语言环境:Python 3.12.7
- 编译器:Jupyter Notebook
- 深度学习环境:TensorFlow 2.21.0
3. 代码实现
3.1 前期准备
3.1.1 设置GPU & 导入库
导入必要的库并配置 GPU 显存增长,以解决在 Windows 环境下可能出现的显存占用或驱动兼容性问题。
from tensorflow import keras
from tensorflow.keras import layers,models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from datetime import datetime
from PIL import Image
gpus = tf.config.list_physical_devices("GPU")
if gpus:
gpu0 = gpus[0]
tf.config.experimental.set_memory_growth(gpu0, True)
tf.config.set_visible_devices([gpu0],"GPU")
gpus
3.1.2 数据集统计与预览
通过 pathlib 扫描本地目录统计 1300 张图像,并使用 PIL 打开一张图片进行直观确认。
data_dir = "./Data/48-data/"
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*.jpg')))
print("图片总数为:",image_count)
roses = list(data_dir.glob('Jennifer Lawrence/*.jpg'))
PIL.Image.open(str(roses[0]))

3.2 数据预处理
3.2.1 数据集划分与预处理
代码从指定路径加载图像数据集,将其统一调整为 224x224 分辨率,并按 8:2 的比例自动划分训练集与验证集;此外,通过 prefetch 技术将数据加载到缓存中,以提升 GPU 利用率。
batch_size = 32
img_height = 224
img_width = 224
train_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.1, subset="training", label_mode = "categorical", seed=123, image_size=(img_height, img_width), batch_size=batch_size)

val_ds = tf.keras.preprocessing.image_dataset_from_directory( data_dir, validation_split=0.1, subset="validation", label_mode = "categorical", seed=123, image_size=(img_height, img_width), batch_size=batch_size)

3.2.2 类别识别
提取并打印分类名称。
class_names = train_ds.class_names
print(class_names)

3.2.3 可视化
利用 matplotlib 绘制前 20 张图片及其标签。
plt.figure(figsize=(20, 10))
for images, labels in train_ds.take(1):
for i in range(20):
ax = plt.subplot(5, 10, i + 1)
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(class_names[labels[i]])
plt.axis("off")

3.2.4 整体数据检查
确保数据加载正确。
for image_batch, labels_batch in train_ds:
print(image_batch.shape)
print(labels_batch.shape)
break

3.3 模型建立与训练
3.3.1 数据集配置与模型建立
使用 cache() 和 prefetch() 方法优化数据加载性能。构建了一个多层 CNN 模型,包含三组卷积层(分别使用 32、64、128 个卷积核)与最大池化层,随后通过 Flatten 层拉平特征并连接全连接层进行分类,输出层采用 Softmax 函数处理多分类任务。
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 = models.Sequential([
layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)),
layers.AveragePooling2D((2, 2)),
layers.Conv2D(32, (3, 3), activation='relu'),
layers.AveragePooling2D((2, 2)),
layers.Dropout(0.5),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.AveragePooling2D((2, 2)),
layers.Dropout(0.5),
layers.Conv2D(128, (3, 3), activation='relu'),
layers.Dropout(0.5),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(len(class_names))
])
model.summary()

3.3.2 模型训练
设置了指数衰减的动态学习率(ExponentialDecay),使用了 Adam 优化器,并配置了交叉熵损失函数(SparseCategoricalCrossentropy)和准确率评估指标,最后对模型进行了 compile(编译)。同时定义了 ModelCheckpoint(自动保存验证集准确率最高的权重)和 EarlyStopping(在模型不再提升时提前停止训练)两个回调函数。然后调用 model.fit() 开始在训练集上训练模型,并在验证集上进行验证。
# 设置初始学习率
initial_learning_rate = 1e-4
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate, decay_steps=60, decay_rate=0.96, staircase=True)
# 将指数衰减学习率送入优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
model.compile(optimizer=optimizer, loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
epochs = 100
# 保存最佳模型参数
checkpointer = ModelCheckpoint('best_model.weights.h5', monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=True)
# 设置早停
earlystopper = EarlyStopping(monitor='val_accuracy', min_delta=0.001, patience=20, verbose=1)
history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, callbacks=[checkpointer, earlystopper])
Epoch 1/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 237ms/step - accuracy: 0.0812 - loss: 2.8600
Epoch 1: val_accuracy improved from None to 0.13889, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 15s 253ms/step - accuracy: 0.0975 - loss: 2.8344 - val_accuracy: 0.1389 - val_loss: 2.8046
Epoch 2/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 233ms/step - accuracy: 0.1207 - loss: 2.7924
Epoch 2: val_accuracy improved from 0.13889 to 0.14444, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 242ms/step - accuracy: 0.1105 - loss: 2.8004 - val_accuracy: 0.1444 - val_loss: 2.7946
Epoch 3/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 234ms/step - accuracy: 0.1106 - loss: 2.7822
Epoch 3: val_accuracy did not improve from 0.14444
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 240ms/step - accuracy: 0.1148 - loss: 2.7823 - val_accuracy: 0.1444 - val_loss: 2.7675
Epoch 4/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 235ms/step - accuracy: 0.1182 - loss: 2.7709
Epoch 4: val_accuracy improved from 0.14444 to 0.15000, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 245ms/step - accuracy: 0.1241 - loss: 2.7664 - val_accuracy: 0.1500 - val_loss: 2.7416
Epoch 5/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 233ms/step - accuracy: 0.1116 - loss: 2.7674
Epoch 5: val_accuracy did not improve from 0.15000
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 239ms/step - accuracy: 0.1173 - loss: 2.7480 - val_accuracy: 0.1444 - val_loss: 2.7095
Epoch 6/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 229ms/step - accuracy: 0.1310 - loss: 2.7252
Epoch 6: val_accuracy improved from 0.15000 to 0.17778, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 238ms/step - accuracy: 0.1395 - loss: 2.7219 - val_accuracy: 0.1778 - val_loss: 2.6847
Epoch 7/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 228ms/step - accuracy: 0.1237 - loss: 2.7095
Epoch 7: val_accuracy did not improve from 0.17778
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 233ms/step - accuracy: 0.1414 - loss: 2.7036 - val_accuracy: 0.1611 - val_loss: 2.6741
Epoch 8/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 228ms/step - accuracy: 0.1539 - loss: 2.6897
Epoch 8: val_accuracy did not improve from 0.17778
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 233ms/step - accuracy: 0.1537 - loss: 2.6819 - val_accuracy: 0.1722 - val_loss: 2.6343
Epoch 9/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 223ms/step - accuracy: 0.1709 - loss: 2.6357
Epoch 9: val_accuracy improved from 0.17778 to 0.18333, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 232ms/step - accuracy: 0.1574 - loss: 2.6561 - val_accuracy: 0.1833 - val_loss: 2.5995
Epoch 10/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 233ms/step - accuracy: 0.1494 - loss: 2.6425
Epoch 10: val_accuracy did not improve from 0.18333
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 239ms/step - accuracy: 0.1630 - loss: 2.6240 - val_accuracy: 0.1556 - val_loss: 2.6028
Epoch 11/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 239ms/step - accuracy: 0.1731 - loss: 2.5941
Epoch 11: val_accuracy improved from 0.18333 to 0.18889, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 249ms/step - accuracy: 0.1821 - loss: 2.5941 - val_accuracy: 0.1889 - val_loss: 2.5874
Epoch 12/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 228ms/step - accuracy: 0.1862 - loss: 2.5855
Epoch 12: val_accuracy improved from 0.18889 to 0.21111, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 237ms/step - accuracy: 0.1809 - loss: 2.5850 - val_accuracy: 0.2111 - val_loss: 2.5473
Epoch 13/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 231ms/step - accuracy: 0.2039 - loss: 2.5380
Epoch 13: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 237ms/step - accuracy: 0.2000 - loss: 2.5257 - val_accuracy: 0.1889 - val_loss: 2.5449
Epoch 14/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 238ms/step - accuracy: 0.1828 - loss: 2.5284
Epoch 14: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 245ms/step - accuracy: 0.1883 - loss: 2.5257 - val_accuracy: 0.1944 - val_loss: 2.5166
Epoch 15/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 247ms/step - accuracy: 0.2030 - loss: 2.4909
Epoch 15: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 253ms/step - accuracy: 0.2012 - loss: 2.4936 - val_accuracy: 0.1889 - val_loss: 2.4968
Epoch 16/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 246ms/step - accuracy: 0.2194 - loss: 2.4384
Epoch 16: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 252ms/step - accuracy: 0.2080 - loss: 2.4531 - val_accuracy: 0.2000 - val_loss: 2.4721
Epoch 17/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - accuracy: 0.1945 - loss: 2.4901
Epoch 17: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 247ms/step - accuracy: 0.2080 - loss: 2.4700 - val_accuracy: 0.2111 - val_loss: 2.4687
Epoch 18/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 245ms/step - accuracy: 0.2228 - loss: 2.3898
Epoch 18: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 251ms/step - accuracy: 0.2191 - loss: 2.3901 - val_accuracy: 0.2000 - val_loss: 2.4380
Epoch 19/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 234ms/step - accuracy: 0.2455 - loss: 2.3693
Epoch 19: val_accuracy did not improve from 0.21111
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 240ms/step - accuracy: 0.2272 - loss: 2.4033 - val_accuracy: 0.2111 - val_loss: 2.4588
Epoch 20/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 229ms/step - accuracy: 0.2347 - loss: 2.3653
Epoch 20: val_accuracy improved from 0.21111 to 0.22778, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 239ms/step - accuracy: 0.2340 - loss: 2.3593 - val_accuracy: 0.2278 - val_loss: 2.3991
Epoch 21/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 233ms/step - accuracy: 0.2408 - loss: 2.3412
Epoch 21: val_accuracy did not improve from 0.22778
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 239ms/step - accuracy: 0.2383 - loss: 2.3521 - val_accuracy: 0.2111 - val_loss: 2.4341
Epoch 22/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 229ms/step - accuracy: 0.2497 - loss: 2.3036
Epoch 22: val_accuracy improved from 0.22778 to 0.26667, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 238ms/step - accuracy: 0.2383 - loss: 2.3175 - val_accuracy: 0.2667 - val_loss: 2.3658
Epoch 23/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 243ms/step - accuracy: 0.2626 - loss: 2.2480
Epoch 23: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 250ms/step - accuracy: 0.2691 - loss: 2.2563 - val_accuracy: 0.2167 - val_loss: 2.3682
Epoch 24/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 237ms/step - accuracy: 0.2632 - loss: 2.2455
Epoch 24: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 243ms/step - accuracy: 0.2636 - loss: 2.2622 - val_accuracy: 0.2222 - val_loss: 2.3597
Epoch 25/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 228ms/step - accuracy: 0.2639 - loss: 2.2537
Epoch 25: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 233ms/step - accuracy: 0.2704 - loss: 2.2265 - val_accuracy: 0.2667 - val_loss: 2.3161
Epoch 26/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 226ms/step - accuracy: 0.2790 - loss: 2.2385
Epoch 26: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 232ms/step - accuracy: 0.2741 - loss: 2.2363 - val_accuracy: 0.2611 - val_loss: 2.3174
Epoch 27/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 235ms/step - accuracy: 0.2961 - loss: 2.1591
Epoch 27: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 240ms/step - accuracy: 0.2938 - loss: 2.1854 - val_accuracy: 0.2278 - val_loss: 2.3128
Epoch 28/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 236ms/step - accuracy: 0.3000 - loss: 2.1615
Epoch 28: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 242ms/step - accuracy: 0.3099 - loss: 2.1646 - val_accuracy: 0.2333 - val_loss: 2.3526
Epoch 29/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 246ms/step - accuracy: 0.3016 - loss: 2.1559
Epoch 29: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 253ms/step - accuracy: 0.2994 - loss: 2.1469 - val_accuracy: 0.2667 - val_loss: 2.3174
Epoch 30/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 260ms/step - accuracy: 0.2878 - loss: 2.1541
Epoch 30: val_accuracy did not improve from 0.26667
51/51 ━━━━━━━━━━━━━━━━━━━━ 14s 267ms/step - accuracy: 0.2765 - loss: 2.1893 - val_accuracy: 0.2611 - val_loss: 2.2809
Epoch 31/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 255ms/step - accuracy: 0.3157 - loss: 2.1295
Epoch 31: val_accuracy improved from 0.26667 to 0.27222, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 14s 266ms/step - accuracy: 0.3198 - loss: 2.1170 - val_accuracy: 0.2722 - val_loss: 2.2848
Epoch 32/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 253ms/step - accuracy: 0.3259 - loss: 2.0842
Epoch 32: val_accuracy did not improve from 0.27222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 259ms/step - accuracy: 0.3352 - loss: 2.0757 - val_accuracy: 0.2722 - val_loss: 2.2563
Epoch 33/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 267ms/step - accuracy: 0.3017 - loss: 2.1004
Epoch 33: val_accuracy did not improve from 0.27222
51/51 ━━━━━━━━━━━━━━━━━━━━ 14s 274ms/step - accuracy: 0.3105 - loss: 2.0850 - val_accuracy: 0.2556 - val_loss: 2.2349
Epoch 34/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 260ms/step - accuracy: 0.3463 - loss: 2.0285
Epoch 34: val_accuracy did not improve from 0.27222
51/51 ━━━━━━━━━━━━━━━━━━━━ 14s 267ms/step - accuracy: 0.3364 - loss: 2.0539 - val_accuracy: 0.2611 - val_loss: 2.2729
Epoch 35/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 249ms/step - accuracy: 0.3294 - loss: 2.0381
Epoch 35: val_accuracy improved from 0.27222 to 0.32222, saving model to best_model.weights.h5
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 260ms/step - accuracy: 0.3160 - loss: 2.0490 - val_accuracy: 0.3222 - val_loss: 2.1952
Epoch 36/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 253ms/step - accuracy: 0.3361 - loss: 1.9970
Epoch 36: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 259ms/step - accuracy: 0.3426 - loss: 2.0154 - val_accuracy: 0.3222 - val_loss: 2.2087
Epoch 37/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 249ms/step - accuracy: 0.3334 - loss: 1.9958
Epoch 37: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 256ms/step - accuracy: 0.3309 - loss: 2.0078 - val_accuracy: 0.3000 - val_loss: 2.2384
Epoch 38/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 251ms/step - accuracy: 0.3442 - loss: 1.9919
Epoch 38: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 257ms/step - accuracy: 0.3481 - loss: 1.9922 - val_accuracy: 0.3111 - val_loss: 2.1938
Epoch 39/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 251ms/step - accuracy: 0.3505 - loss: 1.9626
Epoch 39: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 258ms/step - accuracy: 0.3519 - loss: 1.9518 - val_accuracy: 0.2778 - val_loss: 2.2064
Epoch 40/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 256ms/step - accuracy: 0.3740 - loss: 1.9434
Epoch 40: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 263ms/step - accuracy: 0.3698 - loss: 1.9144 - val_accuracy: 0.3222 - val_loss: 2.2227
Epoch 41/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 244ms/step - accuracy: 0.3760 - loss: 1.8971
Epoch 41: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 250ms/step - accuracy: 0.3753 - loss: 1.9083 - val_accuracy: 0.2944 - val_loss: 2.2228
Epoch 42/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 254ms/step - accuracy: 0.3752 - loss: 1.8916
Epoch 42: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 260ms/step - accuracy: 0.3765 - loss: 1.9085 - val_accuracy: 0.3111 - val_loss: 2.1808
Epoch 43/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 256ms/step - accuracy: 0.3605 - loss: 1.9192
Epoch 43: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 263ms/step - accuracy: 0.3784 - loss: 1.9098 - val_accuracy: 0.2944 - val_loss: 2.2001
Epoch 44/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - accuracy: 0.3801 - loss: 1.8719
Epoch 44: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 247ms/step - accuracy: 0.3840 - loss: 1.8751 - val_accuracy: 0.2944 - val_loss: 2.2135
Epoch 45/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 237ms/step - accuracy: 0.3768 - loss: 1.8855
Epoch 45: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 243ms/step - accuracy: 0.3877 - loss: 1.8857 - val_accuracy: 0.2889 - val_loss: 2.1819
Epoch 46/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 237ms/step - accuracy: 0.3843 - loss: 1.8684
Epoch 46: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 243ms/step - accuracy: 0.3753 - loss: 1.8710 - val_accuracy: 0.3000 - val_loss: 2.2071
Epoch 47/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 234ms/step - accuracy: 0.3621 - loss: 1.8873
Epoch 47: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 241ms/step - accuracy: 0.3840 - loss: 1.8589 - val_accuracy: 0.2889 - val_loss: 2.2085
Epoch 48/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - accuracy: 0.3983 - loss: 1.8262
Epoch 48: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 248ms/step - accuracy: 0.4012 - loss: 1.8337 - val_accuracy: 0.3000 - val_loss: 2.1911
Epoch 49/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 236ms/step - accuracy: 0.3809 - loss: 1.8413
Epoch 49: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 242ms/step - accuracy: 0.4006 - loss: 1.8054 - val_accuracy: 0.2722 - val_loss: 2.2181
Epoch 50/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 238ms/step - accuracy: 0.3966 - loss: 1.8169
Epoch 50: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 244ms/step - accuracy: 0.4049 - loss: 1.8202 - val_accuracy: 0.2944 - val_loss: 2.1910
Epoch 51/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 242ms/step - accuracy: 0.4100 - loss: 1.7925
Epoch 51: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 248ms/step - accuracy: 0.3938 - loss: 1.8086 - val_accuracy: 0.2833 - val_loss: 2.1995
Epoch 52/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 244ms/step - accuracy: 0.3980 - loss: 1.8364
Epoch 52: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 250ms/step - accuracy: 0.4148 - loss: 1.7759 - val_accuracy: 0.2778 - val_loss: 2.1957
Epoch 53/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 242ms/step - accuracy: 0.4389 - loss: 1.7332
Epoch 53: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 13s 249ms/step - accuracy: 0.4160 - loss: 1.7754 - val_accuracy: 0.2778 - val_loss: 2.2097
Epoch 54/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 239ms/step - accuracy: 0.4421 - loss: 1.7237
Epoch 54: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 245ms/step - accuracy: 0.4148 - loss: 1.7576 - val_accuracy: 0.3056 - val_loss: 2.2029
Epoch 55/100
51/51 ━━━━━━━━━━━━━━━━━━━━ 0s 236ms/step - accuracy: 0.4357 - loss: 1.7280
Epoch 55: val_accuracy did not improve from 0.32222
51/51 ━━━━━━━━━━━━━━━━━━━━ 12s 242ms/step - accuracy: 0.4395 - loss: 1.6978 - val_accuracy: 0.3111 - val_loss: 2.1865
Epoch 55: early stopping
4. 模型评估
提取训练历史记录(History)中的 Loss 和 Accuracy 数据,使用 Matplotlib 将训练集和验证集的准确率、损失值变化绘制成折线图,用于分析模型是否收敛或过拟合。
current_time = datetime.now() # 获取当前时间
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(len(loss))
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.xlabel(current_time)
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()

加载之前保存的“最佳模型权重”(best_model.weights.h5),读取一张全新的测试图片,经过统一的尺寸缩放和维度扩展等预处理后,送入模型进行预测,并输出预测结果。
# 加载效果最好的模型权重
img = Image.open("./Data/48-data/Jennifer Lawrence/003_963a3627.jpg")
image = tf.image.resize(img, [img_height, img_width])
img_array = tf.expand_dims(image, 0)
# 加载效果最好的模型权重
model.load_weights('best_model.weights.h5')
predictions = model.predict(img_array)
print("预测结果为:",class_names[np.argmax(predictions)])

更多推荐


所有评论(0)