Keras Son katmanda çoklu “Softmax” mümkün mü?


Yanıtlar:


7

Fonksiyonel arayüzü kullanırdım.

Bunun gibi bir şey:

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
Çözümü eklemenizi önermiyorum, ama yanıtı olduğu gibi bırakmak OP'nin model oluşturma işinin tamamlanacağı izlenimini veriyor. Ancak OP'yi, modeli gerçekten eğitmek istiyorlarsa, kodun diğer bölümlerinde yapması için eşit miktarda ekstra iş var. En azından bu gereksinime başvurabilirsiniz. Aynı şey diğer cevaplar için de geçerlidir. . .
Neil Slater

1
@NeilSlater kesinlikle haklısın. Neden farklı bir maliyet fonksiyonuna ihtiyacım olduğu hakkında hiçbir fikrim yok. Bunun neden önemli olduğunu söyleyebilir misiniz?
arthurDent

1
@arthurDent - çünkü Keras'ın çok sınıflı çapraz entropi kaybı muhtemelen her örnekte üç eşzamanlı gerçek sınıfla başa çıkmaya yönelik değildir ve gruplara ayrılması - bir gruptaki hata - diğer gruplardaki çıktılara yanlış atanan degradelerle sonuçlanabilir . Sadece deneyebilir ve ne olduğunu görebilirsiniz. . . yine de yakınsak olabilir, ancak denge noktası üç ayrı ağa sahip olmak kadar iyi olmayabilir.
Neil Slater

1
@arthurDent:. . . daha ayrıntılı olarak düşünmeme rağmen ve softmax ile çok sınıflı çapraz entropi için logit'teki gradyan,y^yyine de başarılı bir şekilde başvurabilir ve çalışabilir. Normal bir softmax çıktı elbette 3 sınıfı aynı anda öğrenemezdi, ama belki de bu cevap her şeyden önce ihtiyacınızdır. . .
Neil Slater

1
ölçümlerini örneğin kullanımı categorical_accuracyve predict_classesyöntemlerle daha düşünce gerekebilir. . .
Neil Slater

5

Sadece kendi softmax fonksiyonunuzu uygulamak mümkündür. Bir tensörü parçalara bölebilir, ardından softmax'ı parça başına ayrı hesaplayabilir ve tensör parçalarını birleştirebilirsiniz:

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 eksen argümanı olmadan son eksen boyunca birleştirilir (bizim durumumuzda eksen = 1).

Ardından bu etkinleştirme işlevini gizli bir katmana dahil edebilir veya bir grafiğe ekleyebilirsiniz.

Dense(activation=custom_activation)

veya

model.add(Activation(custom_activation))

Ayrıca yeni bir maliyet fonksiyonu tanımlamanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.