ValueError в модели с несколькими входами

Я создаю модель с несколькими входами, в которой я объединяю модель CNN и модель LSTM. Модель lstm содержит последние 5 событий, а CNN содержит изображение последнего события. Оба организованы так, что каждый элемент k в numpy соответствует 5 событиям и соответствующему изображению, как и выходные метки, которые являются «следующим» событием, которое должно быть предсказано моделью.

chanDim = -1
inputs = Input(shape=inputShape)
x = inputs
x = Dense(128)(x)
x = Activation("relu")(x)
x = BatchNormalization(axis=chanDim)(x)
x = Dropout(0.3)(x)
x = Flatten()(x)
x = Activation("relu")(x)
x = BatchNormalization(axis=chanDim)(x)
x = Dropout(0.1)(x)
x = Activation("relu")(x)
model_cnn = Model(inputs, x)

Это создает модель CNN, а следующий код представляет модель LSTM.

hidden1 = LSTM(128)(visible)
hidden2 = Dense(64, activation='relu')(hidden1)
output = Dense(10, activation='relu')(hidden2)
model_lstm = Model(inputs=visible, outputs=output)

Теперь, когда я комбинирую эти модели и расширяю их, используя простой плотный слой, чтобы сделать мультиклассовое прогнозирование 14 классов, все входные данные совпадают, и я могу объединить (нет, 10) и (нет, 10) в (нет, 20). ) для МЛП:

x = Dense(14, activation="softmax")(x)
model_mlp = Model(inputs=[model_lstm.input, model_cnn.input], outputs=x)

Все это работает нормально, пока я не попытаюсь скомпилировать модель, она выдает ошибку, связанную с вводом последнего плотного слоя модели mlp:

ValueError: Ошибка при проверке цели: ожидалось, что плотности_121 будут иметь форму (14,), но получен массив с формой (1,)

Вы знаете, как это возможно? Если вам нужна дополнительная информация, я буду рад предоставить ее


person Dnorious    schedule 01.05.2020    source источник
comment
плотности_121 — последний слой модели.   -  person Dnorious    schedule 01.05.2020
comment
какова форма вашего массива y_train? Вы сразу закодировали цель?   -  person Marco Cerliani    schedule 01.05.2020
comment
Набор поездов для LSTM (79322, 1, 5) Набор поездов для CNN (79322, 1, 25088) Набор поездов для y (метки вывода) (113318,)   -  person Dnorious    schedule 01.05.2020
comment
Я не кодировал числа в горячем виде, но я сделал категориальные целые числа имен событий от 0 до 14. 0 является фиктивным событием.   -  person Dnorious    schedule 01.05.2020


Ответы (1)


ваша цель должна быть (None, 14) размерной. с softmax вам нужно сразу закодировать вывод

попробуй это:

y = pd.get_dummies(np.concatenate([y_train, y_test])).values
y_train = y[:len(y_train)]
y_test = y[len(y_train):]
person Marco Cerliani    schedule 01.05.2020
comment
Должен ли я делать это и для входных значений LSTM? потому что это numpy, где каждый элемент представляет собой массив последних 5 событий. Например (0,0,4,7,2). Эти события также являются вариантами мультикласса для вывода (0->14) - person Dnorious; 01.05.2020
comment
Поскольку я изменил ввод lstm с (79322,5) на (79322,1,5) с помощью функции reshape(), потому что он ожидал одно дополнительное измерение в качестве ввода, но я не уверен, что это то же самое, что вы имеете в виду - person Dnorious; 01.05.2020
comment
форма входных данных не связана с вашей ошибкой (я не знаю, правильно ли это и ценно) - person Marco Cerliani; 01.05.2020
comment
Хорошо, без проблем. Спасибо вам большое за ваш ответ! - person Dnorious; 02.05.2020