Keras Python多图像输入形状错误

时间:2017-06-06 20:30:18

标签: python machine-learning neural-network keras conv-neural-network

我正在努力建立一个以多个图像作为输入的CNN。由于我为测试它而创建的数据集很大,从长远来看,我希望解决涉及非常大的数据集的问题,我使用生成器将图像读入数组,我将其传递给Keras Model' s {{ 1}}功能。

当我单独运行我的发电机时,它工作正常,并产生适当形状的输出。它产生一个包含两个条目的元组,第一个条目的形状为fit_generator,第二个条目的形状为(4, 100, 100, 1)

阅读多个输入Keras CNN让我觉得这是4输入CNN的生成器的正确格式,它识别4个输入中的哪个包含图像。

然而,当我运行代码时,我得到了:

(4, )

我一直在寻找解决方案已有一段时间了,我怀疑问题在于将"ValueError: Error when checking input: expected input_121 to have 4 dimensions, but got array with shape (100, 100, 1)" 形状数组作为(100, 100, 1)形状数组发送到输入。

但是当我尝试修改生成器的输出时,我收到有关维(None, 100, 100, 1)的错误,这是错误的,因为生成器的输出应该具有5形式,其中X, y = [X1, X2, X3, X4], [a, b, c, d]的形状为Xn,而a / b / c / d为数字。

以下是代码:

https://gist.github.com/anonymous/d283494aee982fbc30f3b52f2a6f422c

提前致谢!

1 个答案:

答案 0 :(得分:0)

您正在使用错误的尺寸在生成器中创建数组列表。

如果您想要正确的形状,请将单个图像重塑为4维:(n_samplesx_sizey_sizen_bands)您的模型将起作用。在您的情况下,您应该将图像重塑为(1, 100, 100, 1)

最后将它们与np.vstack叠加在一起。生成器将生成一个形状(4, 100, 100, 1)的数组。

检查此修改代码是否有效

def input_generator(folder, directories):

    Streams = []
    for i in range(len(directories)):
        Streams.append(os.listdir(folder + "/" + directories[i]))
        for j in range(len(Streams[i])):
            Streams[i][j] = "Stream" + str(i + 1) + "/" + Streams[i][j]   
        Streams[i].sort()


    length = len(Streams[0])
    index = 0
    while True:
        X = []
        y = np.zeros(4)
        for Stream in Streams:
            image = load_img(folder + '/' + Stream[index], grayscale = True)
            array = img_to_array(image).reshape((1,100,100,1))
            X.append(array)
        y[int(Stream[index][15]) - 1] = 1
        index += 1
        index = index % length
        yield np.vstack(X), y