Я пытаюсь построить Параллельный CNN с некоторыми сверточными слоями, которые соединяются и пропускаются через Плотный слой.
Сводка выглядит так:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
timestep_input-0 (InputLayer) [(None, 11, 14, 1)] 0
__________________________________________________________________________________________________
timestep_input-1 (InputLayer) [(None, 11, 14, 1)] 0
__________________________________________________________________________________________________
0_conv_layer_0 (Conv2D) (None, 11, 14, 32) 832 timestep_input-0[0][0]
__________________________________________________________________________________________________
1_conv_layer_0 (Conv2D) (None, 11, 14, 32) 832 timestep_input-1[0][0]
__________________________________________________________________________________________________
0_conv_layer_1 (Conv2D) (None, 11, 14, 64) 51264 0_conv_layer_0[0][0]
__________________________________________________________________________________________________
1_conv_layer_1 (Conv2D) (None, 11, 14, 64) 51264 1_conv_layer_0[0][0]
__________________________________________________________________________________________________
0_conv_layer_2 (Conv2D) (None, 11, 14, 128) 204928 0_conv_layer_1[0][0]
__________________________________________________________________________________________________
1_conv_layer_2 (Conv2D) (None, 11, 14, 128) 204928 1_conv_layer_1[0][0]
__________________________________________________________________________________________________
conv_concatenate (Concatenate) (None, 11, 14, 256) 0 0_conv_layer_2[0][0]
1_conv_layer_2[0][0]
__________________________________________________________________________________________________
combine_concatenate (Conv2D) (None, 11, 14, 18) 4626 conv_concatenate[0][0]
__________________________________________________________________________________________________
flatten (Flatten) (None, 2772) 0 combine_concatenate[0][0]
__________________________________________________________________________________________________
dense_regress_output (Dense) (None, 2) 5546 flatten[0][0]
==================================================================================================
Total params: 524,220
Trainable params: 524,220
Non-trainable params: 0
__________________________________________________________________________________________________
Моя проблема связана с входами. У меня есть 2 входных слоя, 20000 фрагментов обучающих данных, каждый из которых имеет размер 11x14 и всего один канал.
Я понимаю, что model.fit () X должен иметь форму (2, 20000 , 11, 14, 1) и у меня есть 2 выходных узла, поэтому мой y должен иметь форму (2, 20000, 2).
Однако, когда я запускаю fit (), я получаю
WARNING:tensorflow:Model was constructed with shape (None, 11, 14, 1) for input Tensor("timestep_input-0:0", shape=(None, 11, 14, 1), dtype=float32), but it was called on an input with incompatible shape (None, 20000, 11, 14).
Далее следует ошибка:
ValueError: Input 0 of layer 0_conv_layer_0 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [None, 20000, 11, 14]
Так что мне кажется, что последнее измерение данных тренировки каким-то образом теряется. Будем очень благодарны за любую помощь в выяснении того, как каким-то образом сформировать его так, чтобы он работал.
ОБНОВЛЕНИЕ: Код модели в соответствии с просьбой в комментариях:
inputs = []
parallel = []
# make a list of inputs and parallel CNNs for the timestep consideration
for p in range(TIME_WINDOW_SIZE):
input_layer = Input(INPUT_DIM, name='timestep_input-{}'.format(p))
x = Conv2D(filters=CONV_FILTERS[0],
kernel_size=CONV_KERNEL_SIZES[0],
strides=CONV_STRIDES[0],
activation=CONV_ACTIVATION_FUNCS[0],
padding='same',
name='{}_conv_layer_{}'.format(p, 0))(input_layer)
for layer in range(1, CONV_LAYERS):
x = Conv2D(filters=CONV_FILTERS[layer],
kernel_size=CONV_KERNEL_SIZES[layer],
strides=CONV_STRIDES[layer],
activation=CONV_ACTIVATION_FUNCS[layer],
padding='same',
name='{}_conv_layer_{}'.format(p, layer))(x)
inputs.append(input_layer)
parallel.append(x)
# add the parallel layers together
if TIME_WINDOW_SIZE > 1:
x = Concatenate(axis=-1, name='conv_concatenate')(parallel)
x = Conv2D(filters=CONV_CONCAT_FILTER,
kernel_size=CONV_CONCAT_KERNEL_SIZE,
strides=CONV_CONCAT_STRIDE,
activation=CONV_CONCAT_ACTIVATION_FUNC,
name='combine_concatenate')(x)
x = Flatten(name='flatten')(x)
for i in range(DENSE_LAYERS - 1):
x = Dense(units=DENSE_SIZE, activation=DENSE_ACTIVATION_FUNC, name='dense_regress_layer_{}'.format(i))(x)
x = Dense(DENSE_OUTPUT, activation=DENSE_ACTIVATION_FUNC, name='dense_regress_output')(x)
model = Model(inputs=inputs, outputs=[x])
model.compile(optimizer=Adam(),
loss='mse',
metrics=['accuracy'])