我正在尝试为不同大小的图像提供2D CNN。为此目的(因为我不想重塑我的图像),我尝试执行2D填充。
问题如下:要输入到网络的图像被读取并转换为三维骚动(形状为:(80,35,3)。由于图像形状不同,我无法创建一个np.array来放入它们 - 所以我将它们附加到列表中。因此着名的错误:
“检查模型输入时出错:您传递给模型的Numpy数组列表不是模型预期的大小。预计会看到1个数组,而是获得以下18418个数组列表:”等
所以问题是:如何将这些图像提供给填充层?
我尝试过很多东西,比如在开头调用Input:
inputs = Input(shape = (None, None, 3,))
或按如下方式配置我的填充层:
model.add(ZeroPadding2D(padding=(64, 64), batch_input_shape= (1000, None, None, 3)))
但我无法做对。
有人会有解决方案吗?
提前致谢,
中号
答案 0 :(得分:1)
如果你想填充(通过执行太多不必要的操作会使你的模型变慢),你必须在模型之外,使用numpy。
如果你有一个图像列表,比如numpy数组列表,每个numpy都有(side1,side2,3)
个形状:
desiredX = someValue
desiredY = someValue
padded_images = []
for img in list_of_images:
shape = img.shape
xDiff = desiredX - shape[0]
xLeft = xDiff//2
xRight = xDiff-xLeft
yDiff = desiredY - shape[1]
yLeft = yDiff//2
yRight = yDiff - yLeft
padded_images.append(np.pad(img,((xLeft,xRight),(yLeft,yRight),(0,0)), mode='constant')
#or choose another mode
padded_images = np.asarray(padded_images) #this can go into the model
或者,您可以训练一批图像或小批量分组具有相同大小的图像。 (我不知道哪个更有效率,但如果你的尺码差异太大,这可能会更好)
for epoch in range(epochs):
for img,output in zip(list_of_images,list_of_outputs):
img = np.expand_dims(img,axis=0) #add the batch size = 1
output = np.expand_dims(output,axis=0) ##add batch size = 1
model.train_on_batch(img,output,....)