如何解决ValueError:检查输入时出错:预期time_distributed_55_input具有5个维,但数组的形状为10,48,48,1
我是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,2)))
cnn.add(Dropout(0.5))
# 4th conv layer
cnn.add(Conv2D(512,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,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)
我尝试将时间步数添加到维度中,但这似乎不起作用。
我不确定自己在做什么错
任何帮助将不胜感激!
解决方法
您可以放置一个重塑图层,然后更改输入形状:
model.add(Reshape((1,48,1)))
model.add(TimeDistributed(cnn,input_shape=(1,1)))
完整的示例:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
from tensorflow.keras import Sequential
from tensorflow.keras.layers import *
import numpy as np
cnn = Sequential()
num_timesteps = 2
# 1st conv layer
cnn.add(Conv2D(8,(3,3),padding='same',input_shape=(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(8,(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(8,2)))
cnn.add(Dropout(0.5))
# 4th conv layer
cnn.add(Conv2D(8,2)))
cnn.add(Dropout(0.5))
# flatten
cnn.add(Flatten())
# fully connected 1
cnn.add(Dense(8))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))
#fully connected 2
cnn.add(Dense(8))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))
model = Sequential()
model.add(Reshape((1,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(np.random.rand(100,1),np.random.rand(100))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。