第T6周:好莱坞明星识别

一、前期工作

1. 设置GPU

pip install --upgrade pip
Requirement already satisfied: pip in D:\Python\Lib\site-packages (26.0.1)
Note: you may need to restart the kernel to use updated packages.
!pip install tensorflow matplotlib pillow
Requirement already satisfied: tensorflow in D:\Python\Lib\site-packages (2.21.0)
Requirement already satisfied: matplotlib in D:\Python\Lib\site-packages (3.10.8)
Requirement already satisfied: pillow in D:\Python\Lib\site-packages (12.0.0)
Requirement already satisfied: absl-py>=1.0.0 in D:\Python\Lib\site-packages (from tensorflow) (2.4.0)
Requirement already satisfied: astunparse>=1.6.0 in D:\Python\Lib\site-packages (from tensorflow) (1.6.3)
Requirement already satisfied: flatbuffers>=25.9.23 in D:\Python\Lib\site-packages (from tensorflow) (25.12.19)
Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in D:\Python\Lib\site-packages (from tensorflow) (0.7.0)
Requirement already satisfied: google_pasta>=0.1.1 in D:\Python\Lib\site-packages (from tensorflow) (0.2.0)
Requirement already satisfied: libclang>=13.0.0 in D:\Python\Lib\site-packages (from tensorflow) (18.1.1)
Requirement already satisfied: opt_einsum>=2.3.2 in D:\Python\Lib\site-packages (from tensorflow) (3.4.0)
Requirement already satisfied: packaging in D:\Python\Lib\site-packages (from tensorflow) (25.0)
Requirement already satisfied: protobuf<8.0.0,>=6.31.1 in D:\Python\Lib\site-packages (from tensorflow) (7.34.0)
Requirement already satisfied: requests<3,>=2.21.0 in D:\Python\Lib\site-packages (from tensorflow) (2.32.5)
Requirement already satisfied: setuptools in D:\Python\Lib\site-packages (from tensorflow) (82.0.1)
Requirement already satisfied: six>=1.12.0 in D:\Python\Lib\site-packages (from tensorflow) (1.17.0)
Requirement already satisfied: termcolor>=1.1.0 in D:\Python\Lib\site-packages (from tensorflow) (3.3.0)
Requirement already satisfied: typing_extensions>=3.6.6 in D:\Python\Lib\site-packages (from tensorflow) (4.15.0)
Requirement already satisfied: wrapt>=1.11.0 in D:\Python\Lib\site-packages (from tensorflow) (2.1.2)
Requirement already satisfied: grpcio<2.0,>=1.24.3 in D:\Python\Lib\site-packages (from tensorflow) (1.78.0)
Requirement already satisfied: keras>=3.12.0 in D:\Python\Lib\site-packages (from tensorflow) (3.13.2)
Requirement already satisfied: numpy>=1.26.0 in D:\Python\Lib\site-packages (from tensorflow) (2.3.5)
Requirement already satisfied: h5py<3.15.0,>=3.11.0 in D:\Python\Lib\site-packages (from tensorflow) (3.14.0)
Requirement already satisfied: ml_dtypes<1.0.0,>=0.5.1 in D:\Python\Lib\site-packages (from tensorflow) (0.5.4)
Requirement already satisfied: charset_normalizer<4,>=2 in D:\Python\Lib\site-packages (from requests<3,>=2.21.0->tensorflow) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in D:\Python\Lib\site-packages (from requests<3,>=2.21.0->tensorflow) (3.11)
Requirement already satisfied: urllib3<3,>=1.21.1 in D:\Python\Lib\site-packages (from requests<3,>=2.21.0->tensorflow) (2.6.3)
Requirement already satisfied: certifi>=2017.4.17 in D:\Python\Lib\site-packages (from requests<3,>=2.21.0->tensorflow) (2026.1.4)
Requirement already satisfied: contourpy>=1.0.1 in D:\Python\Lib\site-packages (from matplotlib) (1.3.3)
Requirement already satisfied: cycler>=0.10 in D:\Python\Lib\site-packages (from matplotlib) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in D:\Python\Lib\site-packages (from matplotlib) (4.61.1)
Requirement already satisfied: kiwisolver>=1.3.1 in D:\Python\Lib\site-packages (from matplotlib) (1.4.9)
Requirement already satisfied: pyparsing>=3 in D:\Python\Lib\site-packages (from matplotlib) (3.2.5)
Requirement already satisfied: python-dateutil>=2.7 in D:\Python\Lib\site-packages (from matplotlib) (2.9.0.post0)
Requirement already satisfied: wheel<1.0,>=0.23.0 in D:\Python\Lib\site-packages (from astunparse>=1.6.0->tensorflow) (0.46.3)
Requirement already satisfied: rich in D:\Python\Lib\site-packages (from keras>=3.12.0->tensorflow) (14.3.3)
Requirement already satisfied: namex in D:\Python\Lib\site-packages (from keras>=3.12.0->tensorflow) (0.1.0)
Requirement already satisfied: optree in D:\Python\Lib\site-packages (from keras>=3.12.0->tensorflow) (0.19.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in D:\Python\Lib\site-packages (from rich->keras>=3.12.0->tensorflow) (4.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in D:\Python\Lib\site-packages (from rich->keras>=3.12.0->tensorflow) (2.19.2)
Requirement already satisfied: mdurl~=0.1 in D:\Python\Lib\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.12.0->tensorflow) (0.1.2)

2. 导入数据

# 先导入模块
import pathlib

# 再定义路径
data_dir = "D:/Adashujuxuexi/T6/48-data"
data_dir = pathlib.Path(data_dir)

3. 查看数据

!pip uninstall -y pillow
!pip install pillow
Found existing installation: pillow 12.0.0
Uninstalling pillow-12.0.0:
  Successfully uninstalled pillow-12.0.0
Collecting pillow
  Using cached pillow-12.2.0-cp312-cp312-win_amd64.whl.metadata (9.0 kB)
Using cached pillow-12.2.0-cp312-cp312-win_amd64.whl (7.1 MB)
Installing collected packages: pillow
Successfully installed pillow-12.2.0
# 【完整不报错版本】直接运行这一整段
import pathlib
from PIL import Image

# 你的数据集路径(直接用你自己的)
data_dir = pathlib.Path("D:/Adashujuxuexi/T6/48-data")

# 统计图片总数
image_count = len(list(data_dir.glob('*/*.jpg')))
print("图片总数为:", image_count)

# 测试打开一张图片(不报错=成功)
roses = list(data_dir.glob('Jennifer Lawrence/*.jpg'))
if roses:
    img = Image.open(str(roses[0]))
    print("图片加载成功!")
    # img.show()  # 想看图就打开这句
图片总数为: 1800
图片加载成功!

二、数据预处理

1. 加载数据

batch_size = 32
img_height = 224
img_width = 224
import tensorflow as tf
"""
关于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.1,
    subset="training",
    label_mode = "categorical",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)
Found 1800 files belonging to 17 classes.
Using 1620 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.1,
    subset="validation",
    label_mode = "categorical",
    seed=123,
    image_size=(img_height, img_width),
    batch_size=batch_size)
Found 1800 files belonging to 17 classes.
Using 180 files for validation.
class_names = train_ds.class_names
print(class_names)
['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']

2. 可视化数据

import matplotlib.pyplot as plt
import numpy as np
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[np.argmax(labels[i])])
        
        plt.axis("off")

请添加图片描述

3. 再次检查数据

for image_batch, labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break
(32, 224, 224, 3)
(32, 17)

4. 配置数据集

AUTOTUNE = tf.data.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

三、构建CNN网络

from tensorflow.keras import models, layers
img_height, img_width = 224, 224  # 和你数据集加载时设置的尺寸一致
class_names = train_ds.class_names # 从之前加载的训练集里获取类别名
from tensorflow.keras import models, layers

"""
关于卷积核的计算不懂的可以参考文章:https://blog.csdn.net/qq_38251616/article/details/114278995
layers.Dropout(0.4) 作用是防止过拟合,提高模型的泛化能力。
关于Dropout层的更多介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/115826689
"""

model = models.Sequential([
    # 仅修改这一行:去掉 experimental 前缀
    layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    
    layers.Conv2D(16, (3, 3), activation='relu'), # 卷积层1,卷积核3*3  
    layers.AveragePooling2D((2, 2)),               # 池化层1,2*2采样
    layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层2,卷积核3*3
    layers.AveragePooling2D((2, 2)),               # 池化层2,2*2采样
    layers.Dropout(0.5),  
    layers.Conv2D(64, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3
    layers.AveragePooling2D((2, 2)),     
    layers.Dropout(0.5),  
    layers.Conv2D(128, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3
    layers.Dropout(0.5), 
    
    layers.Flatten(),                       # Flatten层,连接卷积层与全连接层
    layers.Dense(128, activation='relu'),   # 全连接层,特征进一步提取
    layers.Dense(len(class_names), activation='softmax') # 输出层,加上softmax适配categorical_crossentropy
])

model.summary()  # 打印网络结构
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ rescaling_2 (Rescaling)              │ (None, 224, 224, 3)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_8 (Conv2D)                    │ (None, 222, 222, 16)        │             448 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ average_pooling2d_6                  │ (None, 111, 111, 16)        │               0 │
│ (AveragePooling2D)                   │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_9 (Conv2D)                    │ (None, 109, 109, 32)        │           4,640 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ average_pooling2d_7                  │ (None, 54, 54, 32)          │               0 │
│ (AveragePooling2D)                   │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_6 (Dropout)                  │ (None, 54, 54, 32)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_10 (Conv2D)                   │ (None, 52, 52, 64)          │          18,496 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ average_pooling2d_8                  │ (None, 26, 26, 64)          │               0 │
│ (AveragePooling2D)                   │                             │                 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_7 (Dropout)                  │ (None, 26, 26, 64)          │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ conv2d_11 (Conv2D)                   │ (None, 24, 24, 128)         │          73,856 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dropout_8 (Dropout)                  │ (None, 24, 24, 128)         │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ flatten_2 (Flatten)                  │ (None, 73728)               │               0 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_3 (Dense)                      │ (None, 128)                 │       9,437,312 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_4 (Dense)                      │ (None, 17)                  │           2,193 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 9,536,945 (36.38 MB)
 Trainable params: 9,536,945 (36.38 MB)
 Non-trainable params: 0 (0.00 B)

四、训练模型

1.设置动态学习率

# 设置初始学习率
initial_learning_rate = 1e-4

lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate,
    decay_steps=60,     # 每60个step衰减一次
    decay_rate=0.96,    # 每次衰减为原来的0.96倍
    staircase=True
)

# 将指数衰减学习率送入优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)

# 模型编译(两种情况二选一)
# 情况1:你的模型输出层没有 softmax,用 from_logits=True
model.compile(
    optimizer=optimizer,
    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

# 情况2:你的模型输出层有 softmax,用 from_logits=False
# model.compile(
#     optimizer=optimizer,
#     loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False),
#     metrics=['accuracy']
# )

损失函数Loss:
● binary_crossentropy(对数损失函数):与 sigmoid 相对应的损失函数,针对于二分类问题。
● categorical_crossentropy(多分类的对数损失函数):与 softmax 相对应的损失函数,如果是one-hot编码,则使用 categorical_crossentropy损失函数Loss:

📌 调用方法一
model.compile(optimizer=“adam”,
loss=‘categorical_crossentropy’,
metrics=[‘accuracy’])

#调用方法二:
#model.compile(optimizer=“adam”,
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=[‘accuracy’])

sparse_categorical_crossentropy(稀疏性多分类的对数损失函数):

📌 调用方法一
model.compile(optimizer=“adam”,
loss=‘sparse_categorical_crossentropy’,
metrics=[‘accuracy’])

📌 调用方法二
model.compile(optimizer=“adam”,
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=[‘accuracy’])

函数原型
tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=False,
reduction=losses_utils.ReductionV2.AUTO,
name=‘sparse_categorical_crossentropy’
)

2.早停与保存最佳模型参数

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

epochs = 100

# 保存最佳模型参数(修复文件名格式)
checkpointer = ModelCheckpoint(
    'best_model.weights.h5',  # 改为 .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
)

3. 模型训练

# ===================== 0 导入库 =====================
import tensorflow as tf
from tensorflow.keras import models, layers
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

# ===================== 1 定义参数 & 加载数据 =====================
img_height, img_width = 224, 224
batch_size = 32
data_dir = "D:/Adashujuxuexi/T6/48-data"

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
)
class_names = train_ds.class_names

# ===================== 2 定义模型(你必须要有这个!) =====================
model = models.Sequential([
    layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    layers.Conv2D(16, (3,3), activation='relu'),
    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.Dense(len(class_names))
])

# ===================== 3 编译模型(你必须要有这个!) =====================
model.compile(
    optimizer=tf.keras.optimizers.Adam(1e-4),
    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

# ===================== 4 训练模型(就是你写的这段!完全正确!) =====================
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]
)
Found 1800 files belonging to 17 classes.
Using 1620 files for training.
Found 1800 files belonging to 17 classes.
Using 180 files for validation.
WARNING:tensorflow:TensorFlow GPU support is not available on native Windows for TensorFlow >= 2.11. Even if CUDA/cuDNN are installed, GPU will not be used. Please use WSL2 or the TensorFlow-DirectML plugin.
Epoch 1/100


D:\Python\Lib\site-packages\keras\src\layers\preprocessing\data_layer.py:95: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)


[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 203ms/step - accuracy: 0.0932 - loss: 2.8226
Epoch 1: val_accuracy improved from None to 0.13889, saving model to best_model.weights.h5

Epoch 1: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m13s[0m 218ms/step - accuracy: 0.1074 - loss: 2.8061 - val_accuracy: 0.1389 - val_loss: 2.7758
Epoch 2/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 192ms/step - accuracy: 0.1100 - loss: 2.7526
Epoch 2: val_accuracy improved from 0.13889 to 0.17222, saving model to best_model.weights.h5

Epoch 2: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 201ms/step - accuracy: 0.1179 - loss: 2.7377 - val_accuracy: 0.1722 - val_loss: 2.6777
Epoch 3/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 194ms/step - accuracy: 0.1625 - loss: 2.6267
Epoch 3: val_accuracy did not improve from 0.17222
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 201ms/step - accuracy: 0.1815 - loss: 2.5924 - val_accuracy: 0.1278 - val_loss: 2.6235
Epoch 4/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 199ms/step - accuracy: 0.1902 - loss: 2.4687
Epoch 4: val_accuracy improved from 0.17222 to 0.21111, saving model to best_model.weights.h5

Epoch 4: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 209ms/step - accuracy: 0.2099 - loss: 2.4518 - val_accuracy: 0.2111 - val_loss: 2.5677
Epoch 5/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 193ms/step - accuracy: 0.2242 - loss: 2.3824
Epoch 5: val_accuracy did not improve from 0.21111
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 199ms/step - accuracy: 0.2383 - loss: 2.3670 - val_accuracy: 0.1722 - val_loss: 2.5238
Epoch 6/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.2520 - loss: 2.2870
Epoch 6: val_accuracy improved from 0.21111 to 0.23889, saving model to best_model.weights.h5

Epoch 6: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 201ms/step - accuracy: 0.2617 - loss: 2.2809 - val_accuracy: 0.2389 - val_loss: 2.4949
Epoch 7/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 192ms/step - accuracy: 0.2809 - loss: 2.2006
Epoch 7: val_accuracy did not improve from 0.23889
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 198ms/step - accuracy: 0.2815 - loss: 2.2195 - val_accuracy: 0.2278 - val_loss: 2.4674
Epoch 8/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.3085 - loss: 2.1499
Epoch 8: val_accuracy did not improve from 0.23889
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 197ms/step - accuracy: 0.3056 - loss: 2.1361 - val_accuracy: 0.2278 - val_loss: 2.4405
Epoch 9/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 197ms/step - accuracy: 0.3141 - loss: 2.0861
Epoch 9: val_accuracy did not improve from 0.23889
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 203ms/step - accuracy: 0.3191 - loss: 2.0680 - val_accuracy: 0.2333 - val_loss: 2.4490
Epoch 10/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 203ms/step - accuracy: 0.3481 - loss: 1.9850
Epoch 10: val_accuracy did not improve from 0.23889
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 209ms/step - accuracy: 0.3617 - loss: 1.9759 - val_accuracy: 0.2333 - val_loss: 2.3784
Epoch 11/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 206ms/step - accuracy: 0.3808 - loss: 1.8949
Epoch 11: val_accuracy did not improve from 0.23889
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 212ms/step - accuracy: 0.3852 - loss: 1.8957 - val_accuracy: 0.2056 - val_loss: 2.3533
Epoch 12/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 205ms/step - accuracy: 0.4157 - loss: 1.7954
Epoch 12: val_accuracy improved from 0.23889 to 0.25000, saving model to best_model.weights.h5

Epoch 12: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 215ms/step - accuracy: 0.4117 - loss: 1.8125 - val_accuracy: 0.2500 - val_loss: 2.3834
Epoch 13/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 200ms/step - accuracy: 0.4180 - loss: 1.7255
Epoch 13: val_accuracy improved from 0.25000 to 0.27778, saving model to best_model.weights.h5

Epoch 13: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 209ms/step - accuracy: 0.4377 - loss: 1.7096 - val_accuracy: 0.2778 - val_loss: 2.3281
Epoch 14/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 196ms/step - accuracy: 0.4683 - loss: 1.6268
Epoch 14: val_accuracy did not improve from 0.27778
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 202ms/step - accuracy: 0.4809 - loss: 1.6178 - val_accuracy: 0.2778 - val_loss: 2.3222
Epoch 15/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.5036 - loss: 1.4921
Epoch 15: val_accuracy improved from 0.27778 to 0.30000, saving model to best_model.weights.h5

Epoch 15: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 201ms/step - accuracy: 0.5031 - loss: 1.5020 - val_accuracy: 0.3000 - val_loss: 2.3081
Epoch 16/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.5590 - loss: 1.3502
Epoch 16: val_accuracy improved from 0.30000 to 0.31111, saving model to best_model.weights.h5

Epoch 16: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 198ms/step - accuracy: 0.5660 - loss: 1.3528 - val_accuracy: 0.3111 - val_loss: 2.4059
Epoch 17/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.5938 - loss: 1.2592
Epoch 17: val_accuracy did not improve from 0.31111
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 196ms/step - accuracy: 0.6019 - loss: 1.2570 - val_accuracy: 0.2833 - val_loss: 2.4747
Epoch 18/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.6079 - loss: 1.2261
Epoch 18: val_accuracy improved from 0.31111 to 0.31667, saving model to best_model.weights.h5

Epoch 18: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 200ms/step - accuracy: 0.6278 - loss: 1.1459 - val_accuracy: 0.3167 - val_loss: 2.5280
Epoch 19/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.6533 - loss: 1.0568
Epoch 19: val_accuracy did not improve from 0.31667
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 194ms/step - accuracy: 0.6679 - loss: 1.0196 - val_accuracy: 0.2889 - val_loss: 2.5497
Epoch 20/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 193ms/step - accuracy: 0.6854 - loss: 0.9463
Epoch 20: val_accuracy improved from 0.31667 to 0.33333, saving model to best_model.weights.h5

Epoch 20: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 202ms/step - accuracy: 0.6901 - loss: 0.9542 - val_accuracy: 0.3333 - val_loss: 2.4948
Epoch 21/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.7208 - loss: 0.8519
Epoch 21: val_accuracy improved from 0.33333 to 0.35556, saving model to best_model.weights.h5

Epoch 21: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 199ms/step - accuracy: 0.7346 - loss: 0.8214 - val_accuracy: 0.3556 - val_loss: 2.6376
Epoch 22/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.7785 - loss: 0.7131
Epoch 22: val_accuracy did not improve from 0.35556
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 194ms/step - accuracy: 0.7667 - loss: 0.7201 - val_accuracy: 0.3333 - val_loss: 2.8050
Epoch 23/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.8059 - loss: 0.6207
Epoch 23: val_accuracy improved from 0.35556 to 0.36111, saving model to best_model.weights.h5

Epoch 23: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 198ms/step - accuracy: 0.8154 - loss: 0.6049 - val_accuracy: 0.3611 - val_loss: 2.9840
Epoch 24/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.8346 - loss: 0.5363
Epoch 24: val_accuracy did not improve from 0.36111
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 197ms/step - accuracy: 0.8469 - loss: 0.5038 - val_accuracy: 0.3500 - val_loss: 2.9591
Epoch 25/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 196ms/step - accuracy: 0.8433 - loss: 0.4855
Epoch 25: val_accuracy improved from 0.36111 to 0.37222, saving model to best_model.weights.h5

Epoch 25: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 206ms/step - accuracy: 0.8543 - loss: 0.4567 - val_accuracy: 0.3722 - val_loss: 2.9416
Epoch 26/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 197ms/step - accuracy: 0.8687 - loss: 0.4142
Epoch 26: val_accuracy improved from 0.37222 to 0.40556, saving model to best_model.weights.h5

Epoch 26: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 206ms/step - accuracy: 0.8673 - loss: 0.4204 - val_accuracy: 0.4056 - val_loss: 3.0013
Epoch 27/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 196ms/step - accuracy: 0.9096 - loss: 0.3418
Epoch 27: val_accuracy did not improve from 0.40556
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 202ms/step - accuracy: 0.9111 - loss: 0.3133 - val_accuracy: 0.4056 - val_loss: 3.1194
Epoch 28/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9131 - loss: 0.2886
Epoch 28: val_accuracy improved from 0.40556 to 0.43333, saving model to best_model.weights.h5

Epoch 28: finished saving model to best_model.weights.h5
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 200ms/step - accuracy: 0.9043 - loss: 0.3080 - val_accuracy: 0.4333 - val_loss: 3.0975
Epoch 29/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9041 - loss: 0.2757
Epoch 29: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 196ms/step - accuracy: 0.9111 - loss: 0.2753 - val_accuracy: 0.3833 - val_loss: 3.4440
Epoch 30/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9120 - loss: 0.2546
Epoch 30: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 196ms/step - accuracy: 0.9185 - loss: 0.2435 - val_accuracy: 0.4000 - val_loss: 3.5275
Epoch 31/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.9387 - loss: 0.2113
Epoch 31: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9444 - loss: 0.1997 - val_accuracy: 0.4000 - val_loss: 3.5084
Epoch 32/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9421 - loss: 0.1803
Epoch 32: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9451 - loss: 0.1705 - val_accuracy: 0.3778 - val_loss: 3.7727
Epoch 33/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9547 - loss: 0.1543
Epoch 33: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 196ms/step - accuracy: 0.9512 - loss: 0.1671 - val_accuracy: 0.4056 - val_loss: 3.9306
Epoch 34/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.9597 - loss: 0.1367
Epoch 34: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9617 - loss: 0.1320 - val_accuracy: 0.3889 - val_loss: 3.7558
Epoch 35/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 188ms/step - accuracy: 0.9525 - loss: 0.1463
Epoch 35: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 194ms/step - accuracy: 0.9636 - loss: 0.1283 - val_accuracy: 0.3944 - val_loss: 3.9327
Epoch 36/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 190ms/step - accuracy: 0.9770 - loss: 0.1003
Epoch 36: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9673 - loss: 0.1198 - val_accuracy: 0.3722 - val_loss: 3.9155
Epoch 37/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.9718 - loss: 0.1154
Epoch 37: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 194ms/step - accuracy: 0.9679 - loss: 0.1133 - val_accuracy: 0.3556 - val_loss: 4.0588
Epoch 38/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 192ms/step - accuracy: 0.9746 - loss: 0.0972
Epoch 38: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 198ms/step - accuracy: 0.9698 - loss: 0.1105 - val_accuracy: 0.4111 - val_loss: 3.8488
Epoch 39/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 196ms/step - accuracy: 0.9687 - loss: 0.1028
Epoch 39: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 202ms/step - accuracy: 0.9772 - loss: 0.0892 - val_accuracy: 0.3778 - val_loss: 4.1718
Epoch 40/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 196ms/step - accuracy: 0.9776 - loss: 0.0778
Epoch 40: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 202ms/step - accuracy: 0.9753 - loss: 0.0847 - val_accuracy: 0.3833 - val_loss: 4.0151
Epoch 41/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 193ms/step - accuracy: 0.9777 - loss: 0.0928
Epoch 41: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 199ms/step - accuracy: 0.9778 - loss: 0.0940 - val_accuracy: 0.3722 - val_loss: 4.1946
Epoch 42/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 193ms/step - accuracy: 0.9851 - loss: 0.0573
Epoch 42: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 199ms/step - accuracy: 0.9833 - loss: 0.0574 - val_accuracy: 0.3778 - val_loss: 4.2338
Epoch 43/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 192ms/step - accuracy: 0.9824 - loss: 0.0640
Epoch 43: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 197ms/step - accuracy: 0.9840 - loss: 0.0670 - val_accuracy: 0.3667 - val_loss: 4.3275
Epoch 44/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 206ms/step - accuracy: 0.9923 - loss: 0.0478
Epoch 44: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m11s[0m 212ms/step - accuracy: 0.9883 - loss: 0.0538 - val_accuracy: 0.4167 - val_loss: 4.2767
Epoch 45/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.9770 - loss: 0.0671
Epoch 45: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 197ms/step - accuracy: 0.9821 - loss: 0.0606 - val_accuracy: 0.3778 - val_loss: 4.7226
Epoch 46/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.9826 - loss: 0.0654
Epoch 46: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9809 - loss: 0.0682 - val_accuracy: 0.3722 - val_loss: 4.4686
Epoch 47/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 191ms/step - accuracy: 0.9820 - loss: 0.0526
Epoch 47: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 197ms/step - accuracy: 0.9877 - loss: 0.0433 - val_accuracy: 0.3278 - val_loss: 4.9103
Epoch 48/100
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 189ms/step - accuracy: 0.9854 - loss: 0.0526
Epoch 48: val_accuracy did not improve from 0.43333
[1m51/51[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m10s[0m 195ms/step - accuracy: 0.9827 - loss: 0.0570 - val_accuracy: 0.3556 - val_loss: 4.6581
Epoch 48: early stopping

五、模型评估

1. Loss与Accuracy图

from datetime import datetime
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()

请添加图片描述

2. 指定图片进行预测

from PIL import Image
import numpy as np
import tensorflow as tf

# 1. 定义和训练时完全一样的参数
img_height, img_width = 224, 224
data_dir = "D:/Adashujuxuexi/T6/48-data"

# 2. 先获取 class_names(和训练时一致)
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=32
)
class_names = train_ds.class_names

# 3. 定义和训练时完全一样的模型结构(关键!)
from tensorflow.keras import models, layers
model = models.Sequential([
    layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    layers.Conv2D(16, (3, 3), activation='relu'),
    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.Dense(len(class_names))
])

# 4. 加载训练时保存的权重(用正确的文件名!)
model.load_weights('best_model.weights.h5')  # 修正:和训练时的文件名一致

# 5. 加载并预处理图片
img = Image.open("D:/Adashujuxuexi/T6/48-data/Jennifer Lawrence/003_963a3627.jpg")
image = tf.image.resize(img, [img_height, img_width])
img_array = tf.expand_dims(image, 0)

# 6. 预测并输出结果
predictions = model.predict(img_array)
print("预测结果为:", class_names[np.argmax(predictions)])
Found 1800 files belonging to 17 classes.
Using 1620 files for training.
[1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 83ms/step
预测结果为: Jennifer Lawrence

个人总结
这次 T6 周的好莱坞明星识别项目,我完整走完了深度学习的一整套流程,从环境配置、数据加载、预处理,到搭建 CNN 网络、设置动态学习率、早停和保存最优模型,再到最后训练、可视化和单张图片预测,收获特别大。
一开始因为版本问题踩了不少坑,比如experimental报错、权重文件名不匹配、模型结构不一致这些问题,一步步排查下来,终于搞懂了新版 Keras 的规范。训练过程中能明显看到训练准确率一直在上升,但验证集准确率波动很大,也直观感受到了过拟合的现象,理解了 Dropout 和早停的作用。
整体做完,我对 CNN 的结构、训练流程、损失函数和优化器的使用都更熟练了,也学会了怎么排查代码报错,整个过程虽然有点折腾,但真的学到了很多实用的东西。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐