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

我正在尝试使用 Keras(TensorFlow 作为后端)获得良好的准确性,categorical_crossentropy用于多类分类问题(心脏病数据集)。我的模型可以达到很好的训练准确率,但验证准确率低(验证损失高)。我已经尝试过过度拟合的解决方案(例如,归一化、辍学、正则化等),但我仍然遇到同样的问题。到目前为止,我一直在玩优化器、损失、时期和批次大小,但没有成功。这是我正在使用的代码:


import pandas as pd

import matplotlib.pyplot as plt

from keras.models import Sequential

from keras.optimizers import SGD,Adam

from keras.layers import Dense, Dropout

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.impute import SimpleImputer

from keras.utils import to_categorical

from sklearn.model_selection import train_test_split

from keras.models import load_model

from keras.regularizers import l1,l2

# fix random seed for reproducibility

np.random.seed(5)

data = pd.read_csv('ProcessedClevelandData.csv',delimiter=',',header=None)

#Missing Values

Imp=SimpleImputer(missing_values=np.nan,strategy='mean',copy=True)

Imp=Imp.fit(data.values)

Imp.transform(data)

X = data.iloc[:, :-1].values

y=data.iloc[:,-1].values


y=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 model

model = 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 model

model.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 history

print(history.history.keys())


月关宝盒
浏览 600回答 2
2回答

FFIVE

除非你真的有一个大数据集,否则通过将验证大小增加到大约 30% 来帮助自己。甚至经常使用 50/50。请记住,良好的损失和 acc 与坏的 val_loss 和 val_acc 意味着过度拟合。试试这个基本的解决方案:from keras.callbacks import EarlyStopping, ReduceLROnPlateauearly_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])希望有帮助!

梦里花落0921

问题可能是您的数据在训练和测试拆分中分布不均(如评论中所述)。尝试查看分布是否不均匀,如果是,请尝试不同的种子。我之前在使用小型医疗数据集时也遇到过类似的问题。数据集越小,分割数据集不能准确表示真实分布的可能性就越高。编辑:根据您设置种子的方式,您可以 np.random.seed(my_seed)为 numpy 设置它,或者random.seed(my_seed)为 python 模块设置它,或者为 keras 设置它,请按照他们的文档。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python