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.