2017-06-06 21 views
2

複数のイメージを入力として受け取るCNNを作成するように教えています。私はこれをテストするために作成したデータセットが大きいので、長期的には非常に大きなデータセットに関連する問題を解決することを願っています。私はKeras Modelのfit_generator関数に渡す画像を配列に読み込むジェネレータを使用しています。Keras Pythonマルチイメージ入力

私の発電機を孤立して動かすと、それはうまく動作し、適切な形状の出力を作り出します。これは、2つのエントリを含むタプルを生成します。最初のタプルは、形状が(4, 100, 100, 1)で、2番目が(4,)です。

複数の入力Keras CNNについて読むと、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)シェイプ配列として入力します。

しかし、私は私の発電機の出力を変更しようとしたとき、私は発電機の出力がXn(100, 100, 1)を形作る持つフォームX, y = [X1, X2, X3, X4], [a, b, c, d]を、持っていなければならないため、エラーとして理にかなっ次元5、およびAが約エラーが出ます/ b/c/dは数字です。ここで

は、コードは次のとおりです。事前に

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

ありがとう!

答えて

0

誤った次元でジェネレータに配列のリストを作成しています。あなたは正しい形状をしたい場合は

は、4次元を持っている個々の画像を再構築:(n_samplesは、x_sizeは、y_sizeは、n_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