如何使用可变大小的输入进行训练?

时间:2017-09-12 15:11:13

标签: tensorflow deep-learning keras lstm rnn

这个问题相当抽象,不一定与tensorflow或keras有关。假设您想训练语言模型,并且您希望为LSTM使用不同大小的输入。特别是,我正在关注这篇论文:https://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion

除其他外,作者使用字嵌入和字符的单热编码。最有可能的是,每种输入的尺寸都不同。现在,为了将其提供给网络,我看到了一些替代方案,但我确信我错过了一些东西,我想知道应该怎么做。

  • 创建3D张量形状(实例,2,最大(嵌入,字符))。也就是说,用0s填充较小的输入。
  • 创建3D张量形状(实例,嵌入+字符,1))。也就是说,连接输入。

在我看来,两种选择对于有效训练模型都是不利的。那么,最好的方法是什么?我看到作者为此目的使用嵌入层,但从技术上讲,这是什么意思?

修改

以下是更多详情。我们将这些输入称为X(字符级输入)和E(字级输入)。在序列的每个字符(文本)上,我计算x,e和y,标签。

  • x:字符一热编码。我的角色索引大小为38,因此这是一个填充37个零和一个1的向量。
  • e:维度200的预计算字嵌入。如果字符是空格,我会在序列中获取前一个单词的嵌入字词,否则,我会为不完整的单词指定矢量({{1} },大小200)。序列为“红色汽车”的真实示例:INC
  • r>INC, e>INC, d>INC, _>embeddings["red"], c>INC, a>INC, r>INC:要预测的标签,即下一个字符,单热编码。此输出与y具有相同的维度,因为它使用相同的字符索引。在上面的示例中,对于“r”,x是“e”的单热编码。

1 个答案:

答案 0 :(得分:1)

根据keras documentation,填充的想法似乎就是那个。嵌入层中有masking参数,这将使keras跳过这些值而不是处理它们。从理论上讲,你不会失去那么多的表现。如果库已经很好地构建,则跳过实际上是跳过了额外的处理。

你只需要注意不要将零值归因于任何其他角色,甚至是空格或未知单词。

嵌入层不仅用于屏蔽(屏蔽只是嵌入层中的一个选项)。

嵌入层将单词/字符字典中的整数值转换为特定形状的实际向量。

假设您有这本词典:

1: hey
2: ,
3: I'm
4: here
5: not

你形成像

这样的句子
[1,2,3,4,0] -> this is "hey, I'm here"
[1,2,3,5,4] -> this is "hey, I'm not here"
[1,2,1,2,1] -> this is "hey, hey, hey"

嵌入层将每个整数转换为特定大小的向量。这同时做了两件好事:

  • 转换向量中的单词,因为神经网络只能处理向量或强度。索引列表不能直接由神经网络处理,索引和单词之间没有逻辑关系

  • 创建一个向量,该向量将是每个单词的“有意义”的一组要素。

经过训练,他们成为“有意义的”载体。每个元素开始代表该单词的某个特征,尽管该特征对人类来说是模糊的。嵌入可能能够检测动词,名词,女性,男性等词语,所有内容都以数值(存在/消极/特征强度)的组合进行编码。

你也可以在这个问题中尝试这种方法,而不是使用掩蔽,需要按长度分开批次,这样每个批次都可以一次训练而不需要填充它们:Keras misinterprets training data shape