首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow embedding_lookup

Tensorflow embedding_lookup
EN

Stack Overflow用户
提问于 2016-02-09 22:57:35
回答 2查看 13.1K关注 0票数 6

我正在尝试通过TensorFlow tf.nn.embedding_lookup()函数“从头开始”学习imdb数据集的单词表示。如果我理解正确,我必须在另一个隐藏层之前设置一个嵌入层,然后当我执行梯度下降时,该层将在该层的权重中“学习”一个单词表示。但是,当我尝试这样做时,我在嵌入层和网络的第一个完全连接的层之间出现了形状错误。

代码语言:javascript
复制
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()

我得到的错误是:

代码语言:javascript
复制
ValueError: Shapes TensorShape([Dimension(None), Dimension(300), Dimension(128)])
and TensorShape([Dimension(None), Dimension(None)]) must have the same rank
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-09 23:54:13

出现形状错误是因为您使用二维张量x来索引二维嵌入张量W。可以将tf.nn.embedding_lookup() (以及它的近亲tf.gather())看作是将x中的每个整数值i替换为行W[i, :]。从错误消息中,可以推断出n_input = 300embedding_size = 128。通常,维度的数量等于rank(x) + rank(W) - 1…的结果在本例中,3.当您尝试将此结果乘以_weights['h1']时出现错误,这是(二维)矩阵。

要修复这段代码,它取决于您正在尝试做什么,以及您为什么要将输入矩阵传递给嵌入。一种常见的做法是使用像tf.reduce_sum()这样的操作将每个输入示例的嵌入向量聚合到每个示例的一行中。例如,您可以执行以下操作:

代码语言:javascript
复制
W = tf.Variable(
    tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0) ,name="W")
embedding_layer = tf.nn.embedding_lookup(W, _X)

# Reduce along dimension 1 (`n_input`) to get a single vector (row)
# per input example.
embedding_aggregated = tf.reduce_sum(embedding_layer, [1])

layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(
    embedding_aggregated, _weights['h1']), _biases['b1'])) 
票数 17
EN

Stack Overflow用户

发布于 2016-09-08 14:25:14

另一种可能的解决方案是:不是添加嵌入向量,而是将这些向量连接成单个向量,并增加隐藏层中的神经元数量。

我使用:

embedding_aggregated = tf.reshape(embedding_layer, [-1, embedding_size * sequence_length])

此外,我将隐藏层中的神经元数量更改为embedding_size * sequence_length。观察:使用连接而不是加法也提高了准确性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35295191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档