如何重塑文本数据以使其适合于Keras中的LSTM模型

时间:2019-06-24 05:24:12

标签: python tensorflow keras lstm autoencoder

更新1:

Im引用的代码恰恰是本书中的代码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)

我仍然需要做些额外的事情吗?如果没有,为什么我无法使它正常工作?

请让我知道我要解释的部分不清楚。

感谢您的帮助:)

2 个答案:

答案 0 :(得分: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,这可能会清除问题。

希望以上内容会有所帮助。

答案 1 :(得分:-1)

因此,正如评论中所说,事实证明我只需要做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

感谢您的帮助:)