2017-06-06 61 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