如何在 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 对神经网络进行建模,并尝试使用 acc
和 val_acc
的图表对其进行评估。我在以下代码行中有 3 个错误:
-
在
print(history.keys())
错误是function' object has not attribute 'keys'
在y_pred = classifier.predict(X_test)
错误是name 'classifier' is not defined
在plt.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
对象是fit
在Model
对象上调用的方法的返回值)如下:
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
上致电 predict
或 fit
或 evaluate
。请参阅我的更新答案。
如何在顺序模型中实现预测功能?以上是关于如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?的主要内容,如果未能解决你的问题,请参考以下文章
小白学习keras教程一基于波士顿住房数据集训练简单的MLP回归模型
从 history.history Keras 序列中绘制模型损失和模型准确性