如何重塑文本数据以适合 keras 中的 LSTM 模型

Posted

技术标签:

【中文标题】如何重塑文本数据以适合 keras 中的 LSTM 模型【英文标题】:how to reshape text data to be suitable for LSTM model in keras 【发布时间】:2019-11-05 21:18:59 【问题描述】:

更新1:

我引用的代码就是书中的代码,你可以在here找到它。

唯一的事情是我不想在解码器部分有embed_size。这就是为什么我认为我根本不需要嵌入层,因为如果我放置嵌入层,我需要在解码器部分有embed_size(如果我错了请纠正我)。

总的来说,我尝试在不使用嵌入层的情况下采用相同的代码,因为我需要在解码器部分有vocab_size

我认为评论中提供的建议可能是正确的 (using one_hot_encoding) 我是如何遇到这个错误的:

当我做one_hot_encoding:

tf.keras.backend.one_hot(indices=sent_wids, classes=vocab_size)

我收到了这个错误:

in check_num_samples you should specify the + steps_name + argument ValueError: If your data is in the form of symbolic tensors, you should specify the steps_per_epoch argument (instead of the batch_size argument, because symbolic tensors are expected to produce batches of input data)

我准备数据的方式是这样的:

sent_lens 的形状是(87716, 200),我想以一种可以将其输入 LSTM 的方式对其进行重塑。 这里200 代表sequence_lenght87716 是我拥有的样本数。

下面是LSTM Autoencoder的代码:

inputs = Input(shape=(SEQUENCE_LEN,VOCAB_SIZE), name="input")
encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(inputs)
decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = LSTM(VOCAB_SIZE, return_sequences=True)(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='mse')
autoencoder.summary()
history = autoencoder.fit(Xtrain, Xtrain,batch_size=BATCH_SIZE, 
epochs=NUM_EPOCHS)

我是否还需要做任何额外的事情,如果没有,为什么我不能得到这个作品?

请让我知道哪一部分不清楚我会解释。

感谢您的帮助:)

【问题讨论】:

您需要一个嵌入层来获取嵌入向量序列而不是令牌 ID 序列,这将使您的输入始终适合 [batch, seq_length, embedding_dimension]。不过,您需要截断或填充以使每个句子的长度始终为 200。更改后随时更新您的问题。您可以查看预训练的嵌入,例如 word2vecGlov 等。 @greeness 非常感谢您抽出宝贵时间回答我的问题。数据的形状是(number of samples, sequence_lenght)。形状中的200 是我已经填充的sequence_lenght。假设我不想嵌入它,为什么需要通过暗淡的嵌入来喂它?这个LSTM Autoencoder 对我来说是最令人困惑的模型:|,请告诉我您希望我更新哪个部分 您的 update1 或 udpate2 都不完整。在更新 1 中,您没有展示如何使用 embeddings。您需要使用 embeddings 作为查找表将 id 序列转换为嵌入向量序列。在 update2 中,您包含的是一个反向查找表。我没有看到您如何将令牌 ID 列表转换为单热向量列表。 这个 tf 函数应该很方便:tf.keras.backend.one_hot(indices=sent_wids, classes=vocab_size) 进行一次热编码,请确保任何wids 小于您的vocab_size。 tensorflow.org/api_docs/python/tf/keras/backend/one_hot 我发现很难按照您的代码提供帮助。您可以分享(如果允许的话)prepare_data.clean_and_tokenize(bool) 是什么,或者至少是输出变量中的值,以便我们可以以某种方式重现它。如果您无法提供 word2vec_50d_7w 文件,请让我们知道 model_wv 需要什么。无论如何,我可以创建自己的 np.zeros 数组。如果你能把那些缺失的部分(有/没有细节)给我们,那么帮助你会容易得多。顺便说一句,它应该是 tf.keras.backend.one_hot(indices=sent_wids, num_classes=VOCAB_SIZE) 因为“类”参数不存在(: 【参考方案1】:

您需要通过以下方式重塑数据:

样本。一个序列就是一个样本。一个批次由一个或 更多样品。 时间步长。一个时间步是一个观察点 在样本中。 功能。一个特征是一次观察一个 步骤。

(samples, time_steps, features)

那么你的模型应该如下所示(简化版):

visible = Input(shape=(time_steps, features))
encoder = LSTM(100, activation='relu')(visible)
# define reconstruct decoder
decoder = RepeatVector(time_steps)(encoder)
decoder = LSTM(100, activation='relu', return_sequences=True)(decoder)
decoder = TimeDistributed(Dense(features))(decoder)
model = Model(visible, decoder)

查看this 很棒的教程。应该对您的情况有所帮助。

不过,也就是说你可能只需要expand the dimensions的数组。

检查this 可能会解决问题。

希望以上内容对您有所帮助。

【讨论】:

感谢您投入时间并为我提供答案,不过,我了解这些概念,并且之前已阅读过这些链接。我的问题是如何根据我拥有的数据形状进行重塑。我会试一试,然后再看一下链接。谢谢【参考方案2】:

正如 cmets 中所说,我只需要做one_hot_encoding

当我使用 tf.keras.backend 进行 one_hot 编码时,它会抛出我在问题中更新的错误。

然后我尝试了to_categorical(sent_wids, num_classes=VOCAB_SIZE) 并修复了它(但是面对memory error :D 这是不同的故事)!!!

我还应该提到我尝试了sparse_categorical_crossentropy 而不是one_hot_encoding,尽管它不起作用!

感谢您的所有帮助:)

【讨论】:

以上是关于如何重塑文本数据以适合 keras 中的 LSTM 模型的主要内容,如果未能解决你的问题,请参考以下文章

如何为 LSTM keras 重塑 X_train 和 y_train

Keras LSTM 模型的 batch_input_shape

如何在 keras 中拟合两个连接 LSTM 的模型?

keras 中的小型 LSTM 模型不适合我的 GPU

用于 LSTM 的 Keras 多元形状

如何为 LSTM 重塑数据 - 时间序列多类分类