假设我总共有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,它可以沿着指定的维度求平均值,但它将取所有嵌入的平均值,而不是某个特定数字的束。
发布于 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])
发布于 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
操作之前和之后重塑了embed
和segments
张量。
https://stackoverflow.com/questions/50686873
复制相似问题