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

参考

以下のサイトを参考にしました。ありがとうございます。