2017-03-24 6 views
1

Ich versuche, dieses Stück Code auszuführen:Einstellen der Form eines Tensor wie die Form eines anderen Tensor

def somefunc(x, rows, n_hidden): 
    vectors = tf.contrib.layers.embed_sequence(nodes, vocab_size=vocab_size, embed_dim=n_hidden) 
    batch_size = tf.shape(vectors)[0] 
    state = tf.zeros([batch_size, rows, n_hidden]) 
    bias = tf.Variable(tf.constant(0.1, shape=[batch_size,1]) # Error here! 
    ... 


x = tf.placeholder(tf.int32, shape=[None, 200]) 
pred = somefunc(x, 200, 40) 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=target)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss) 

ich diesen Fehler, wenn die Funktion aufgerufen wird (Fehler ist für Bias-Form):

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Tensor'

ich versuchte dabei b = tf.Variable(0.1, validate_shape=False), aber dann bekam ich diesen Fehler bei optimizer:

ValueError: as_list() is not defined on an unknown TensorShape.

Wenn ich validate_shape=False entferne, erhalte ich einen Formfehler.

Es tut mir sehr leid, wenn ich etwas offensichtlich übersehen habe, aber könnte mir jemand sagen, wo ich falsch liege?

Vielen Dank!

Antwort

1

Das shape Argument des tf.constant() op erwartet eine statischen Form, so dass Sie nicht ein tf.Tensor als Teil des Arguments verwenden können.

Zum Glück gibt es noch ein anderes Op, das genügt: tf.fill(), das die Form erlaubt (sein dims Argument), um ein tf.Tensor zu sein. Das heißt, Sie können bias als definieren:

bias = tf.Variable(tf.fill(dims=[batch_size, 1], 0.1), validate_shape=False) 
+0

Vielen Dank für die Beantwortung meiner Frage! Allerdings bekomme ich diesen Fehler, als ich Ihren Vorschlag ausprobierte: 'ValueError: initial_value muss eine Form haben: Tensor (" Fill: 0 ", shape = (?, 1), dtype = float32)'. Ich brauche die erste Dimension des Platzhalters, um keine zu sein, da ich unterschiedliche Losgrößen habe. – AnnaR

+1

Sorry! Ich habe die Antwort aktualisiert, um 'validate_shape = False' hinzuzufügen ... funktioniert das für dich? (Beachten Sie, dass dies die Initialisierung des Modells schwieriger macht, da Sie beim Ausführen der Initialisierungen einen Datenstapel einspeisen müssen.) – mrry

+0

Dieser Fehler ist verschwunden! Aber dann hat der Optimierer jetzt einen Fehler: 'ValueError: as_list() ist nicht auf einer unbekannten TensorShape definiert.', da pred 'shape = [None, 200]' zurückgibt. Wie gibt man normalerweise Daten weiter, wenn sie nicht wissen, wie groß die Batchgröße sein wird? – AnnaR

Verwandte Themen