2017-06-19 26 views
1

TFのバックエンドを使用してKerasを画像認識に使用する方法を学習しているので、ここで何が間違っているのかまだ分かりません。Keras ValueError:リストを生成するfit_generator

私は2つのモデルを積み重ねようとしています.1つはVGG16、もう一つは無作為にスタックする方法を学んだだけです。私は5つのクラスの間でイメージを分類したいと思います。

私はfit_generatorを実行するときに問題が最後にあります。有効なタプルを生成する代わりに、それはリストであると思われるものを生成します。多くの人が同様の問題を抱えているのを見たことがありますが、そのケースでは出力はNoneでしたので、解決策が同じかどうかはわかりません。

パラメータ

nb_train_samples = 576 
nb_validation_samples = 144 
epochs = 30 
batch_size = 12 
img_width, img_height = 150, 150 

ジェネレータ

train_datagen = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=50, 
    width_shift_range=0.3, 
    height_shift_range=0.3, 
    shear_range=0.4, 
    zoom_range=0.4, 
    horizontal_flip=True) 

test_datagen = ImageDataGenerator(rescale=1./255) 

train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode=None, 
    shuffle=False) 

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode=None, 
    shuffle=False) 

マイモデル

input = Input(batch_shape=model.output_shape) 
x = Flatten()(input) 
x = Dense(256, activation='relu', name="new_block_1")(x) 
x = Dropout(0.5)(x) 
x = Dense(256, activation='relu', name="new_block_2")(x) 
x = Dropout(0.5)(x) 
x = Dense(5, activation='softmax', name="new_block_3")(x) 
top_model = Model(input,x) 

input = Input(shape=(img_width, img_height, 3)) 
x = model(input) 
x = top_model(x) 
final_model = Model(input, x) 

final_model.compile(optimizer='rmsprop', 
       loss='categorical_crossentropy', metrics=['accuracy']) 

フィットとエラー

final_model.fit_generator(
    train_generator, 
    steps_per_epoch=nb_train_samples // batch_size, 
    epochs=epochs, 
    validation_data=validation_generator, 
    validation_steps=nb_validation_samples // batch_size) 

ValueError: output of generator should be a tuple `(x, y, sample_weight)` or `(x, y)`. Found: [[[[ 0.89411771 0.89019614 0.87450987] 
    [ 0.89411771 0.89019614 0.87450987] 
    [ 0.89411771 0.89019614 0.87450987] 
    ..., 

アップデート1:@ petezurichの先端あたりとしては、「ソフトマックス」から「シグモイド」訓練のための

+0

これはあなたの質問を直接参照しているわけではありませんが、ソフトマックスではなく最後の高密度レイヤにシグモイドがある特定の理由がありますか? – petezurich

+0

理由はありませんが、実際には変更することもできます。私はちょっと試してみたので、気づかずにコピー貼り付けをしていたかもしれません。 – htcoelho

+1

あなたの5つのクラスごとに確率を与えるSoftmaxがあなたのケースでは正しい選択です。シグモイドはバイナリ分類に適しています。私は見る。 – petezurich

答えて

1

あなたのモデルが欠落しているラベルからの起動機能を変更しました。

ジェネレータでclass_modecategoricalに設定し、画像を各クラスのサブフォルダに配置します。ジェネレータはクラスラベルをうまく引き出すよりも優れています。

関連する問題