首页 文章

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

提问于
浏览
2

这个问题相当抽象,不一定与张量流或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 回答

  • 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

相关问题