kerasで2クラス分類を行っています。
実現したいこと
データによって分類に必要な情報が含まれている場合といない場合があるため、sigmoid関数の出力の最大が0.6未満の場合など確度の低い出力を無視して、確度が高い出力に重みをおいてパラメータ更新を行うか、確度が低い出力を分類不能を示すクラスに分類して無視するということは可能でしょうか?
一通りgoogle検索をかけたりkerasのドキュメントをよんだりしたのですが実現する方法が見当たりませんでした。損失関数を自作する必要などがあるのでしょうか。
よろしくお願いいたします。
### 追記 12/9(tkymtmt さんの回答を参考にしたもの)
出力層のソフトマックス層
python3
1model.add(Activation('softmax'))
の活性化関数を変更するため以下のようにしました。
python3
1 2def myactivation(x): 3 x = K.softmax(x) - 0.6 4 x = K.relu(x) 5 return K.softmax(x) 6 7model.add(Activation(myactivation)) 8
softmaxの出力から0.6を引き、reluを通すことで0.6以下の出力を0にした後、0.6以上の出力の最大値を1にするためにsoftmaxに入力した結果を出力としました。
(relu関数の出力をモデルの出力とすると最大が0.4となり、必要以上に誤差が大きくなってしまうと考えました。)
ただ最後のsoftmaxを通すことで必要以上に出力が増幅されてしまうと考えられるので、y = 0 (x < 0.6), y = x (0.6 <= x)となるように以下の活性化関数も作成しました。
=> thresholdedReLu関数を使用することにしました。
ただ後者では出力が0の際に損失関数が必要以上に大きくなってしまうような気がするので、softmaxの出力に閾値を設定して無視するより、出力に重み付けをするほうがよいのではないかという気がし始めています。
### 追記 12/10
損失関数に交差エントロピーを用いている時に出力にしきい値を設定してしまうと、損失関数が計算できず(log(0)になるため)学習が進まなくなる可能性が高まる。
回答2件
あなたの回答
tips
プレビュー