«ValueError: вход 0 несовместим со слоем gru1: ожидаемый ndim = 3, найденный ndim = 4» - PullRequest
0 голосов
/ 26 марта 2020

Я новичок как в python, так и в нейронных сетях. Я пытаюсь построить модель с CNN + RNN для классификации жестов в видео. Каждое видео состоит из 30 кадров (партия из 30 изображений). Для уровня CNN я использую слой Conv2D на уровне CNN и GRU на уровне RNN. Изображения имеют размер 84 * 84 и являются изображениями RGB (канал = 3). Я получаю сообщение об ошибке «ValueError: вход 0 несовместим со слоем gru1: ожидаемый ndim = 3, найденный ndim = 4» при попытке добавить слой GRU. Ниже мой код:

    model1 = Sequential()
    model1.add(Conv2D(64, (3,3), strides=(1,1), padding='same', input_shape=(84,84,3),name='c2D1'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,1), strides=(2,1)))

    model1.add(Conv2D(128, (3,3), strides=(1,1), padding='same',name='c2D2'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))



    model1.add(Conv2D(256, (3,3), strides=(1,1), padding='same',name='c2D3'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))


    model1.add(Conv2D(256, (3,3), strides=(1,1), padding='same',name='c2D4'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))


    model1.add(GRU(units=50,input_shape=(256,84,84),return_sequences=True,name='gru1'))
    model1.add(layers.Dense(nb_labels))


    model1.add(Flatten())
    model1.add(Dropout(0.5))
    model1.add(Dense(512, activation='elu'))
    model1.add(Dropout(0.5))
    model1.add(Dense(5, activation='softmax'))

Пожалуйста, дайте мне знать, какое должно быть правильное значение для input_shape для слоя GRU.

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Ваш код никоим образом не делает то, что вы говорите, что хотите, чтобы он делал. Эти сверточные слои ожидают серию изображений, но то, что вы описываете, представляет собой серию последовательностей изображений. Этот слой GRU должен (для его работы) получить тензор формы (batch_size, sequence_length, features), но вместо этого он получает (batch_size, 5, 10, 256) с параметром input_shape, который бессмысленно установлен в (256,84,84) ).

Чтобы получить то, что вы хотите, сделайте сверточную часть распределенной по времени (https://www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed), затем сгладьте все после второго измерения (используя https://www.tensorflow.org/api_docs/python/tf/keras/layers/Reshape) и только потом применять ГРУ. Вам не нужно сообщать слою GRU правильную форму ввода, так как он выведет это автоматически.

0 голосов
/ 26 марта 2020

Conv2D принимает на входе изображение размером 3 дм (ширина х высота х каналов). Если вы хотите обмануть керас при обработке цветного видео, вы должны использовать Conv3D (по крайней мере, в первом / первых двух слоях). Conv3D принимает в качестве входных данных ширину x высоту x глубину x каналы. Вы можете сохранить свои цветовые каналы как «каналы» и использовать измерение глубины как временное.

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