Я пытаюсь использовать keras для создания классификатора, но по какой-то причине я не могу сгенерировать некоторые предсказания классов из моего набора тестов. Для этого я использую следующую модель.
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))
Выполнение этого дает AttributeError: у объекта «History» нет атрибута «Предикаты_класса». Я знаю, что история моей модели сохраняется, поскольку я могу генерировать графики своих моделирует производительность, выполняя:
# 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()
Все решения этой ошибки, которые я видел до сих пор, касались использования последовательной модели, которую, я уверен, я использую. Если бы кто-нибудь мог сообщить мне, где я ошибся или какие-либо альтернативные способы генерирования y_pred, я был бы признателен.