实战播:
怎么判定一个模型好不好,你设置的值对不对? 需要再看几个值:
例如:
model = Sequential()for units in model_structure:model.add(Dense(units, activation='relu'))model.add(Dropout(train_config.get('dropout_rate', 0.3)))model.add(Dense(1, activation='sigmoid'))
他的训练集表现损失值不好! 一直维持在0.68+;这就需要不好了;
那么 模型的损失(loss)值表现不佳 怎么解决这个问题?
-
调整学习率:如果学习率过高,可能导致损失值波动,建议尝试降低学习率,例如使用学习率衰减策略来动态调整学习率。(这个可以看我之前的:创作中心-CSDN)
-
数据增强:如果训练数据集规模较小,可以使用数据增强技术,例如随机旋转、剪裁等,增强数据的多样性和模型的泛化能力。(因为我现在是一个2分类问题,全部都是数据,所以就不考虑;唯一的方式就是增加数据量!)
-
模型正则化:增加Dropout层或使用L1/L2正则化,防止模型过拟合。例如,Dropout的概率可以调整为0.2到0.5之间。
-
调整网络结构:尝试不同的模型结构,比如增加或减少神经元的数量,或者导入复杂的层结构(例如,残差连接)来改善模型性能。
-
批量大小(Batch Size)调整:确保Batch Size适中,过小可能导致不稳定,过大则可能导致计算不精确。可以尝试调整Batch Size以优化训练过程。
dense层和dropout层:
想象你正在训练一只机器人助手,它需要学会识别不同的水果。这个机器人有很多“小助手”(神经元),它们一起合作来完成任务。
-
Dense层(全连接层)
- 小助手A:负责把水果的特征(颜色、形状、大小)整理成一份报告。
- 小助手B:负责根据这份报告,判断水果是苹果、香蕉还是橘子。
- 小助手C:负责把判断结果转化为机器人能理解的指令,比如“抓取苹果”。
- 每个小助手都和其他小助手紧密合作,确保信息传递准确无误。
在代码中,Dense(units, activation='relu') 就是添加一个全连接层,units 是小助手的数量,activation='relu' 是小助手们合作时使用的方式(ReLU激活函数)。
-
Dropout层
- 在训练过程中,为了让小助手们不要过于依赖某些特定的水果特征,机器人会随机让部分小助手“休息”。
- 比如,今天小助手A和B休息了,小助手C和D继续工作。这样,机器人学会了在不同的小助手组合下完成任务,变得更加灵活和稳定。
在代码中,Dropout(train_config.get('dropout_rate', 0.3)) 就是设置让30%的小助手随机“休息”,以防止过拟合。
总结
- Dense层:像是一个团队,每个成员都紧密合作,负责特定的任务。
- Dropout层:像是一个轮换机制,确保团队成员不会过于依赖某些特定的成员,从而提升整体的适应能力。
案例表达: (模型正则化)
1.当我尝试把dropout_rate从0.3调到0.5
... (原先是0.71-->0.68,同时准确率维持在0.55+)
model.add(Dropout(train_config.get('dropout_rate', 0.5)))
2.现在我把代码改为正则化:
model = Sequential()
for units in model_structure:model.add(Dense(units, activation='relu', kernel_regularizer=regularizers.l2(0.01))) # 使用L2正则化# model.add(Dense(units, activation='relu', kernel_regularizer=regularizers.l1(0.01))) # 使用L1正则化
model.add(Dense(1, activation='sigmoid'))
在此代码中,kernel_regularizer=regularizers.l2(0.01)添加了L2正则化,而kernel_regularizer=regularizers.l1(0.01)则为L1正则化。
因此,当我使用L1或者L2之后,还没有之前的手动效果好! 因此,这个训练集--->舍弃正则化!!!
L1与L2正则化的定义
- L1正则化(Lasso回归):通过在损失函数中增加权重绝对值的和作为惩罚项,从而驱使某些权重减小到零,生成稀疏解,适合特征选择.
- L2正则化(Ridge回归):通过增加权重平方和作为惩罚项,促使所有权重趋向较小的均匀值,而不是完全为零。它通过减少权重避免过拟合,增强模型的稳定性.
这两种正则化方法可以在模型中结合使用,以提高模型的泛化能力和抗干扰能力。
训练集(loss)和验证集(val_loss)
- 训练集(loss):这就像是在练习题上不断练习,模型在这些题目上越来越熟练,错误越来越少。loss值越小,说明模型在训练数据上表现越好。
- 验证集(val_loss):这就像是在考试题目上测试,loss值越小,说明模型在真实数据上的表现越好。
训练集(accuracy)和验证集(val_accuracy)
- 训练集(accuracy):这就像是在练习题上答对的比例,accuracy越高,说明模型在训练数据上越熟练。
- 验证集(val_accuracy):这就像是在考试题上答对的比例,accuracy越高,说明模型在真实数据上的表现越好。
数据
- epoch 1:模型刚开始训练,loss和val_loss都很高,accuracy和val_accuracy也很低。就像刚上学的孩子,刚开始学东西,什么都不会。
- epoch 5:loss和val_loss都在下降,accuracy和val_accuracy也在上升。就像孩子逐渐掌握知识,练习题和考试题都能答对更多。
- epoch 10:loss和val_loss继续下降,accuracy和val_accuracy继续上升。就像孩子越来越熟练,考试成绩也越来越好。
- epoch 15:loss和val_loss下降变慢,accuracy和val_accuracy也趋于稳定。就像孩子已经掌握了大部分知识,进一步提高需要更多的努力。
总结
数据表示:
模型在训练过程中的表现,
loss和val_loss越小,accuracy和val_accuracy越高,说明模型越来越好。
就像孩子从不会到会,从生疏到熟练,再到精通,这是一个不断学习和进步的过程。