卷积神经网络训练模型出现如图的情况,半路入门也不是很懂,本科毕业设计要用在里面。为什么准确率曲线里验证集会剧烈下降,然后就放平了呢?然后损失率曲线的验证集又是这么平滑的s型曲线,这样正常吗。
模型是alexnet,设置的动态学习率,初始学习率为0.001,2次迭代没提升就会衰减0.1,样本量很小只有400多张,用测试集做验证集大概30张。batchsize是32。损失函数和评价指标函数是这两个:loss = 'categorical_crossentropy', metrics=['accuracy']
平稳是正常训练反应代表你的损失率降低,要是有起伏的话是过拟合了,多增加点样本数据去测试,去了解下:https://blog.csdn.net/weixin_44023658/article/details/106177580
验证集大概30张: 样本量太小了
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,对于训练样本只有400多张的情况下,使用测试集做验证集的方式并不合适,因为这可能会导致过拟合的情况。因此,建议您重新划分数据集,使用80%的数据集进行训练,20%的数据集进行验证。
关于准确率曲线剧烈下降后放缓的情况,这可能是由于学习率过高导致的。学习率的设置对模型的训练非常重要,如果设置太高,训练过程可能会发生震荡现象;如果设置过低,则会导致训练速度过慢。建议您降低学习率并加入学习率衰减机制,在损失不再下降时及时停止训练。
对于损失率曲线看起来像是一条平滑的 S 型曲线的情况,这是正常的。因为损失率曲线与准确率曲线之间存在一定的反比关系,一般情况下,训练初期的损失率下降速度比准确率提高速度要快,随着训练的进行,损失率下降速度变慢,准确率提高速度变慢,因此曲线呈现出平滑的S型。
下面是示例代码,供参考:
import tensorflow as tf
from tensorflow.keras.applications import AlexNet
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 数据集的路径
train_dir = 'path_to_train_dir'
val_dir = 'path_to_val_dir'
# 训练和验证集的大小
train_size = 800
val_size = 200
# 设置批次大小和输入维度
batch_size = 32
input_shape = (224, 224, 3)
# 使用数据增强来增加数据量
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
val_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=input_shape[:-1],
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
val_generator = val_datagen.flow_from_directory(
val_dir,
target_size=input_shape[:-1],
batch_size=batch_size,
class_mode='categorical',
shuffle=True
)
# 构建模型
model = AlexNet(input_shape=input_shape, weights=None, classes=10)
# 设置优化器和损失函数
sgd = SGD(lr=0.01, momentum=0.9, decay=0.001)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
# 设置学习率衰减
lr_scheduler = tf.keras.callbacks.ReduceLROnPlateau(
monitor='val_loss', factor=0.1, patience=5, min_lr=0.00001
)
# 训练模型
model.fit(
train_generator,
steps_per_epoch=train_size // batch_size,
epochs=50,
validation_data=val_generator,
validation_steps=val_size // batch_size,
callbacks=[lr_scheduler]
)