我对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层的输入_形状的正确值
你的代码决不会做你想让它做的事。这些卷积层需要一批图像,但您描述的是一批图像序列。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通道作为输入。您可以将颜色通道保留为“通道”,并使用深度维度作为时间维度
相关问题 更多 >
编程相关推荐