Keras複数の「Softmax」が最後のレイヤーで可能ですか?


回答:


7

機能的なインターフェースを使用します。

このようなもの:

from keras.layers import Activation, Input, Dense
from keras.models import Model
from keras.layers.merge import Concatenate

input_ = Input(shape=input_shape)

x = input_
x1 = Dense(4, x)
x2 = Dense(4, x)
x3 = Dense(4, x)
x1 = Activation('softmax')(x1)
x2 = Activation('softmax')(x2)
x3 = Activation('softmax')(x3)
x = Concatenate([x1, x2, x3])

model = Model(inputs=input_, outputs=x)

2
ソリューションを追加することはお勧めしませんが、答えをそのままにしておくと、OPのモデル構築作業は完了したように見えます。しかし、OPが実際にモデルをトレーニングしたい場合、コードの他の部分で実行する必要がある作業は、OPにも同じです。少なくともその要件を参照できます。同じことが他の回答にも当てはまります。。。
Neil Slater

1
@NeilSlaterあなたは絶対的に正しいです。なぜ別のコスト関数が必要なのかわかりません。なぜこれが重要なのか教えていただけますか?
arthurDent 2017年

1
@arthurDent-Kerasのマルチクラスクロスエントロピー損失はおそらく、各例の3つの同時の真のクラスとグループへの分離に対処するように調整されていないため、1つのグループでエラーが発生すると、他のグループの出力に勾配が誤って割り当てられる可能性があります。あなたはそれを試してみて、何が起こるか見ることができます。。。それでも収束する可能性がありますが、バランスポイントは、3つの完全に別個のネットワークを持つ場合ほど良くない場合があります。
Neil Slater

1
y^y

1
メトリクスcategorical_accuracypredict_classesメソッドの使用には、もっと考えが必要かもしれません。。。
Neil Slater

5

独自のソフトマックス関数を実装するだけで可能です。テンソルをパーツに分割し、パーツごとに個別にソフトマックスを計算し、テンソルパーツを連結できます。

def custom_softmax(t):
    sh = K.shape(t)
    partial_sm = []
    for i in range(sh[1] // 4):
        partial_sm.append(K.softmax(t[:, i*4:(i+1)*4]))
    return K.concatenate(partial_sm)

concatenate 軸引数なしでは、最後の軸(この場合、axis = 1)を連結します。

次に、このアクティブ化関数を非表示レイヤーに含めるか、グラフに追加できます。

Dense(activation=custom_activation)

または

model.add(Activation(custom_activation))

また、新しいコスト関数を定義する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.