为了账号安全,请及时绑定邮箱和手机立即绑定

训练损失低,验证损失高,验证准确率低

训练损失低,验证损失高,验证准确率低

月关宝盒 2022-01-11 20:30:58
我正在尝试使用 Keras(TensorFlow 作为后端)获得良好的准确性,categorical_crossentropy用于多类分类问题(心脏病数据集)。我的模型可以达到很好的训练准确率,但验证准确率低(验证损失高)。我已经尝试过过度拟合的解决方案(例如,归一化、辍学、正则化等),但我仍然遇到同样的问题。到目前为止,我一直在玩优化器、损失、时期和批次大小,但没有成功。这是我正在使用的代码:import pandas as pdimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.optimizers import SGD,Adamfrom keras.layers import Dense, Dropoutimport numpy as npfrom sklearn.preprocessing import StandardScalerfrom sklearn.impute import SimpleImputerfrom keras.utils import to_categoricalfrom sklearn.model_selection import train_test_splitfrom keras.models import load_modelfrom keras.regularizers import l1,l2# fix random seed for reproducibilitynp.random.seed(5)data = pd.read_csv('ProcessedClevelandData.csv',delimiter=',',header=None)#Missing ValuesImp=SimpleImputer(missing_values=np.nan,strategy='mean',copy=True)Imp=Imp.fit(data.values)Imp.transform(data)X = data.iloc[:, :-1].valuesy=data.iloc[:,-1].valuesy=to_categorical(y)X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.1)scaler = StandardScaler()X_train_norm = scaler.fit_transform(X_train)X_test_norm=scaler.transform(X_test)# create modelmodel = Sequential()model.add(Dense(13, input_dim=13, activation='relu',use_bias=True,kernel_regularizer=l2(0.0001)))#model.add(Dropout(0.05))model.add(Dense(9, activation='relu',use_bias=True,kernel_regularizer=l2(0.0001)))#model.add(Dropout(0.05))model.add(Dense(5,activation='softmax'))sgd = SGD(lr=0.01, decay=0.01/32, nesterov=False)# Compile modelmodel.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])#adam,adadelta,print(model.summary())history=model.fit(X_train_norm, y_train,validation_data=(X_test_norm,y_test), epochs=1200, batch_size=32,shuffle=True)# list all data in historyprint(history.history.keys())
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

除非你真的有一个大数据集,否则通过将验证大小增加到大约 30% 来帮助自己。甚至经常使用 50/50。


请记住,良好的损失和 acc 与坏的 val_loss 和 val_acc 意味着过度拟合。


试试这个基本的解决方案:


from keras.callbacks import EarlyStopping, ReduceLROnPlateau


early_stop = EarlyStopping(monitor='val_loss',patience=10)

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1,

                              patience=6, verbose=1, mode='auto',

                              min_delta=0.0001, cooldown=0, min_lr=1e-8)


history = model.fit(X,y,num_epochs=666,callbacks=[early_stop,reduce_lr])

希望有帮助!


查看完整回答
反对 回复 2022-01-11
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

问题可能是您的数据在训练和测试拆分中分布不均(如评论中所述)。尝试查看分布是否不均匀,如果是,请尝试不同的种子。我之前在使用小型医疗数据集时也遇到过类似的问题。数据集越小,分割数据集不能准确表示真实分布的可能性就越高。

编辑:根据您设置种子的方式,您可以 np.random.seed(my_seed)为 numpy 设置它,或者random.seed(my_seed)为 python 模块设置它,或者为 keras 设置它,请按照他们的文档


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 599 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号