Входной слой Keras, кажется, удаляет одно измерение обучающих данных - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь построить Параллельный 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'])
...