【发布时间】:2020-09-03 22:23:50
【问题描述】:
我是 ml/ai 的新手,我正在尝试构建一个 cnn+lstm,但我正在为 lstm 的形状而苦苦挣扎。我使用 ImageDataGenerator 传递 48 x 48 灰度图像,批量大小为 10。它是二元分类(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: 检查输入时出错:预期 time_distributed_56_input 有 5 个维度,但得到的数组形状为 (10, 48, 48, 1)
我尝试将时间步数添加到维度中,但这似乎不起作用。
我不知道我做错了什么
任何帮助将不胜感激!
【问题讨论】:
标签: python tensorflow keras lstm conv-neural-network