首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从包含y个嵌入值的Tensorflow变量中平均x个嵌入值的最有效方法

从包含y个嵌入值的Tensorflow变量中平均x个嵌入值的最有效方法
EN

Stack Overflow用户
提问于 2018-06-05 02:41:09
回答 2查看 396关注 0票数 0

假设我总共有y个使用以下代码检索到的嵌入

embeds = tf.nn.embedding_lookup(embeddings, train_dataset)

所以数据应该是这样的

embeds = [embed45, embed2, embed939, embed3, embed32, embed2, . . . etc]

比方说,我想取3个嵌入组的平均值。所以就像这样

averaged_embeds = [ averageOf(embed45, embed2, embed939) , averageOf(embed3, embed32, embed2), . . . . etc]

因此,当进行评估时,它将如下所示

averaged_embeds = [ averagedEmbeds1, averagedEmbeds2, averagedEmbeds3, . . . etc]

做这件事最好的方法是什么?

我的第一个想法是tf.segment_mean,但据我所知,它只能取每个嵌入的平均值,它不能取一堆嵌入的平均值(如果这是错误的,请告诉我)。

还有一个tf.reduce_mean,它可以沿着指定的维度求平均值,但它将取所有嵌入的平均值,而不是某个特定数字的束。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-05 04:23:19

您可以使用tf.split,但这意味着,如果输入是标量,则参数num_or_size_splits应该是输入长度的倍数,或者沿着拆分维度的维度总和应该与输入的长度匹配(对于tf.segment_mean也是如此)。一种更好的方法是在那些限制不适用的地方使用tf.extract_image_patches

# generate batch of inputs
def get_batch(tensor, batch, k):
    return tf.extract_image_patches(tensor, 
                                ksizes=[1, batch, k, 1], 
                                strides=[1, batch, k, 1], 
                                rates=[1, 1, 1, 1], padding='VALID')


embed_dim = 5
batch = 3
x = np.arange(200).reshape(-1, embed_dim)

embeddings = tf.constant(x)
train_dataset = tf.constant([0,1,2,5,6,7])
embeds = tf.nn.embedding_lookup(embeddings, train_dataset)


split = tf.reshape(get_batch(embeds[None,..., None], batch, embed_dim),
                   [-1, batch, embed_dim])
avg = tf.reduce_mean(split, 1)

with tf.Session() as sess:
   print(sess.run(embeds))
   #[[ 0  1  2  3  4]
   # [ 5  6  7  8  9]
   # [10 11 12 13 14]
   # [25 26 27 28 29]
   # [30 31 32 33 34]
   # [35 36 37 38 39]]

   print(sess.run(split))
   #[[[ 0  1  2  3  4]
   # [ 5  6  7  8  9]
   # [10 11 12 13 14]]

   # [[25 26 27 28 29]
   #  [30 31 32 33 34]
   #  [35 36 37 38 39]]]

   print(sess.run(avg))
   #[[ 5  6  7  8  9]
   # [30 31 32 33 34]]

对于3D分段,代码更改为:

 dim1 = 2
 x = np.arange(200).reshape(-1, dim1, embed_dim)
 split = tf.reshape(get_batch(embeds[None,...], batch, dim1),
                    [-1, batch, dim1, embed_dim])
票数 0
EN

Stack Overflow用户

发布于 2018-06-06 06:21:24

实际上,tf.segment_mean可以用于平均嵌入,下面是一个示例

%matplotlib inline
from __future__ import print_function
import collections
import math
import numpy as np
import os
import random
import tensorflow as tf
import zipfile
from matplotlib import pylab
from six.moves import range
from six.moves.urllib.request import urlretrieve

tf.enable_eager_execution() 

train_dataset = [3, 7, 5 ,12 ,19 ,6, 10, 8]

embeddings = tf.get_variable( 'generator', 
    initializer=tf.random_uniform([20, 6], -1.0, 1.0))

embed = tf.nn.embedding_lookup(embeddings, train_dataset)

print(embed)

segments= np.arange(2).repeat(4)
print(segments)

averaged_embeds = tf.segment_mean( embed, segments, name=None)
print(averaged_embeds)

#Use this to confirm that the embeddings were averaged correctly
print( np.mean([   -0.78844213 ,  -0.2852435 , 0.58107734, 0.12990952   ]))

不幸的是,如果嵌入张量有两个以上的维度,我还没有找到取平均值的方法。我尝试使用具有多个维度的segments,但似乎不起作用。到目前为止,我在tf.segment_mean操作之前和之后重塑了embedsegments张量。

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

https://stackoverflow.com/questions/50686873

复制
相关文章

相似问题

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