Модель подходит для кераса: ошибка типа: неустранимый тип: numpy.ndarray

1

Я реализую следующий код. Он успешно работает в предыдущей версии Keras:

max_sequence = 56
input_dim = 26    

print("Build model..1")
first_input = Input(shape=(max_sequence,input_dim))
first_lstm = LSTM(5, return_sequences=True)(first_input)
first_bn = BatchNormalization()(first_lstm)
first_activation = Activation('tanh')(first_bn)
first_flat = Flatten()(first_activation)

print("Build model..2")
second_input = Input(shape=(max_sequence,input_dim))
second_lstm = LSTM(5, return_sequences=True)(second_input)
second_bn = BatchNormalization()(second_lstm)
second_activation = Activation('tanh')(second_bn)
second_flat = Flatten()(second_activation)

merge=concatenate([first_flat, second_flat])
merge_dense=Dense(3)(merge)
merge_bn = BatchNormalization()(merge_dense)
merge_activation = Activation('tanh')(merge_bn)
merge_dense2=Dense(1)(merge_activation)
merge_activation2 = Activation('tanh')(merge_dense2)

train_x_1 = np.reshape(np.array(train_x_1), [2999, 56, 26])
train_x_2 = np.reshape(np.array(train_x_2), [2999, 56, 26])


model=Model(inputs=[train_x_1,train_x_2], outputs=train_y_class)

optimizer = RMSprop(lr=0.5)
model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])



history = model.fit([train_x_1, train_x_2], train_y_class, nb_epoch=300, batch_size=128,
                    validation_data=([val_x_1, val_x_2], val_y_class))

При запуске:

history = model.fit([train_x_1, train_x_2], train_y_class, nb_epoch=300, batch_size=128,
                    validation_data=([val_x_1, val_x_2], val_y_class))

возникает следующая ошибка:

TypeError: unhashable type: 'numpy.ndarray' accours.

Поэтому я проверил train_x_1, train_x_2, train_y_class. Их тип <class 'numpy.ndarray'>. Я искал решение, поэтому я попытался изменить тип на кортеж, но это не сработало.

Если numpy.ndarray не сотрясается, какой тип ввода принимает model.fit?

Форма данных поезда следующая:

train_x_1.shape
(2999, 56, 26)
train_x_2.shape
(2999, 56, 26)
train_y_class.shape
(2999, 1)

Пример train_x_1 выглядит следующим образом:

array([[[ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        ...,
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00],
        [ 1.62601626e-02,  2.26890756e-01,  1.17764920e-02, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00]],
  • 0
    Является ли тип отдельных элементов train_x_1, train_x_2, train_y_class также numpy.ndarray ? Это может быть проблемой. Если это так, вы должны использовать тензор, а не вложенный ndarray. Можете ли вы опубликовать образец содержимого этих трех переменных?
  • 0
    @DanielR. Я разместил форму данных поезда и образец train_x_1. Должен ли я использовать тензор? хмм ..
Показать ещё 5 комментариев
Теги:
machine-learning
numpy
keras
lstm

1 ответ

2
Лучший ответ

Проблема в том, что вы непосредственно передаете входные и выходные массивы (а не входные и выходные тензоры) классу Model при построении модели:

model = Model(inputs=[train_x_1,train_x_2], outputs=train_y_class)

Вместо этого вам необходимо передать соответствующие входные и выходные тензоры следующим образом:

model = Model(inputs=[first_input,second_input], outputs=merge_activation2)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню