Ich versuche, die Wortdarstellung des Imdb-Datensatzes "von Grund auf neu" durch die TensorFlow tf.nn.embedding_lookup()
Funktion zu lernen. Wenn ich es richtig verstanden habe, muss ich eine Einbettungsschicht vor der anderen verborgenen Schicht einrichten, und wenn ich dann Gradientenabstieg durchführe, "lernt" die Schicht eine Wortdarstellung in den Gewichten dieser Schicht. Wenn ich dies jedoch versuche, erhalte ich einen Formfehler zwischen meiner Einbettungsschicht und der ersten vollständig verbundenen Schicht meines Netzwerks.Tensorflow embedding_lookup
def multilayer_perceptron(_X, _weights, _biases):
with tf.device('/cpu:0'), tf.name_scope("embedding"):
W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W")
embedding_layer = tf.nn.embedding_lookup(W, _X)
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(embedding_layer, _weights['h1']), _biases['b1']))
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']))
return tf.matmul(layer_2, weights['out']) + biases['out']
x = tf.placeholder(tf.int32, [None, n_input])
y = tf.placeholder(tf.float32, [None, n_classes])
pred = multilayer_perceptron(x, weights, biases)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cost)
init = tf.initialize_all_variables()
Der Fehler, den ich bekommen ist:
ValueError: Shapes TensorShape([Dimension(None), Dimension(300), Dimension(128)])
and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
Danke! Ich denke tf.nn.reduce_sum sollte tf.reduce_sum sein? Wenn Sie die Dimension der Einbettungsschicht reduzieren möchten, wie haben Sie dann die Option gewählt, um zwischen "n_input = 300" und "embedding_size = 128" zu reduzieren? – nicolasdavid
Sie haben Recht mit dem Tippfehler - korrigiert es oben, danke! Ich entschied mich dafür, entlang der 'n_input'-Dimension zu reduzieren, weil es wahrscheinlicher erschien, dass dies zu Ihrem Problem passt, und ich nahm an, dass (z. B.) die Reihenfolge der Eingaben nicht wichtig war. Es ist ziemlich typisch, dies für Bag-of-Word-Probleme zu tun. Sie könnten * entlang 'embedding_size' reduzieren, aber ich denke, das würde viele Informationen aus der Einbettung verlieren, also würde es wahrscheinlich nicht so gut funktionieren. – mrry