Keras 2d填充和输入

时间:2018-04-25 12:22:42

标签: python keras

我正在尝试为不同大小的图像提供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)))

但我无法做对。

有人会有解决方案吗?

提前致谢,

中号

1 个答案:

答案 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,....)