【模型训练】loss和accuracy变化的调整方向

 

序言

  • 模型训练过程中,loss和accuracy不同的变化趋势是什么原因,如何调整

对loss和accuracy的理解

  • loss可以很大,但accuracy只能是0~1
  • loss评价模型的训练程度,accuracy评价模型的好坏
  • loss是给模型看的,用来优化参数实现梯度下降,accuracy是给人看的,用来衡量网络好坏的指标,同样的 P/R/F1等也都是给人看的
  • 模型的好坏,loss函数定义的好坏,最终都要体现在accuracy上,评估应该主要看accuracy

1. 验证loss先减小后增大,验证acc先上升后下降

  • 训练loss一直下降,训练accuracy一直上升,而验证loss先减小后增大,验证acc先上升后下降

  • 可能原因:这种情况可能是训练集和验证集数据分布不一样,或者训练集过小,未包含验证集中的所有情况。也就是过拟合

    • 即对已知数据预测很好,表现为训练loss不断减小训练acc不断提升,但是验证loss先减小后增大,验证acc也先上升后下降
    • 模型开始学习仅和训练数据有关的模式,而不是学习到了数据本质特征
  • 应对方法:即如何应对过拟合

    • (优先)调整学习率:使用学习率衰减机制,避免陷入局部最优无法进一步减小loss
    • (优先)增加训练样本
    • (优先)调整超参:如batch_size,分类阈值,hidden_size也可以调整
    • (其次)加入early stop:验证loss上升的几个epoch直接停止,侧重验证acc上升即可
    • (其次)增加正则项系数权重,减小过拟合
    • (其次)dropout随机失活:随机失活使得每次更新梯度时参与计算的网络参数减小了,降低了模型容量,所以能防止过拟合
    • (其次)交叉验证:将数据划分为几个子集,使用不同的子集进行训练和验证,以评估模型的泛化能力选择最佳模型
    • (其次)采用focal loss:增加困难样本权重,使模型专注于难分类的样本
### 训练CNN卷积神经网络模型 训练CNN(卷积神经网络)涉及准备数据集、构建网络架构、定义损失函数以及优化过程。以下是关于这些方面的详细介绍。 #### 数据预处理 为了使输入的数据适合于CNN的学习,在正式训练之前通常会对原始图片执行标准化操作,比如调整大小到统一尺寸、灰度化或色彩空间转换等[^1]。对于特定应用领域如人脸识别,则可能还需要额外的人脸对齐步骤以提高准确性[^2]。 #### 构建网络结构 一个典型的CNN由多层组成,主要包括卷积层(Convolutional Layer),用于自动学习图像特征;池化层(Pooling Layer), 减少计算量并防止过拟合;最后接上全连接层(Fully Connected Layers)完成分类任务或其他目标预测工作。每一层都含有可调节权重参数,它们将在后续阶段被不断更新直至收敛至最优状态。 #### 定义损失函数与评估指标 选择合适的损失函数至关重要,它决定了模型性能好坏的标准。常见的二元交叉熵(Binary Cross Entropy Loss)适用于二分类问题,而多类别情况下则可以考虑使用softmax加负对数似然(Negative Log Likelihood, NLL)。此外还需设定一些评价标准用来衡量测试样本上的表现情况,例如准确率(Accuracy)、精确度(Precision)、召回率(Recall)等。 #### 反向传播算法与梯度下降法 一旦前向传递完成了从输入到输出整个流程之后,就需要利用反向传播机制来计算各层之间的误差,并据此调整相应的权值矩阵W偏置b。具体来说就是按照链式法则求导得到每一步变化方向及其幅度,再借助随机梯度下降(SGD)或者AdamOptimizer这样的迭代方法逐步逼近全局极小值点。 ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10)) model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值