29

I have been practicing building and comparing neural networks using Keras and Tensorflow in python, but when I look to plot the models for comparisons I am receiving an error:

TypeError: 'History' object is not subscriptable

Here is my code for the three models:

############################## 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()

I have no problems with running any of my models, getting predicted probabilities, plotting ROC curves, or plotting PR curves. However, when I attempt to plot the three curves together I am getting an error from this area of my code:

model1.history['val_loss']

TypeError: 'History' object is not subscriptable

Does anyone have experience with this type of error and can lead me to what I am doing wrong?

Thank you in advance.

2
  • 9
    try model1.history.history['val_loss'] and similarly for others. Commented Aug 7, 2018 at 16:18
  • @krishna that worked great. Thank you Commented Aug 7, 2018 at 17:38

4 Answers 4

34

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

So you can replace :

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

with

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

Similarly for other models.

and then you can use :

plt.plot(history1.history['val_loss'], 'r', history2.history['val_loss'], 'b', 
history3.history['val_loss'], 'g')
Sign up to request clarification or add additional context in comments.

1 Comment

Worked like a charm. Thanks for the insight!
6

The accepted answer is great. However, in case anyone is trying to access history without storing it during fit, try the following:

Since val_loss is not an attribute on the History object and not a key that you can index with, the way you wrote it won't work. However, what you can try is to access the attribute history in the History object, which is a dict that should contain val_loss as a key.

so, replace:

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

with

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

Comments

0

I used some of the answers and the next code works for me:`

#Training the ANN
history=classifier.fit(X_train, y_train, batch_size=10, epochs=1000).history
print("Trained finished")

#the graphic
import matplotlib.pyplot as plt
plt.xlabel("#Epoch")
plt.ylabel("Maagnitud de perdida")
plt.plot(history["loss"])

`

wish it help you

Comments

-1
history =  model.fit(trainX, trainy, batch_size=50, epochs=200, validation_split=0.3,callbacks=[tensorboard]).history

This is another solution have to include .history at the end of the model fit

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.