Python:神经网络 - TypeError:'History' 对象不可订阅

新手上路,请多包涵

我一直在 python 中使用 Keras 和 Tensorflow 练习构建和比较神经网络,但是当我想要绘制模型进行比较时,我收到一个错误:

 TypeError: 'History' object is not subscriptable

这是我的三个模型的代码:

 ############################## Initiate model 1 ###############################
# Model 1 has no hidden layers
from keras.models import Sequential
model1 = Sequential()

# Get layers
from keras.layers import Dense
# Add first layer
n_cols = len(X.columns)
model1.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add output layer
model1.add(Dense(units=2, activation='softmax'))

# Compile the model
model1.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])

# Define early_stopping_monitor
from keras.callbacks import EarlyStopping
early_stopping_monitor = EarlyStopping(patience=2)

# Fit model
model1.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)

############################## Initiate model 2 ###############################
# Model 2 has 1 hidden layer that has the mean number of nodes of input and output layer
model2 = Sequential()

# Add first layer
model2.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add hidden layer
import math
model2.add(Dense(units=math.ceil((n_cols+2)/2), activation='relu'))
# Add output layer
model2.add(Dense(units=2, activation='softmax'))

# Compile the model
model2.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])

# Fit model
model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)

############################## Initiate model 3 ###############################
# Model 3 has 1 hidden layer that is 2/3 the size of the input layer plus the size of the output layer
model3 = Sequential()

# Add first layer
model3.add(Dense(units=n_cols, activation='relu', input_shape=(n_cols,)))
# Add hidden layer
model3.add(Dense(units=math.ceil((n_cols*(2/3))+2), activation='relu'))
# Add output layer
model3.add(Dense(units=2, activation='softmax'))

# Compile the model
model3.compile(loss='categorical_crossentropy', optimizer='adam', metrics=
['accuracy'])

# Fit model
model3.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)

# Plot the models
plt.plot(model1.history['val_loss'], 'r', model2.history['val_loss'], 'b',
model3.history['val_loss'], 'g')
plt.xlabel('Epochs')
plt.ylabel('Validation score')
plt.show()

我在运行我的任何模型、获取预测概率、绘制 ROC 曲线或绘制 PR 曲线方面都没有问题。但是,当我尝试将这三条曲线绘制在一起时,我的代码的这个区域出现错误:

 model1.history['val_loss']

TypeError: 'History' object is not subscriptable

有没有人有过此类错误的经验并且可以引导我做错什么?

先感谢您。

原文由 Aaron England 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

Call to model.fit() returns a History object that has a member history , which is of type dict .

所以你可以替换:

 model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)

history2 = model2.fit(X, y, validation_split=0.33, epochs=30, callbacks=
[early_stopping_monitor], verbose=False)

其他模型也是如此。

然后你可以使用:

 plt.plot(history1.history['val_loss'], 'r', history2.history['val_loss'], 'b',
history3.history['val_loss'], 'g')

原文由 Krishna 发布,翻译遵循 CC BY-SA 4.0 许可协议

接受的答案很棒。但是,如果有人试图在健身期间访问历史记录而不存储它,请尝试以下操作:

由于 val_loss 不是 History 对象上的属性,也不是可以索引的键,因此您编写它的方式将不起作用。但是,您可以尝试访问 --- 对象中的属性 history History 对象,它是一个应该包含 val_loss 的字典。

所以,更换:

 plt.plot(model1.history['val_loss'], 'r', model2.history['val_loss'], 'b',
model3.history['val_loss'], 'g')

plt.plot(model1.history.history['val_loss'], 'r', model2.history.history['val_loss'], 'b',
model3.history.history['val_loss'], 'g')

原文由 Gabriel Giraldo-Wingler 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题