我正在尝试使用 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])
希望有帮助!
添加回答
举报
0/150
提交
取消