我是ml/ai的新手,我正在尝试建立一个cnn+lstm,但我正在与lstm的形状作斗争。我正在使用ImageDataGenerator以10的批量大小传递48 x 48灰度图像。它是二元分类(a或b)。这些图像本身是一个视频的帧,我正在尝试通过它来更好地理解帧序列,因为它与整个视频的预测有关。cnn本身可以工作,但是当我添加lstm时,我得到了一个错误
这是我的密码:
cnn = Sequential()
num_timesteps = 2
# 1st conv layer
cnn.add(Conv2D(64,(3,3), padding='same', input_shape=(48, 48, 1)))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))
# 2nd conv layer
cnn.add(Conv2D(128,(5,5), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))
# 3rd conv layer
cnn.add(Conv2D(512,(3,3), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))
# 4th conv layer
cnn.add(Conv2D(512,(3,3), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))
# flatten
cnn.add(Flatten())
# fully connected 1
cnn.add(Dense(256))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))
#fully connected 2
cnn.add(Dense(512))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))
model = Sequential()
model.add(TimeDistributed(cnn, input_shape=(None, 48, 48, 1)))
model.add(LSTM(num_timesteps))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
运行model.fit
时发生的错误是:
ValueError: Error when checking input: expected time_distributed_56_input to have 5 dimensions, but got array with shape (10, 48, 48, 1)
我曾尝试将时间步数添加到维度中,但这似乎不起作用
我不确定我做错了什么
任何帮助都将不胜感激
可以放置重塑层,然后更改输入形状:
完整工作示例:
相关问题 更多 >
编程相关推荐