简体   繁体   中英

AttributeError: 'History' object has no attribute 'predict_classes'

I'm trying to to use keras to create a classifier but I can't generate some class predictions from my test set for some reason. To do so I'm using the following model.

def get_model():          #takes ch1, ch2, y_train

nclass = 6
#Channel 1
ch1_input = Input(shape=X_train_ch1[0].shape)       #(3000,1)
signal_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(ch1_input)
signal_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(signal_1)
signal_1 = MaxPool1D(pool_size=2)(signal_1)
signal_1 = SpatialDropout1D(rate=0.1)(signal_1)
signal_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(signal_1)
signal_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(signal_1)
signal_1 = MaxPool1D(pool_size=2)(signal_1)
signal_1 = SpatialDropout1D(rate=0.)(signal_1)
signal_1 = Convolution1D(64, kernel_size=3, activation=activations.relu, padding="valid")(signal_1)
signal_1 = Convolution1D(64, kernel_size=3, activation=activations.relu, padding="valid")(signal_1)
flatten_1 = Flatten()(signal_1)

#Channel 2
ch2_input = Input(shape=X_train_ch2[0].shape)
signal_2 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(ch2_input)
signal_2 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(signal_2)
signal_2 = MaxPool1D(pool_size=2)(signal_2)
signal_2 = SpatialDropout1D(rate=0.1)(signal_2)
signal_2 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(signal_2)
signal_2 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(signal_2)
signal_2 = MaxPool1D(pool_size=2)(signal_2)
signal_2 = SpatialDropout1D(rate=0.2)(signal_2)
signal_2 = Convolution1D(64, kernel_size=3, activation=activations.relu, padding="valid")(signal_2)
signal_2 = Convolution1D(64, kernel_size=3, activation=activations.relu, padding="valid")(signal_2)
flatten_2 = Flatten()(signal_2)

# merge CNN's being trained on each channel 
merged = concatenate([flatten_1, flatten_2])

# Output
dense_1 = Dropout(rate=0.15)(Dense(64, activation=activations.relu, name="dense_1")(merged))
#dense_1 = Dense(, activation=activations.relu)(dense_1)
dense_1 = Dropout(rate=0.25)(Dense(32, activation=activations.relu, name="dense_2")(dense_1))
dense_1 = Dense(nclass, activation=activations.softmax, name="dense_3")(dense_1)

# Compile model 
model = Model(inputs=[ch1_input, ch2_input], outputs=dense_1)
model.compile(loss='categorical_crossentropy',
          optimizer='adam',
          metrics=['accuracy'])
model.summary()
print(model.summary)
return model

#  --------------------------- Create train data and model
sequence = Standardise_and_Augment(sequence)  
X_train_ch1, X_train_ch2, X_test_ch1, X_test_ch2, X_test, y_train, y_test = Process_data()  
y_flat = np.argmax(y_train, axis=1) 
model = get_model()

#  ---------------------------  Run model 
ch_model = model.fit([X_train_ch1,X_train_ch2], y_train, epochs=20, batch_size=32, 
                 validation_split=0.2 ,class_weight='auto', shuffle = True)

#  ---------------------------  Get get class breakdown
from sklearn.metrics import classification_report

Y_test = np.argmax(y_test, axis=1) # Convert one-hot to index
y_pred = ch_model.predict_classes(X_test)
print(classification_report(Y_test, y_pred))

Running this gives AttributeError: 'History' object has no attribute 'predict_classes' I know my model history is being stored as I can generate graphs of my models performance by running:

# Plot model accuracy 
plt.subplot(2, 1, 1)
plt.plot(ch_model.history['accuracy'])
plt.plot(ch_model.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.show()

All solutions to this error that I've seen so far have been about using sequential model which I'm sure I'm using. If anyone could let me know where I've gone wrong or any alternative ways of generating y_pred, I would appreciate it.

model.fit does not return a model instance where you can call predict , so you are calling predict on the wrong object, the correct way is:

model.fit([X_train_ch1,X_train_ch2], y_train, epochs=20, batch_size=32, 
          validation_split=0.2 ,class_weight='auto', shuffle = True)

y_pred = model.predict_classes(X_test)

Apparently I misunderstood the question. As pointed out model.fit returns a history object so that can not be used to make predictions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM