我正在修补时间分配层并且很难。我正在尝试创建一个非常简单的模型,它需要一个200 x 200 rgb图像并读取写在其上的字符。
我一直收到以下错误,我不确定如何修复它:
ValueError: Error when checking input: expected time_distributed_46_input to have 5 dimensions, but got array with shape (200, 200, 3)
这是我的keras代码:
num_timesteps = len(chars) # length of sequence
img_width = 200
img_height = 200
img_channels = 3
def model():
# define CNN model
cnn = Sequential()
cnn.add(Conv2D(64, (3,3), activation='relu', padding='same', input_shape=(img_width,img_height,img_channels)))
cnn.add(MaxPooling2D(pool_size=(3, 3)))
cnn.add(Flatten())
# define LSTM model
model = Sequential()
model.add(TimeDistributed(cnn, input_shape=(num_timesteps, img_width,img_height,img_channels)))
model.add(LSTM(num_timesteps))
model.add(Dense(26))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
然后我按照这样的方式拟合模型:
model().fit_generator(generator=images_generator(), steps_per_epoch=20, epochs=2)
我在这里生成图像:
def image_sample():
rand_str = random_str()
blank=Image.new("RGB", (200,200),(255,255,255))
font = ImageFont.truetype("StatePlate.ttf", 100)
draw = ImageDraw.Draw(blank)
draw.text((30, 40),rand_str,(0,0,0), font=font)
draw = ImageDraw.Draw(blank)
# datagen = ImageDataGenerator(rotation_range=90)
# datagen.fit(blank)
return (np.asarray(blank), one_hot_char(rand_str))
def one_hot_char(char):
zeros = np.zeros(len(chars))
zeros[chars.index(char)] = 1
return zeros
def images_generator():
yield image_sample()
任何帮助表示赞赏!感谢。
答案 0 :(得分:1)
目前,生成器返回单个图像。生成器生成的输入应具有形状:[batch_size, num_timesteps, img_width, img_height, img_channels]
。
对此虚拟数据的快速修复将np.asarray(blank)
更改为np.asarray([[blank]])
。