Kerasにテンソルフローを使用して基本的なMLPを実装し、バイナリ分類問題を解決しようとしています。バイナリ分類では、シグモイドが推奨されるアクティベーション関数であるようですが、理由と、Kerasがこれをどのように処理するのか、私にはよくわかりません。
シグモイド関数が0から1の範囲の値を生成することを理解しています。私の理解では、シグモイドを使用した分類の問題では、入力のクラスを決定するために使用される特定のしきい値(通常0.5)があります。 Kerasでは、このしきい値を指定する方法は見当たらないので、バックエンドで暗黙的に行われていると思いますか?これが事実である場合、Kerasはバイナリ分類問題でのシグモイドの使用と回帰問題をどのように区別していますか?バイナリ分類ではバイナリ値が必要ですが、回帰では公称値が必要です。これが損失関数であることを示している可能性があることがわかります。データの処理方法をKerasに通知していますか?
さらに、Kerasが暗黙的にしきい値を適用していると仮定すると、モデルを使用して新しいデータを予測するときに、なぜそれが公称値を出力するのですか?
例えば:
y_pred = model.predict(x_test)
print(y_pred)
与える:
[7.4706882e-02] [8.3481872e-01] [2.9314638e-04] [5.2297767e-03] [2.1608515e-01] ... [4.4894204e-03] [5.1120580e-05] [7.0263929e-04 ]
バイナリ出力を取得することを予測するときに自分でしきい値を適用できますが、正しく分類するためには、とにかくKerasがそれを実行している必要がありますか?おそらく、Kerasはモデルのトレーニング時にしきい値を適用していますが、それを使用して新しい値を予測する場合、損失関数は予測に使用されないため、しきい値は使用されませんか?または、しきい値をまったく適用せず、出力された公称値が私のモデルでうまく機能しているのですか?これがバイナリ分類のKerasの例で発生していることを確認したので、特に正確に予測しているため、コードでエラーが発生したとは思いません。
これがどのように機能しているかを誰かが説明できれば、私はそれを大いに感謝します。
参照点としての私のモデルは次のとおりです。
model = Sequential()
model.add(Dense(124, activation='relu', input_shape = (2,)))
model.add(Dropout(0.5))
model.add(Dense(124, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.summary()
model.compile(loss='binary_crossentropy',
optimizer=SGD(lr = 0.1, momentum = 0.003),
metrics=['acc'])
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
バイナリ分類の出力は、サンプルがクラスに属する確率です。
kerasは、バイナリ分類問題または回帰問題でのシグモイドの使用をどのように区別していますか?
必要はありません。損失関数を使用して損失を計算し、次に導関数を計算して重みを更新します。
言い換えると:
y^
および実際のy
。