使用 tensorflow 实现嵌入层

Posted

技术标签:

【中文标题】使用 tensorflow 实现嵌入层【英文标题】:implement a embedding layer using tensorflow 【发布时间】:2017-04-18 18:51:06 【问题描述】:

假设我的数据有 25 个特征。在 Keras 中,我可以轻松地为每个输入特征实现一个 Embedding 层,并将它们合并在一起以馈送到后面的层。

我看到tf.nn.embedding_lookup 接受id 参数,该参数可能只是一个普通整数或整数数组( [1,2,3,..] )。然而,特征输入通常是形状

x = tf.placeholder(tf.float32, [None, in_feature_num]) 

我可以使用

将功能拆分为自己的功能
X = tf.split(1,in_feature_num,x)

每个特征输入的形状为 [?, 1]。但是embedding_lookup 不接受 [?,1] 的形状,并且由于我们没有指定的行长,我不能将 reshapeunpack 设置为 [?] 之类的形状。

那么,我该如何转换像

这样的输入
[[1],
 [2],
 [3],
  ...
]

到这样的嵌入表示中:

[
  [....], #a vector
  [....], #a vector
  [....], #a vector 
   ...
]

相关的 SO 帖子是:What does tf.nn.embedding_lookup function do? 和 TensorFlow Embedding Lookup 但这些帖子并没有解决我的问题。

【问题讨论】:

我不是 100% 确定您所说的“您的数据具有特征”是什么意思。我的理解是嵌入是您输入数据的代表。所以它们是特征。您可以选择在 NN 前面添加嵌入层并学习权重以实际学习嵌入层,也可以添加通用的预训练层。您能否更具体地了解您的数据? 您是说您有一批 25 个特征,并且您希望每个特征都有自己的嵌入? 【参考方案1】:

我想我知道你的意思。问题是有什么特点?如果它们是数字的,那么你真的不需要嵌入层——你可以使用全连接层。但是,如果它们是分类的,我认为您有两种选择: 1. 为每个特征单独嵌入(所以你最终会得到 25 个嵌入层,它们需要连接起来) 2. 先将特征合并为一个

【讨论】:

是的,“最终有 25 个嵌入层”,这就是我想要实现的。我知道如何在 keras 中执行此操作,但是,我不知道如何在 tensorflow 中执行此操作... 这不是一个答案......从问题中可以清楚地看出他想要选项1,但你没有告诉他如何做到这一点 问题很清楚。此外,后期嵌入也很重要,尤其是在将两个向量合并为网络的输入时。例如,假设有两个向量需要用作输入。认为一个向量的维数为 2048,另一个是一个 4 维的热向量。所以你需要嵌入层。这对于尝试为每个功能获取嵌入可能是相同的。

以上是关于使用 tensorflow 实现嵌入层的主要内容,如果未能解决你的问题,请参考以下文章

张量(tensor)的阶、形状、数据类型

使用tensorflow引入了一个新层

tensorflow如何查看模型的所有层的输入输出的tensor name

如何保存Tensorflow中的Tensor参数,保存训练中的中间参数,存储卷积层的数据

Pytorch:嵌入层后,无法获得 <class 'torch.Tensor'> 的 repr

tensorflow的tensor