我目前正在使用神经网络训练数据,并使用fit函数进行训练。
history = model.fit(X, encoded_Y, batch_size=50, nb_epoch=500, validation_split=0.2, verbose=1)
我已经将validation_split
设置为20%。我的理解是训练数据将占80%,测试数据将占20%。我对后端如何处理这些数据感到困惑。是不是像前80%的样本用于训练,而后20%的样本用于测试,还是从中间随机挑选样本?如果我想提供单独的训练和测试数据,我该如何使用model.fit()
来实现?
此外,我的第二个担忧是如何检查数据是否很好地适应模型?我从结果中看到训练准确率大约为90%,而验证准确率大约为55%。这是否意味着这是过拟合还是欠拟合的情况?
我的最后一个问题是,evaluate函数返回什么?文档说它返回损失值,但我已经在每个epoch中通过fit()函数(在history
中)获取了损失和准确率。evaluate返回的准确率和分数显示了什么?如果evaluate返回的准确率为90%,我可以说我的数据很好地适应了模型,而不管每个epoch的个体准确率和损失如何吗?
以下是我的代码:
import numpyimport pandasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Dense, Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom sklearn.model_selection import cross_val_scorefrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import StratifiedKFoldfrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinefrom keras.utils import np_utilsfrom sklearn.model_selection import KFoldfrom sklearn.metrics import confusion_matriximport itertoolsseed = 7numpy.random.seed(seed)dataframe = pandas.read_csv("INPUTFILE.csv", skiprows=range(0, 0))dataset = dataframe.valuesX = dataset[:,0:50].astype(float) # 列数-1Y = dataset[:,50]encoder = LabelEncoder()encoder.fit(Y)encoded_Y = encoder.transform(Y)encoded_Y = np_utils.to_categorical(encoded_Y)print("encoded_Y=", encoded_Y) # 基线模型def create_baseline(): # 创建模型 model = Sequential() model.add(Dense(5, input_dim=5, kernel_initializer='normal', activation='relu')) model.add(Dense(5, kernel_initializer='normal', activation='relu')) #model.add(Dense(2, kernel_initializer='normal', activation='sigmoid')) model.add(Dense(2, kernel_initializer='normal', activation='softmax')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 用于二分类 #model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 用于多类别 return model model=create_baseline();history=model.fit(X, encoded_Y, batch_size=50, nb_epoch=500, validation_split = 0.2, verbose=1)print(history.history.keys())# 列出history中的所有数据print(history.history.keys())# 总结准确率历史plt.plot(history.history['acc'])plt.plot(history.history['val_acc'])plt.title('模型准确率')plt.ylabel('准确率')plt.xlabel('epoch')plt.legend(['训练', '测试'], loc='upper left')plt.show()# 总结损失历史plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('模型损失')plt.ylabel('损失')plt.xlabel('epoch')plt.legend(['训练', '测试'], loc='upper left')plt.show()pre_cls=model.predict_classes(X) cm1 = confusion_matrix(encoder.transform(Y),pre_cls)print('混淆矩阵 : \n')print(cm1)score, acc = model.evaluate(X,encoded_Y)print('测试分数:', score)print('测试准确率:', acc)
回答: