TensorFlow mit LSTMs für das generieren von text
Möchte ich nutzen, tensorflow zu generieren und text wurden geändert die LSTM-tutorial ( https://www.tensorflow.org/versions/master/tutorials/recurrent/index.html#recurrent-neural-networks ) - code, um dies zu tun, aber meine erste Lösung scheint zu generieren Unsinn, auch nach dem training für eine lange Zeit, es wird nicht besser. Ich kann nicht erkennen, warum. Die Idee ist, zu starten mit einem null-matrix und erzeugen dann ein Wort zu einer Zeit.
Dies ist der code, auf die ich Hinzugefügt habe, die beiden Funktionen unten
https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/models/rnn/ptb/ptb_word_lm.py
Den generator sieht wie folgt aus
def generate_text(session,m,eval_op):
state = m.initial_state.eval()
x = np.zeros((m.batch_size,m.num_steps), dtype=np.int32)
output = str()
for i in xrange(m.batch_size):
for step in xrange(m.num_steps):
try:
# Run the batch
# targets have to bee set but m is the validation model, thus it should not train the neural network
cost, state, _, probabilities = session.run([m.cost, m.final_state, eval_op, m.probabilities],
{m.input_data: x, m.targets: x, m.initial_state: state})
# Sample a word-id and add it to the matrix and output
word_id = sample(probabilities[0,:])
output = output + " " + reader.word_from_id(word_id)
x[i][step] = word_id
except ValueError as e:
print("ValueError")
print(output)
Habe ich die variable "Wahrscheinlichkeiten" zu dem ptb_model und es ist einfach eine softmax über die logits.
self._probabilities = tf.nn.softmax(logits)
Und der Probenahme:
def sample(a, temperature=1.0):
# helper function to sample an index from a probability array
a = np.log(a) / temperature
a = np.exp(a) / np.sum(np.exp(a))
return np.argmax(np.random.multinomial(1, a, 1))
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich die Arbeit in Richtung der exakt gleichen Ziel, und habe es an die Arbeit. Sie haben viele richtige änderungen hier, aber ich denke, dass Sie ' ve verpasst ein paar Schritte.
Ersten, zur Erzeugung von text, den Sie brauchen zu erstellen eine andere version des Modells, das stellt nur einen einzelnen Zeitschritt. Der Grund dafür ist, dass wir brauchen, um Probe jeden Ausgang y, bevor wir füttern es in den nächsten Schritt des Modells. Ich Tat dies, indem Sie eine neue config setzt
num_steps
undbatch_size
beide gleich 1.Ich mir zusätzlich die Wahrscheinlichkeiten für das Modell mit diesen Zeilen:
und
Dann gibt es ein paar Unterschiede in meinem
generate_text()
Funktion. Die erste ist, dass ich das laden von gespeicherten Modell-Parameter von der Festplatte mit dertf.train.Saver()
Objekt. Beachten Sie, dass wir diese nach der Instanziierung des PTBModel mit der neuen config von oben.Der zweite Unterschied ist, dass ich den lookup-Tabelle von ids zu Wort-strings (die ich zu schreiben hatte diese Funktion, siehe code unten).
Richte ich den ursprünglichen Zustand auf die gleiche Weise tun, aber dann setze ich das erste token in einer anderen Art und Weise. Ich möchte das "Ende der Satz" token so, dass ich beginne meinen Satz mit den passenden Wörtern. Ich schaute durch das Wort index und festgestellt, dass
<eos>
geschieht, index 2 (deterministisch), so dass ich nur hart codiert, dass in. Schließlich habe ich wickeln Sie es in eine 1x1-Numpy Matrix so, dass es der richtige Typ für den Modell-Eingänge.Schließlich, hier ist der Teil, wo wir generieren Sätzen. Beachten Sie, dass wir sagen
session.run()
zur Berechnung deroutput_probs
und diefinal_state
. Und geben wir es der Eingabe-und der Staat. In der ersten iteration wird die Eingabe<eos>
und der Staat ist derinitial_state
, aber auf den nachfolgenden Iterationen geben wir als input unserer letzten Stichprobe Ausgabe, und wir geben den Zustand entlang der letzten iteration. Beachten Sie auch, dass wir die Nutzung derwords
Liste zum nachschlagen der Wort-string aus der output-index.Dann alles, was wir tun müssen ist, drucken Sie den text, den wir angesammelt haben.
Dass es für das
generate_text()
Funktion.Schließlich, lassen Sie mich Ihnen zeigen, die definition der Funktion für
get_vocab()
, das ich in reader.py.Das Letzte, was Sie tun müssen, ist, um in der Lage sein, das Modell zu retten, nach der Ausbildung, die aussieht wie
... Und das ist das Modell, das Sie laden von der Festplatte später beim generieren von text.
Gab es noch ein problem: ich fand, dass manchmal die Wahrscheinlichkeitsverteilung produziert von der Tensorflow softmax-Funktion nicht Summe genau 1.0. Wenn die Summe größer als 1.0 ist,
np.random.multinomial()
wirft einen Fehler. Also ich hatte zu schreiben, meine eigene sampling-Funktion, die wie folgt aussiehtWenn Sie all dies zusammen, das kleine Modell war in der Lage zu generieren, die mir ein paar Coole Sätze. Viel Glück.
Verwende ich deinen code, es scheint, nicht Recht. Also habe ich es ein wenig modifizieren, scheint es zu arbeiten.
Hier ist mein code, und ich bin nicht sicher, es ist richtig: