如何将输入按摩到 Keras 框架中?
How to massage inputs into Keras framework?
我是 keras 的新手,尽管阅读了 keras 中的文档和 examples
文件夹,但我仍在为如何将所有内容组合在一起而苦苦挣扎。
特别是,我想从一个简单的任务开始:我有一系列标记,其中每个标记都有一个标签。我有很多这样的训练数据——几乎是无限的,因为我可以根据需要生成更多 (token, label)
个训练对。
我想建立一个网络来预测给定标记的标签。令牌的数量必须始终与标签的数量相同(一个令牌 = 一个标签)。
我希望它基于所有周围的标记,比如在同一行或句子中或window——而不仅仅是前面的标记。
我自己跑了多远:
- 创建了训练 numpy 向量,其中我使用标记到整数和标签到整数的映射将每个句子转换为标记向量和标签向量(相同长度)
- 基于 https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py.
使用 categorical_crossentropy
和一个 LSTM 层编写了一个模型
现在挣扎于:
- 所有
input_dim
和 input_shape
参数...因为每个句子都有不同的长度(不同数量的标记和标签),我应该把什么写成 input_dim
对于输入层?
- 如何告诉网络使用 整个 token 句子 进行预测,而不仅仅是一个 token?如何在给定一系列标记的情况下预测整个标签序列,而不仅仅是基于先前标记的标签?
- 将文本拆分成句子或 windows 有意义吗?或者我可以将整个文本的矢量作为单个序列传递吗?什么是 "sequence"?
- 什么是"time slices"和"time steps"?文档不断提到这一点,我不知道这与我的问题有何关系。 keras 中的 "time" 是什么?
基本上,我无法将 "time" 或 "sequence" 等文档中的概念与我的问题联系起来。 Keras#40 之类的问题并没有让我变得更聪明。
如果能指出网络上的相关示例或代码示例,我们将不胜感激。不是找学术文章。
谢谢!
如果您有不同长度的序列,您可以填充它们或使用有状态的 RNN 实现,其中激活在批次之间保存。前者是最简单和最常用的。
如果您想在使用 RNN 时使用未来信息,您需要使用双向模型,在该模型中您连接两个 RNN 的反向移动。例如,RNN 将使用所有先前信息的表示。预测。
如果您的句子很长,则对随机子序列进行采样并对其进行训练可能会很有用。 Fx 100 个字符。这也有助于防止过度拟合。
时间步就是你的代币。一个句子是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)
我是 keras 的新手,尽管阅读了 keras 中的文档和 examples
文件夹,但我仍在为如何将所有内容组合在一起而苦苦挣扎。
特别是,我想从一个简单的任务开始:我有一系列标记,其中每个标记都有一个标签。我有很多这样的训练数据——几乎是无限的,因为我可以根据需要生成更多 (token, label)
个训练对。
我想建立一个网络来预测给定标记的标签。令牌的数量必须始终与标签的数量相同(一个令牌 = 一个标签)。
我希望它基于所有周围的标记,比如在同一行或句子中或window——而不仅仅是前面的标记。
我自己跑了多远:
- 创建了训练 numpy 向量,其中我使用标记到整数和标签到整数的映射将每个句子转换为标记向量和标签向量(相同长度)
- 基于 https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py. 使用
categorical_crossentropy
和一个 LSTM 层编写了一个模型
现在挣扎于:
- 所有
input_dim
和input_shape
参数...因为每个句子都有不同的长度(不同数量的标记和标签),我应该把什么写成input_dim
对于输入层? - 如何告诉网络使用 整个 token 句子 进行预测,而不仅仅是一个 token?如何在给定一系列标记的情况下预测整个标签序列,而不仅仅是基于先前标记的标签?
- 将文本拆分成句子或 windows 有意义吗?或者我可以将整个文本的矢量作为单个序列传递吗?什么是 "sequence"?
- 什么是"time slices"和"time steps"?文档不断提到这一点,我不知道这与我的问题有何关系。 keras 中的 "time" 是什么?
基本上,我无法将 "time" 或 "sequence" 等文档中的概念与我的问题联系起来。 Keras#40 之类的问题并没有让我变得更聪明。
如果能指出网络上的相关示例或代码示例,我们将不胜感激。不是找学术文章。
谢谢!
如果您有不同长度的序列,您可以填充它们或使用有状态的 RNN 实现,其中激活在批次之间保存。前者是最简单和最常用的。
如果您想在使用 RNN 时使用未来信息,您需要使用双向模型,在该模型中您连接两个 RNN 的反向移动。例如,RNN 将使用所有先前信息的表示。预测。
如果您的句子很长,则对随机子序列进行采样并对其进行训练可能会很有用。 Fx 100 个字符。这也有助于防止过度拟合。
时间步就是你的代币。一个句子是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)