2017-09-01 13 views
0

Keras新しい、からこの次のバイナリ画像分類の例を再実装しようとしている:それは私のために、バイナリの分類のために働くhttps://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.htmlKerasマルチクラスモデルに

。 3クラス分類のために、私は取得していますが、それを再構築、次の寸法が不一致エラー:

 60   epochs=50, 
    61   validation_data=validation_generator, 
---> 62   validation_steps=250 // batch_size) 
ValueError: Error when checking target: expected activation_50 to have shape (None, 1) but got array with shape (16, 3) 

これは私の現在の実装である:私は出力層の活性化機能を変更したこれまでのところ

from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Conv2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense 
from keras import backend as K 
K.set_image_dim_ordering('th') 
batch_size = 16 

# 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) 

# this is a generator that will read pictures found in 
# subfolers of 'data/train', and indefinitely generate 
# batches of augmented image data 
train_generator = train_datagen.flow_from_directory(
     'F://train_data//', # this is the target directory 
     target_size=(150, 150), # all images will be resized to 150x150 
     batch_size=batch_size, 
     class_mode='categorical') # since we use binary_crossentropy loss, we need binary labels 

# this is a similar generator, for validation data 
validation_generator = test_datagen.flow_from_directory(
     'F://validation_data//', 
     target_size=(150, 150), 
     batch_size=batch_size, 
     class_mode='categorical') 

model = Sequential() 

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

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

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

model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(1)) 
model.add(Activation('softmax')) # instead of sigmoid 

model.compile(loss='mean_squared_error', 
       optimizer='adam', 
       metrics=['accuracy']) 

# another loss: sparse_categorical_crossentropy 

model.fit_generator(
     train_generator, 
     steps_per_epoch=1800 // batch_size, 
     epochs=50, 
     validation_data=validation_generator, 
     validation_steps=250 // batch_size) 

シグモイドからソフトマックスから。 class_modeをバイナリからカテゴリに変更しました。問題を見つけることができないようです。

はまた、私はStackOverflowの上で同様の質問を認識しています: Multi-Output Multi-Class Keras Model

Train multi-class image classifier in Keras

Multi-class classification using keras

しかし、ソリューションのどれも私を助けてくれません。

答えて

1

最後のDense層をmodel.add(Dense(3))に変更する必要があります。 Softmaxのアクティブ化では、Dense層のunitsがクラスの数と一致すると予想されます。

また、loss='sparse_categorical_crossentropy'を使用する場合は、class_mode'sparse'に変更してください。現在の設定class_mode='categorical'は、loss='categorical_crossentropy'と一緒に使用してください。