2017-06-06 73 views
2

我试图教自己建立一个CNN说,需要一个以上的图像作为输入。我公司自创建测试这个大,从长远来看,我希望解决涉及一个非常大的数据集的问题集,我使用发电机来读取的图像成我传递给Keras型号的fit_generator功能阵列。Keras Python的多图像输入

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

读关于多个输入Keras细胞神经网络给我的印象,这是对于被鉴定的4个输入中包含的图像的4输入CNN发电机正确的格式。

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

"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具有形状(100, 100, 1),和/ b/c/d是数字。

下面是代码:

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

提前感谢!

回答

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 
+0

这事实上是我的问题,而这个工作! – eforkin