Модель с несколькими выходами Keras неверно вычисляет размеры цели: ValueError: Ошибка при проверке цели - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь построить модель Keras с несколькими выходами, начиная с работающей модели с одним выходом. Керас, однако, жалуется на размеры тензоров.

Модель с одним выходом:

Эта модель GRU обучает и прогнозирует штраф:

timesteps = 250
features = 2

input_tensor = Input(shape=(timesteps, features), name="input")
conv = Conv1D(filters=128, kernel_size=6,use_bias=True)(input_tensor)
b = BatchNormalization()(conv)
s_gru, states = GRU(256, return_sequences=True, return_state=True, name="gru_1")(b)
biases = keras.initializers.Constant(value=88.15)
out = Dense(1, activation='linear', name="output")(s_gru)
model = Model(inputs=input_tensor, outputs=out)

Мои numpy массивы:

train_x # shape:(7110, 250, 2) 
train_y # shape: (7110, 250, 1) 

Если подойдет модель со следующим кодом и все в порядке:

model.fit(train_x, train_y,batch_size=128, epochs=10, verbose=1)

Проблема:

Я хочу использовать слегка измененную версию сети, которая выводит также состояния GRU:

input_tensor = Input(shape=(timesteps, features), name="input")
conv = Conv1D(filters=128, kernel_size=6,use_bias=True)(input_tensor)
b = BatchNormalization()(conv)
s_gru, states = GRU(256, return_sequences=True, return_state=True, name="gru_1")(b)
biases = keras.initializers.Constant(value=88.15)
out = Dense(1, activation='linear', name="output")(s_gru)
model = Model(inputs=input_tensor, outputs=[out, states]) # multi output

#fit the model but with a list of numpy array as y
model.compile(optimizer=optimizer, loss='mae', loss_weights=[0.5, 0.5])
history = model.fit(train_x, [train_y,train_y], batch_size=128, epochs=10, callbacks=[])

Это обучение не проходит, и keras жалуется на целевые размеры:

ValueError: Error when checking target: expected gru_1 to have 2 dimensions, but got array with shape (7110, 250, 1)

Я использую Keras 2.3.0 и Tensorflow 2.0.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 30 января 2020

Размеры второго вывода и второго элемента в списке outputs должны иметь одинаковую форму. В этом случае states будет иметь форму (7110, 256), которая на самом деле не может сравниться с формой train_y (которая будет иметь форму (7110, 250, 1), как отмечено в первом блоке кода. Убедитесь, что выходные данные могут сравнивать с похожей формой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...