Kerasで2クラス分類の画像認識の人工知能を作成して、以下のエラーが出たので調査と対応をした。
ValueError: Only call `sigmoid_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)
調べてみると、Kerasのアップグレードを行なえば解決するとのことでした。
pip install --upgrade keras
アップグレードした。
Keras (1.2.0) → Keras (2.0.6)
エラーが取れました! また、初歩的なミスで2クラス分類はsoftmax
ではなく、sigmoid
を使うのが普通なのですね・・・ 知らなかった。
ので、そこも直しました。
self.model = Sequential()
self.model.add(
Convolution2D(32, 3, 3, border_mode='same', activation='linear',
input_shape=(3, self.image_size["y"], self.image_size["x"]),
init='uniform'
)
)
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Convolution2D(32, 3, 3, border_mode='same', activation='linear', init='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(MaxPooling2D((2, 2), strides=(2, 2)))
self.model.add(Flatten())
self.model.add(Dense(1024, activation='linear', init='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Dropout(0.5))
self.model.add(Dense(1024, activation='linear', init='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Dropout(0.5))
# self.model.add(Dense(2, activation='softmax', init='uniform'))
self.model.add(Dense(1, activation='sigmoid'))
最後の行をsigmoidにしました。 合わせてcompile方法も修正。
#sgd = SGD(lr=self.learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
#self.model.compile(optimizer=sgd,
# loss='categorical_crossentropy', metrics=["accuracy"])
self.model.compile(optimizer='adam',
loss='binary_crossentropy', metrics=["accuracy"])
categorical_crossentropyからbinary_crossentropyに変更。
さらにlabelデータ(Y_train)の次元数を変更
X_train.shape = [1000, 3, 96, 96]
Y_train.shape = [1000, 2]
[1, 0]か[0, 1]と作っていた。
↓
X_train.shape = [1000, 3, 96, 96]
Y_train = [1000, 1]
[1]か[0]と変更。
↑データセットが1000件の場合
いざ学習させてみる。
model.fit(X_train, Ytrain,
epochs=10,
batch_size=128,
shuffle=True
成功! これで学習をさせることができました!
追記
Kerasのバージョンが2系になって、書き方が変わってました。 以下、Keras2系に合わせて修正したものです。
self.model = Sequential()
self.model.add(
Conv2D(32, (3, 3), padding='same', activation='linear',
input_shape=(3, self.image_size["y"], self.image_size["x"]),
kernel_initializer='uniform'
)
)
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Conv2D(32, (3, 3), padding='same', activation='linear', kernel_initializer='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(MaxPooling2D((2, 2), strides=(2, 2)))
self.model.add(Flatten())
self.model.add(Dense(1024, activation='linear', kernel_initializer='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Dropout(0.5))
self.model.add(Dense(1024, activation='linear', kernel_initializer='uniform'))
self.model.add(LeakyReLU(alpha=0.3))
self.model.add(Dropout(0.5))
#self.model.add(Dense(2, activation='softmax', init='uniform'))
self.model.add(Dense(1, activation='sigmoid'))
参考
以下のサイトを参考にしました。ありがとうございます。