Deep learning 如何将输入按摩到Keras框架中?

Deep learning 如何将输入按摩到Keras框架中?,deep-learning,keras,lstm,Deep Learning,Keras,Lstm,我是keras的新手,尽管阅读了keras中的文档和examples文件夹,但我仍在努力解决如何将所有内容整合在一起的问题 特别是,我想从一个简单的任务开始:我有一个令牌序列,其中每个令牌正好有一个标签。我有很多这样的训练数据——实际上是无限的,因为我可以根据需要生成更多的(令牌、标签)训练对 我想建立一个网络来预测给定令牌的标签。令牌的数量必须始终与标签的数量相同(一个令牌=一个标签) 我希望这是基于所有周围标记的,比如在同一行、句子或窗口内,而不仅仅是前面的标记 我自己走了多远: 创建了训

我是keras的新手,尽管阅读了keras中的文档和
examples
文件夹,但我仍在努力解决如何将所有内容整合在一起的问题

特别是,我想从一个简单的任务开始:我有一个令牌序列,其中每个令牌正好有一个标签。我有很多这样的训练数据——实际上是无限的,因为我可以根据需要生成更多的
(令牌、标签)
训练对

我想建立一个网络来预测给定令牌的标签。令牌的数量必须始终与标签的数量相同(一个令牌=一个标签)

我希望这是基于所有周围标记的,比如在同一行、句子或窗口内,而不仅仅是前面的标记

我自己走了多远:

  • 创建了训练numpy向量,其中我使用token-to-int和label-to-int映射将每个句子转换为token向量和label向量(长度相同)
  • 使用分类交叉熵和一个LSTM层编写了一个模型,基于
现在正与之斗争:

  • 所有
    input\u dim
    input\u shape
    参数。。。由于每个句子都有不同的长度(不同数量的标记和标签),我应该为输入层设置什么作为
    input\u dim
  • 如何告诉网络使用整个标记语句进行预测,而不仅仅是一个标记?如何预测给定令牌序列的整个标签序列,而不仅仅是基于先前令牌的标签
  • 将文本拆分为句子或窗口有意义吗?或者我可以把整个文本的向量作为单个序列传递吗?什么是“序列”
  • 什么是“时间片”和“时间步”?文档不断提到这一点,我不知道这与我的问题有什么关系。keras中的“时间”是什么
  • 基本上,我很难将文档中的概念(如“时间”或“顺序”)与我的问题联系起来。像这样的问题并没有让我变得更聪明

    如果能在网上找到相关的例子或代码示例,我们将不胜感激。不找学术文章

    谢谢

  • 如果您有不同长度的序列,您可以填充它们,或者使用有状态RNN实现,在其中,激活在批之间保存。前者是最简单和最常用的

  • 如果您想在使用RNN时使用将来的信息,您需要使用双向模型,在双向模型中连接两个反向移动的RNN。RNN将使用所有先前信息的表示,例如预测

  • 如果你有很长的句子,对一个随机的子序列进行采样并训练可能会很有用。外汇100个字符。这也有助于过度装修

  • 时间步长是你的代币。句子是一系列字符/标记

  • 我已经写了一个我如何理解你的问题的例子,但是它没有经过测试,所以可能无法运行。如果可能的话,我建议使用一种热编码,而不是使用整数来表示数据,然后使用
    binary\u crossentropy
    而不是
    mse

    from keras.models import Model
    from keras.layers import Input, LSTM, TimeDistributed
    from keras.preprocessing import sequence
    
    # Make sure all sequences are of same length
    X_train = sequence.pad_sequences(X_train, maxlen=maxlen)
    
    # The input shape is your sequence length and your token embedding size (which is 1)
    inputs = Input(shape=(maxlen, 1))
    
    # Build a bidirectional RNN
    lstm_forward = LSTM(128)(inputs)
    lstm_backward = LSTM(128, go_backwards=True)(inputs)
    bidirectional_lstm = merge([lstm_forward, lstm_backward], mode='concat', concat_axis=2)
    
    # Output each timestep into a fully connected layer with linear 
    # output to map to an integer
    sequence_output = TimeDistributed(Dense(1, activation='linear'))(bidirectional_lstm)
    # Dense(n_classes, activation='sigmoid') if you want to classify
    
    model = Model(inputs, sequence_output)
    model.compile('adam', 'mse')
    model.fit(X_train, y_train)