如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?

Posted

技术标签:

【中文标题】如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?【英文标题】:How to plot training loss and accuracy curves for a MLP model in Keras? 【发布时间】:2019-03-07 23:15:10 【问题描述】:

我正在使用 Keras 对神经网络进行建模,并尝试使用 accval_acc 的图表对其进行评估。我在以下代码行中有 3 个错误:

    print(history.keys()) 错误是function' object has not attribute 'keys'y_pred = classifier.predict(X_test) 错误是name 'classifier' is not definedplt.plot(history.history['acc']) 错误是'History' object is not subscriptable

我也在尝试绘制 ROC 曲线,我该怎么做?

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense
from sklearn import cross_validation
from matplotlib import pyplot
from keras.utils import plot_model

dataset = pd.read_csv('Data_BP.csv')
X = dataset.iloc[:, 0:11].values
y = dataset.iloc[:, -1].values

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size = 0.2, random_state = 0)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

def Model():
    classifier = Sequential()
    classifier.add(Dense(units = 12, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11))
    classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu'))
    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
    classifier.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics = ['mse', 'acc'])
    return classifier

classifier = Model()
history = classifier.fit(X_train, y_train, validation_split=0.25, batch_size = 10, epochs = 5)

print('\n', history.history.keys())

y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)

from sklearn.metrics import recall_score, classification_report, auc, roc_curve
cm = confusion_matrix(y_test, y_pred)
print(cm)


plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

应该增加什么功能?

【问题讨论】:

【参考方案1】:

在以下几行中将history更改为classifier(实际上History对象是fitModel对象上调用的方法的返回值)如下:

classifier = Model()
history = classifier.fit(...)

不要将fit 方法的返回值与您的模型混淆。 History 对象,顾名思义,只包含训练的历史。但是,您的模型是 classifier 和 it is the one that has methods,例如 fit()predict()evaluate()compile() 等。

另外,History 对象有一个名为history 的属性,它是一个包含训练期间损失值和指标值的字典。因此,您需要改用print(history.history.keys())

现在,如果您想在训练期间绘制损失曲线(即每个时期结束时的损失),您可以这样做:

loss_values = history.history['loss']
epochs = range(1, len(loss_values)+1)

plt.plot(epochs, loss_values, label='Training Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

【讨论】:

@Diego 如果您按上述方式更改代码,则不应出现错误 2。对于错误1,使用print(history.history.keys()) @Diego 我已经更新了我的答案。现在所有问题都解决了吗? 更新到history = classifier.fit(X_train, y_train, validation_split=0.25, batch_size = 10, epochs = 5),我在y_pred = history.predict (X_test)中收到以下错误'History' object has no attribute 'predict' @Diego 你不应该使用history。您的模型存储在classifier 中,即Sequential model。 history,顾名思义,只包含训练的历史。请在 classifier 上致电 predictfitevaluate。请参阅我的更新答案。 如何在顺序模型中实现预测功能?

以上是关于如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?的主要内容,如果未能解决你的问题,请参考以下文章

MLP初始化Keras中的LSTM细胞状态

小白学习keras教程一基于波士顿住房数据集训练简单的MLP回归模型

从 history.history Keras 序列中绘制模型损失和模型准确性

如何在 Keras 模型中使用 TensorFlow 的采样 softmax 损失函数?

keras:如何在训练前获得初始损失函数值

Keras LSTM 模型过拟合