这个问题相当抽象,不一定与张量流或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的预计算字嵌入 . 如果字符是空格,我在序列中获取前一个字的嵌入字,否则,我为不完整的字分配矢量(INC
,也是大小为200) . 序列为"red car"的真实示例:r>INC, e>INC, d>INC, _>embeddings["red"], c>INC, a>INC, r>INC
. -
y
:要预测的标签,即下一个字符,单热编码 . 此输出与x
具有相同的维度,因为它使用相同的字符索引 . 在上面的示例中,对于"r",y
是"e"的单热编码 .
1 回答
根据keras documentation,填充的想法似乎是一个 . 嵌入层中有
masking
参数,这将使keras跳过这些值而不是处理它们 . 从理论上讲,你不会失去那么多的表现 . 如果库已经很好地构建,则跳过实际上是跳过了额外的处理 .您只需要注意不要将值零归因于任何其他字符,甚至不是空格或未知单词 .
嵌入层不仅用于屏蔽(屏蔽只是嵌入层中的一个选项) .
嵌入层将来自单词/字符字典的整数值转换为特定形状的实际向量 .
假设你有这本词典:
你形成像这样的句子
嵌入层将每个整数转换为一定大小的向量 . 这同时做了两件好事:
转换向量中的单词,因为神经网络只能处理向量或强度 . 索引列表不能直接由神经网络处理,索引和单词之间没有逻辑关系
创建一个向量,该向量将是每个单词的“有意义”的一组要素 .
经过训练,他们成为“有意义的”载体 . 每个元素开始代表该单词的某个特征,尽管该特征对人类来说是模糊的 . 嵌入可能能够检测动词,名词,女性,阳性等词,所有内容都以数值(存在/消极/特征强度)的组合进行编码 .
您也可以尝试使用此问题中的方法,而不是使用屏蔽,而是需要按长度分隔批次,因此每次批处理都可以进行培训而无需填充它们:Keras misinterprets training data shape