Keras Multiple "Softmax" di lapisan terakhir mungkin?

10

beberapa softmax di lapisan terakhir

Apakah mungkin untuk menerapkan softmax mutiple di lapisan terakhir di Keras? Jadi jumlah Node 1-4 = 1; 5-8 = 1; dll.

Haruskah saya menggunakan desain jaringan yang berbeda?

arthurDent
sumber

Jawaban:

7

Saya akan menggunakan antarmuka fungsional.

Sesuatu seperti ini:

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)
Martin Thoma
sumber
2
Saya tidak menyarankan Anda menambahkan solusi, tapi saya pikir meninggalkan jawaban apa adanya memberi kesan bahwa pekerjaan pembangunan model OP akan lengkap. Tetapi ada jumlah tambahan pekerjaan yang sama untuk OP lakukan di bagian kode lain jika mereka ingin benar-benar melatih model. Setidaknya Anda bisa merujuk persyaratan itu. Hal yang sama berlaku untuk jawaban lain. . .
Neil Slater
1
@ NeilSlater kamu benar sekali. Saya tidak tahu mengapa saya memerlukan fungsi biaya yang berbeda. Bisakah Anda memberi tahu saya mengapa ini penting?
arthurDent
1
@arthurDent - karena kehilangan multi-kelas lintas-entropi Keras mungkin tidak diarahkan untuk mengatasi tiga kelas benar secara simultan pada setiap contoh, dan pemisahan menjadi kelompok-kelompok - kesalahan dalam satu kelompok dapat menyebabkan gradien yang salah ditugaskan ke keluaran di kelompok lain . Anda bisa mencobanya dan melihat apa yang terjadi. . . mungkin masih menyatu, tetapi titik keseimbangan mungkin tidak sebagus memiliki tiga jaringan yang sepenuhnya terpisah.
Neil Slater
1
y^-y
1
penggunaan metrik misalnya categorical_accuracydan predict_classesmetode mungkin perlu lebih banyak pemikiran. . .
Neil Slater
5

Mungkin saja hanya menerapkan fungsi softmax Anda sendiri. Anda dapat membagi tensor menjadi beberapa bagian, kemudian menghitung softmax secara terpisah per bagian dan menggabungkan bagian-bagian tensor:

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 tanpa argumen sumbu digabungkan melalui sumbu terakhir (dalam kasus kami sumbu = 1).

Kemudian Anda dapat memasukkan fungsi aktivasi ini dalam lapisan tersembunyi atau menambahkannya ke grafik.

Dense(activation=custom_activation)

atau

model.add(Activation(custom_activation))

Anda juga perlu mendefinisikan fungsi biaya baru.

Primoz
sumber