加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 嵌入在tensorflow中做了什么

发布时间:2020-12-20 12:33:38 所属栏目:Python 来源:网络整理
导读:我正在阅读这里使用带有张量流的RNN的示例: ptb_word_lm.py 我无法弄清楚嵌入和embedding_lookup在这里做了什么.它如何为张量添加另一个维度?从(20,25)到(20,25,200).在这种情况下(20,25)是20的批量大小,具有25个时间步长.我不明白为什么/为什么你可以添加
我正在阅读这里使用带有张量流的RNN的示例: ptb_word_lm.py

我无法弄清楚嵌入和embedding_lookup在这里做了什么.它如何为张量添加另一个维度?从(20,25)到(20,25,200).在这种情况下(20,25)是20的批量大小,具有25个时间步长.我不明白为什么/为什么你可以添加单元格的hidden_??size作为输入数据的维度?通常,输入数据将是大小为[batch_size,num_features]的矩阵,并且模型将映射num_features —> hidden_??dims,其大小为[num_features,hidden_??dims]矩阵,产生的大小为[batch-size,hidden-dims].那么hidden_??dims如何成为输入张量的维度呢?

input_data,targets = reader.ptb_producer(train_data,20,25)
cell = tf.nn.rnn_cell.BasicLSTMCell(200,forget_bias=1.0,state_is_tuple=True)
initial_state = cell.zero_state(20,tf.float32)
embedding = tf.get_variable("embedding",[10000,200],dtype=tf.float32)
inputs = tf.nn.embedding_lookup(embedding,input_data)

input_data_train # <tf.Tensor 'PTBProducer/Slice:0' shape=(20,25) dtype=int32>
inputs # <tf.Tensor 'embedding_lookup:0' shape=(20,200) dtype=float32>

outputs = []
state = initial_state
for time_step in range(25):
    if time_step > 0: 
        tf.get_variable_scope().reuse_variables()

    cell_output,state = cell(inputs[:,time_step,:],state)
    outputs.append(cell_output)

output = tf.reshape(tf.concat(1,outputs),[-1,200])

outputs # list of 20: <tf.Tensor 'BasicLSTMCell/mul_2:0' shape=(20,200) dtype=float32>
output # <tf.Tensor 'Reshape_2:0' shape=(500,200) dtype=float32>

softmax_w = tf.get_variable("softmax_w",[config.hidden_size,config.vocab_size],dtype=tf.float32)
softmax_b = tf.get_variable("softmax_b",dtype=tf.float32)
logits = tf.matmul(output,softmax_w) + softmax_b

loss = tf.nn.seq2seq.sequence_loss_by_example([logits],[tf.reshape(targets,[-1])],[tf.ones([20*25],dtype=tf.float32)])
cost = tf.reduce_sum(loss) / batch_size

解决方法

好吧,我不打算尝试解释这个特定的代码,但我会尝试回答“什么是嵌入?”标题的一部分.

基本上,它是将原始输入数据映射到一组实值维度中,并且组织这些维度中的原始输入数据的“位置”以改进任务.

在tensorflow中,如果你想象一些文本输入字段有“王”,“女王”,“女孩”,“男孩”,你有2个嵌入维度.希望backprop能够训练嵌入,将版税的概念放在一个轴上,将性别放在另一个轴上.因此,在这种情况下,4分类值特征被“煮沸”到具有2维的浮点嵌入特征.

它们使用查找表实现,可以从原始列表或字典顺序进行哈希处理.对于一个训练有素的人,你可能会输入“女王”,然后你说出[1.0,1.0],输入“男孩”然后你得到[0.0,0.0].

Tensorflow会在错误INTO这个查找表中做出反馈,并希望从随机初始化的字典开始逐渐变得像我们在上面看到的那样.

希望这可以帮助.如果没有,请查看:http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读