AttributeError: у объекта «История» нет атрибута «предикативные классы» - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь использовать 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, я был бы признателен.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

model.fit не возвращает экземпляр модели, в котором вы можете вызвать predict, поэтому вы вызываете predict с неверным объектом, правильный путь:

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)
0 голосов
/ 26 февраля 2020

Видимо, я неправильно понял вопрос. Как указано, model.fit возвращает объект истории, поэтому его нельзя использовать для прогнозирования.

...