关于卷积神经网络中准确率和损失率曲线的问题

卷积神经网络训练模型出现如图的情况,半路入门也不是很懂,本科毕业设计要用在里面。为什么准确率曲线里验证集会剧烈下降,然后就放平了呢?然后损失率曲线的验证集又是这么平滑的s型曲线,这样正常吗。

模型是alexnet,设置的动态学习率,初始学习率为0.001,2次迭代没提升就会衰减0.1,样本量很小只有400多张,用测试集做验证集大概30张。batchsize是32。损失函数和评价指标函数是这两个:loss = 'categorical_crossentropy', metrics=['accuracy']

img

img

平稳是正常训练反应代表你的损失率降低,要是有起伏的话是过拟合了,多增加点样本数据去测试,去了解下:https://blog.csdn.net/weixin_44023658/article/details/106177580

验证集大概30张: 样本量太小了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,对于训练样本只有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]
    )
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^