2016-05-16 15 views
8

Ich versuche derzeit, die Ergebnisse des folgenden Artikels zu reproduzieren.
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
Ich benutze Keras mit dem Theano Backend. In dem Artikel spricht er davon, die Temperatur der finalen Softmax-Schicht so zu steuern, dass verschiedene Outputs erreicht werden.Wie ändere ich die Temperatur eines Softmax-Ausgang in Keras

Temperatur. Wir können auch mit der Temperatur des Softmax während der Probenahme spielen. Verringern der Temperatur von 1 auf etwas niedrigere Nummer (z.B. 0,5) macht den RNN zuversichtlicher, aber auch mehr konservativ in seinen Proben. Umgekehrt ergeben höhere Temperaturen mehr Vielfalt, aber auf Kosten von mehr Fehlern (z. B. Rechtschreibfehler, usw.). Insbesondere Einstellung Temperatur sehr nahe Null gibt das höchstwahrscheinlich, was Paul Graham sagen könnte:

Mein Modell ist wie folgt.

model = Sequential() 
model.add(LSTM(128, batch_input_shape = (batch_size, 1, 256), stateful = True, return_sequences = True)) 
model.add(LSTM(128, stateful = True)) 
model.add(Dropout(0.1)) 
model.add(Dense(256, activation = 'softmax')) 

model.compile(optimizer = Adam(), 
       loss = 'categorical_crossentropy', 
       metrics = ['accuracy']) 

Der einzige Weg, ich wäre es, die Temperatur der letzten Dense Schicht einzustellen denken kann, die Gewichtsmatrix und multipliziert es mit der Temperatur zu bekommen. Kennt jemand einen besseren Weg, es zu tun? Auch wenn irgendjemand etwas falsch sieht, wie ich das Modell einrichte, lassen Sie es mich wissen, da ich neu bei RNNs bin.

Antwort

7

Nun, es sieht aus wie die Temperatur ist etwas, was Sie tun, um die Ausgabe der Softmax-Schicht. Ich habe dieses Beispiel gefunden.

https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

Er wendet die folgende Funktion des Soft-max Ausgang zu probieren.

+1

Ist der letzte Unterschied zu 'np.random.choice (len (a), p = a)'? – danijar

+0

Dies ist nicht der Standard-Softmax mit Temperatur wie hier definiert: https: //en.wikipedia.org/wiki/Softmax_function (in der Verstärkung Lernabschnitt). Warum wird ein Protokoll angewendet, bevor es durch die Temperatur geteilt wird? –

0

Die Antwort von @ ChaseP255 funktioniert ok, aber Sie erhalten Warnungen wegen Protokoll (0). Sie können den Vorgang e^log (a)/T = a^(1/T) vereinfachen und der Protokoll

def sample(a, temperature=1.0): 
    a = np.array(a)**(1/temperature) 
    p_sum = a.sum() 
    sample_temp = a/p_sum 
    return np.argmax(np.random.multinomial(1, sample_temp, 1)) 

Hoffnung loswerden, es hilft!

+1

Ich denke du meinst e^(log (a)/T) = a^(1/T) – Visionscaper

+1

@ Visionscaper ja, danke! Habe es gerade korrigiert – Julian

Verwandte Themen