ValueError:输入0与层gru1不兼容:预期ndim=3,发现ndim=4

2024-03-29 11:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和神经网络都是新手。我正在尝试用CNN+RNN建立一个模型,用于视频中的手势分类。每个视频由30帧(一批30幅图像)组成。对于CNN层,我在CNN层中使用Conv2D层,在RNN层中使用GRU。图像大小为84*84,为RGB图像(通道=3)。在尝试添加GRU层时,我收到“ValueError:输入0与层gru1不兼容:预期ndim=3,发现ndim=4”错误。下面是我的代码:

    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'))

请告诉我GRU层的输入_形状的正确值


Tags: nameaddsizeactivationcnnelusamepool
2条回答

你的代码决不会做你想让它做的事。这些卷积层需要一批图像,但您描述的是一批图像序列。GRU层(为了工作)应该被赋予一个形状张量(批次大小、序列长度、特征),但它得到的是一个(批次大小、5、10、256),其输入形状参数被无意义地设置为(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。您不必告诉GRU层正确的输入形状,因为它会自动推断

Conv2D在输入(宽x高x通道)中获取3 dims图像。如果你想诱使keras处理彩色视频,你应该使用Conv3D(至少在第一层/前两层)。Conv3D接受宽度x高度x深度x通道作为输入。您可以将颜色通道保留为“通道”,并使用深度维度作为时间维度

相关问题 更多 >