2016-08-19 2 views
1

私はKerasを使って、ドキュメントの[this example][1]に基づいて自動エンコーダーを構築しようとしています。データが大きいので、ジェネレータを使用してメモリに読み込まないようにしたいと考えています。私はこのエラーを取得していKeras ImageDataGeneratorが正常に動作しない

model.fit_generator(
     train_generator, 
     samples_per_epoch=1, 
     nb_epoch=1, 
     verbose=1, 
     ) 

model = Sequential() 
model.add(Convolution2D(16, 3, 3, activation='relu', border_mode='same', input_shape=(3, 256, 256))) 
model.add(MaxPooling2D((2, 2), border_mode='same')) 
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same')) 
model.add(MaxPooling2D((2, 2), border_mode='same')) 
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same')) 
model.add(MaxPooling2D((2, 2), border_mode='same')) 
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same')) 
model.add(UpSampling2D((2, 2))) 
model.add(Convolution2D(8, 3, 3, activation='relu', border_mode='same')) 
model.add(UpSampling2D((2, 2))) 
model.add(Convolution2D(16, 3, 3, activation='relu')) 
model.add(UpSampling2D((2, 2))) 
model.add(Convolution2D(1, 3, 3, activation='sigmoid', border_mode='same')) 

model.compile(optimizer='adadelta', loss='binary_crossentropy') 

マイジェネレータ:

from keras.preprocessing.image import ImageDataGenerator 
train_datagen = ImageDataGenerator(rescale=1./255) 
train_generator = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode='binary', batch_size=32, target_size=(256, 256)) 

そしてモデルを適合

のように私のモデルに見える

例外:チェーのときのエラー模型のターゲット:予想される畳み込み2d_76は4つの次元を持ちますが、形状(32,1)の配列を持っています

サンプルではなく私のバッチのサイズに似ています。私は間違って何をしていますか?

答えて

2

このエラーは、おそらくclass_mode='binary'が原因である可能性があります。ジェネレータはバイナリクラスを生成するので、出力は形状(batch_size, 1)を持ち、モデルは4次元出力を生成します(最後のレイヤはコンボリューションです)。

私はラベルを画像そのものにしたいと思っています。 flow_from_directoryのソースとDirectoryIteratorのソースに基づいて、class_modeを変更するだけではできません。私はNoneclass_modeを設定

train_generator_ = train_datagen.flow_from_directory('IMAGE DIRECTORY', color_mode='rgb', class_mode=None, batch_size=32, target_size=(256, 256)) 
def train_generator(): 
    for x in train_iterator_: 
     yield x, x 

注:可能な解決策は、の線に沿っでしょう。これにより、tuple(image, label)の代わりにimageが返されます。次に、画像を入力とラベルの両方として返す新しいジェネレータを定義します。

+0

大変ありがとうございます!今はすべてが正しく動作しています。私はそれが入力の形を話していると仮定していたので混乱しましたが、あなたの解決策を実装した後は、それが問題であった出力の形を見ました。 – Lester

関連する問題