0

ここに私がしたことがあります。私は犬/猫の画像分類のコードを手に入れ、コンパイルして実行して80%の精度を得ました。列車と検証フォルダにもう1つのクラス(飛行機)フォルダを追加しました。以下のコードケラスでマルチクラス画像分類を行うには?

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

train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 

で行った変更はcategorical_crossentropyにも損失をcategoricalbinary class_modeを変更します。出力レイアウトsigmoidsoftmaxに変更されました。 次のエラーを受け取ります。

ValueError: Error when checking target: expected activation_10 to have shape (None, 1) but got array with shape (16, 3) 

は、私が明示的に下記のようなカテゴリするトレーニングのラベルを変更する必要がありますか?私はここに何が起こるかわからない

train_labels = to_categorical(train_labels, num_classes=num_classes) 

(私はサイトmultilabel classification using kerasからこれを読んで)。助けてください。私は深い学習に比較的新しいです。

マルチラベル分類のためのモデル

model = Sequential() 

model.add(Conv2D(32, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('softmax')) 

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

# this is the augmentation configuration we will use for training 
train_datagen = ImageDataGenerator(
    rescale=1./255, 
    shear_range=0.2, 
    zoom_range=0.2, 
    horizontal_flip=True) 
# this is the augmentation configuration we will use for testing: 
# only rescaling 
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='categorical') 


validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_width, img_height), 
    batch_size=batch_size, 
    class_mode='categorical') 
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) 
+0

あなたのモデル、ラベルデータ( 'y_test')の構造だけでなく、整数(0/1/2)またはワンホットコード化されたベクトル(' [0.0、0.0,1.0] ')? – desertnaut

+0

#私たちの画像の寸法。 img_width、img_height = 150、150 train_data_dir = '/ホーム/エドウィン/ DC /電車' validation_data_dir = '/ホーム/エドウィン/ DC /検証' = 2011 nb_validation_samples = 813の エポック= 3 BATCH_SIZE nb_train_samples = 16 if K。image_data_format()== 'channels_first': input_shape =(3、img_width、img_height)他 : input_shapeは=(img_width、img_height、3) モデル=シーケンシャル()私は尋ね –

+0

すべてではない - plsは再びチェック私の質問。あなたのシステムにローカルなディレクトリパスで何をすべきか?さらに、コメントはこの種の情報の適切な場所ではありません。必要に応じて投稿を編集して更新する必要があります。 – desertnaut

答えて

1

、最後の緻密層はsoftmax活性化に続いて、クラスの数に等しいノードの数を持っている必要があり、お使いのモデルの最後の2つの層があるべきすなわち:

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 

また、お使いのラベル(電車とテストの両方)がワンホットエンコードする必要があります。最後に

train_labels = keras.utils.to_categorical(train_labels, num_classes) 
test_labels = keras.utils.to_categorical(test_labels, num_classes) 

:そう、あなたの最初の犬や猫が最初に同様に「2」とラベル付けされた整数(0/1)、および新しいカテゴリ(飛行機)と名付けられたと仮定して、以下のように、あなたはそれらを変換する必要があります専門用語では、マルチクラスであり、マルチラベルの分類ではありません(私はあなたの投稿のタイトルを編集しました)。最後の用語は、サンプルが複数のものに属するかもしれない問題に使用されますカテゴリ。

+0

私は自分のイメージデータセットを入力として使っていたので、これをカテゴリに変更する必要はありません。 "steps_per_epoch = nb_train_samples // batch_size"の代わりに "samples_per_epoch = nb_train_samples"に変更すると問題が解決しました。 –

1

、NNの最後の層のサイズは、クラスの数と等しくなければなりません。

F.i.あなたの問題(3クラス)のために、コードは次のようになります。マルチクラス分類について

model = Sequential() 

model.add(Conv2D(32, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(3)) 
model.add(Activation('softmax')) 
関連する問題