1

Ich versuche Tensorflow zu verwenden, um ein rekurrentes neuronales Netzwerk zu erstellen. Mein Code ist etwas wie folgt:Tensorflow RNN Eingangsgröße

import tensorflow as tf 

rnn_cell = tf.nn.rnn_cell.GRUCell(3) 

inputs = [tf.constant([[0, 1]], dtype=tf.float32), tf.constant([[2, 3]], dtype=tf.float32)] 

outputs, end = tf.nn.rnn(rnn_cell, inputs, dtype=tf.float32) 

Jetzt läuft alles gut. Ich bin jedoch ziemlich verwirrt darüber, was eigentlich vor sich geht. Die Ausgabedimensionen sind immer die Stapelgröße x die Größe des versteckten Zustands der Rnn-Zelle - wie können sie völlig unabhängig von der Eingabegröße sein?

Wenn mein Verständnis korrekt ist, werden die Eingaben bei jedem Schritt mit dem versteckten Zustand des RMN verknüpft und dann mit einer Gewichtsmatrix (neben anderen Operationen) multipliziert. Dies bedeutet, dass die Dimensionen der Gewichtungsmatrix von der Eingabegröße abhängig sein müssen, was unmöglich ist, weil die rnn_cell erzeugt wird, bevor die Eingaben überhaupt deklariert werden!

Antwort

0

Nachdem ich die Frage answer zu einer Frage über die GRU-Implementierung von Tensorflow gesehen habe, ist mir klar geworden, was vor sich geht. Entgegen meiner Intuition erzeugt der GRUCell-Konstruktor überhaupt keine Gewichtungs- oder Bias-Variablen. Stattdessen erstellt es seinen eigenen Variablenbereich und instanziiert die Variablen bei Bedarf, wenn sie tatsächlich aufgerufen werden. Tensorflow's variabler Scoping-Mechanismus stellt sicher, dass die Variablen nur einmal erstellt und über nachfolgende Aufrufe an die GRU verteilt werden.

Ich bin nicht sicher, warum sie sich entschieden haben, mit dieser ziemlich verwirrenden Implementierung zu gehen, die, soweit ich sagen kann, nicht dokumentiert ist. Für mich erscheint es sinnvoller, den Variablenbereich von object-level von python zu verwenden, um die Tensorflow-Variablen in GRUCell selbst zu kapseln, anstatt sich auf einen zusätzlichen impliziten Scoping-Mechanismus zu verlassen.

Verwandte Themen