使用tf.gather().
单例案例
在下面的示例中,我们从矩阵中选择了可变数量的嵌入向量embedding。选择索引向量user可以是可变长度的。然后我们计算平均嵌入。
使用 tf.Graph().as_default():
嵌入 = tf.placeholder(shape=[10,3], dtype=tf.float32)
用户 = tf.placeholder(形状=无,dtype=tf.int32)
selected = tf.gather(嵌入,用户)
平均值 = tf.reduce_mean(选定,轴 = 0)
使用 tf.Session() 作为 sess:
sess.run(tf.global_variables_initializer())
embedding_ = np.random.randn(10,3)
user_ = [1,3,5]
打印(sess.run(平均, feed_dict={embedding:embedding_, user:user_}))
打印(np.mean(嵌入_[用户_],轴=0))
小批量中的多个实例
您可以手动将第一个向量指定embedding为零向量,并用 0 修补上述selection向量。例如
使用 tf.Graph().as_default():
嵌入 = tf.placeholder(shape=[10,3], dtype=tf.float32)
user = tf.placeholder(shape=[None, None], dtype=tf.int32)
selected = tf.gather(嵌入,用户)
non_zero_count = tf.cast(tf.count_nonzero(user, axis=1), tf.float32)
embedding_sum = tf.reduce_sum(selected, axis=1)
平均值 = embedding_sum / tf.expand_dims(non_zero_count, axis=1)
使用 tf.Session() 作为 sess:
sess.run(tf.global_variables_initializer())
embedding_ = np.concatenate([np.zeros((1,3)),np.random.randn(9,3)],axis=0)
user_ = [[3,5,7,0], [1,2,0,0]]
打印(sess.run(平均, feed_dict={embedding:embedding_, user:user_}))
print(np.sum([embedding_[i] for i in user_], axis=1) / np.atleast_2d(np.count_nonzero(user_, axis=1)).T)
tf.gather()即使embedding是可训练变量而不是占位符,您也可以这样使用。