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

How to massage inputs into Keras framework?

我是 keras 的新手,尽管阅读了 keras 中的文档和 examples 文件夹,但我仍在为如何将所有内容组合在一起而苦苦挣扎。

特别是,我想从一个简单的任务开始:我有一系列标记,其中每个标记都有一个标签。我有很多这样的训练数据——几乎是无限的,因为我可以根据需要生成更多 (token, label) 个训练对。

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

我希望它基于所有周围的标记,比如在同一行或句子中或window——而不仅仅是前面的标记。

我自己跑了多远:

现在挣扎于:

  1. 所有 input_diminput_shape 参数...因为每个句子都有不同的长度(不同数量的标记和标签),我应该把什么写成 input_dim对于输入层?
  2. 如何告诉网络使用 整个 token 句子 进行预测,而不仅仅是一个 token?如何在给定一系列标记的情况下预测整个标签序列,而不仅仅是基于先前标记的标签?
  3. 将文本拆分成句子或 windows 有意义吗?或者我可以将整个文本的矢量作为单个序列传递吗?什么是 "sequence"?
  4. 什么是"time slices"和"time steps"?文档不断提到这一点,我不知道这与我的问题有何关系。 keras 中的 "time" 是什么?

基本上,我无法将 "time" 或 "sequence" 等文档中的概念与我的问题联系起来。 Keras#40 之类的问题并没有让我变得更聪明。

如果能指出网络上的相关示例或代码示例,我们将不胜感激。不是找学术文章。

谢谢!

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

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

  3. 如果您的句子很长,则对随机子序列进行采样并对其进行训练可能会很有用。 Fx 100 个字符。这也有助于防止过度拟合。

  4. 时间步就是你的代币。一个句子是characters/tokens的序列。

我已经写了一个例子来说明我是如何理解你的问题的,但它没有经过测试,所以它可能不会 运行。我建议不要使用整数来表示您的数据,如果可能的话,我建议使用单热编码,然后使用 binary_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)