- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试构建一个 LSTM 自动编码器,目标是从序列中获取固定大小的向量,该向量尽可能好地表示该序列。这个自动编码器由两部分组成:
LSTM
编码器:接受一个序列并返回一个输出向量(return_sequences = False
)LSTM
解码器:获取一个输出向量并返回一个序列(return_sequences = True
)所以,最后,编码器是多对一 LSTM,解码器是一对多 LSTM。
图片来源:Andrej Karpathy
在高层次上,编码看起来像这样(类似于 here 的描述):
encoder = Model(...)
decoder = Model(...)
autoencoder = Model(encoder.inputs, decoder(encoder(encoder.inputs)))
autoencoder.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
autoencoder.fit(data, data,
batch_size=100,
epochs=1500)
data
的形状(训练示例数、序列长度、输入维度)数组是 (1200, 10, 5)
看起来像这样:
array([[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
...,
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
... ]
问题:我不知道如何进行,尤其是如何集成LSTM
至Model
以及如何让解码器从向量生成序列。
我正在使用 keras
与 tensorflow
后端。
编辑:如果有人想尝试,这是我生成带有移动序列(包括填充)的随机序列的过程:
import random
import math
def getNotSoRandomList(x):
rlen = 8
rlist = [0 for x in range(rlen)]
if x <= 7:
rlist[x] = 1
return rlist
sequence = [[getNotSoRandomList(x) for x in range(round(random.uniform(0, 10)))] for y in range(5000)]
### Padding afterwards
from keras.preprocessing import sequence as seq
data = seq.pad_sequences(
sequences = sequence,
padding='post',
maxlen=None,
truncating='post',
value=0.
)
最佳答案
模型可以是您想要的任何方式。如果我没听错的话,你只是想知道如何用 LSTM 创建模型?
使用 LSTM
首先,您必须定义编码向量的外观。假设您希望它是一个包含 20 个元素的数组,一个一维向量。所以,形状(无,20)。它的大小取决于你,没有明确的规则可以知道理想的大小。
并且您的输入必须是三维的,例如您的 (1200,10,5)。在 keras 摘要和错误消息中,它将显示为 (None,10,5),因为“None”表示批量大小,每次训练/预测时都会有所不同。
有很多方法可以做到这一点,但是,假设您只需要一个 LSTM 层:
from keras.layers import *
from keras.models import Model
inpE = Input((10,5)) #here, you don't define the batch size
outE = LSTM(units = 20, return_sequences=False, ...optional parameters...)(inpE)
这对于一个非常简单的编码器来说已经足够了,它会产生一个包含 20 个元素的数组(但如果需要,您可以堆叠更多层)。让我们创建模型:
encoder = Model(inpE,outE)
现在,对于解码器,它变得晦涩难懂。你不再有一个实际的序列,而是一个静态的有意义的向量。您可能仍然想使用 LTSM,他们会假设向量是一个序列。
但在这里,由于输入具有形状 (None,20),因此您必须先将其重新整形为某个 3 维数组,以便接下来附加一个 LSTM 层。
reshape 它的方式完全取决于您。 1 个元素的 20 个步骤? 20 个元素的 1 步? 2个元素的10个步骤?谁知道?
inpD = Input((20,))
outD = Reshape((10,2))(inpD) #supposing 10 steps of 2 elements
请务必注意,如果您不再有 10 个步骤,您将无法仅启用“return_sequences”并获得所需的输出。你将不得不工作一点。实际上,没有必要使用“return_sequences”甚至使用 LSTM,但您可以这样做。
由于在我的 reshape 中我有 10 个时间步(有意),因此可以使用“return_sequences”,因为结果将有 10 个时间步(作为初始输入)
outD1 = LSTM(5,return_sequences=True,...optional parameters...)(outD)
#5 cells because we want a (None,10,5) vector.
您可以通过许多其他方式工作,例如简单地创建一个 50 单元的 LSTM,而不返回序列,然后重新调整结果:
alternativeOut = LSTM(50,return_sequences=False,...)(outD)
alternativeOut = Reshape((10,5))(alternativeOut)
我们的模型是这样的:
decoder = Model(inpD,outD1)
alternativeDecoder = Model(inpD,alternativeOut)
之后,您将模型与代码结合起来并训练自动编码器。所有三个模型将具有相同的权重,因此您可以通过使用其 predict
方法使编码器带来结果。
encoderPredictions = encoder.predict(data)
我经常看到用于生成序列的 LSTM 类似于预测下一个元素。
您只取序列中的几个元素并尝试找到下一个元素。然后你又向前迈了一步,依此类推。这可能有助于生成序列。
关于python - LSTM 自动编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44647258/
我无法准确理解 LSTM 单元的范围——它如何映射到网络层。来自格雷夫斯 (2014): 在我看来,在单层网络中,layer = lstm 单元。这实际上如何在多层 rnn 中工作? 三层RNN LS
这是代码 model = Sequential() model.add(LSTM(256, input_shape=(None, 1), return_sequences=True)) model.a
为什么我们需要在pytorch中初始化LSTM中的隐藏状态h0。由于 h0 无论如何都会被计算并被覆盖?是不是很像 整合一个一 = 0 一个= 4 即使我们不做a=0,也应该没问题.. 最佳答案 重点
我正在尝试使用 LSTM 在 Deeplearning4j 中进行一些简单的时间序列预测,但我很难让它工作。 我有一个简单的文本文件,其中包含如下所示的数字列表,并希望网络学习预测下一个数字。 有没有
在大量阅读和绘制图表之后,我想我已经提出了一个模型,我可以将其用作更多测试我需要调整哪些参数和功能的基础。但是,我对如何实现以下测试用例感到困惑(所有数字都比最终模型小几个数量级,但我想从小处着手):
我正在尝试实现“Livelinet:用于预测教育视频中的活力的多模式深度循环神经网络”中的结构。 为了简单说明,我将 10 秒音频剪辑分成 10 个 1 秒音频剪辑,并从该 1 秒音频剪辑中获取频谱图
我正在 Tensorflow 中制作 LSTM 神经网络。 输入张量大小为 92。 import tensorflow as tf from tensorflow.contrib import rnn
我正在尝试 keras IMDB 数据的示例,数据形状是这样的: x_train shape: (25000, 80) 我只是把keras例子的原始代码改成了这样的代码: model = Sequen
我需要了解如何使用 torch.nn 的不同组件正确准备批量训练的输入。模块。具体来说,我希望为 seq2seq 模型创建一个编码器-解码器网络。 假设我有一个包含这三层的模块,按顺序: nn.Emb
我很难概念化 Keras 中有状态 LSTM 和无状态 LSTM 之间的区别。我的理解是,在每个批处理结束时,在无状态情况下“网络状态被重置”,而对于有状态情况,网络状态会为每个批处理保留,然后必须在
nn.Embedding() 是学习 LSTM 所必需的吗? 我在 PyTorch 中使用 LSTM 来预测 NER - 此处是类似任务的示例 - https://pytorch.org/tutori
我正在尝试找出适合我想要拟合的模型的正确语法。这是一个时间序列预测问题,我想在将时间序列输入 LSTM 之前使用一些密集层来改进时间序列的表示。 这是我正在使用的虚拟系列: import pandas
我在理解堆叠式 LSTM 网络中各层的输入-输出流时遇到了一些困难。假设我已经创建了一个如下所示的堆叠式 LSTM 网络: # parameters time_steps = 10 features
LSTM 类中的默认非线性激活函数是 tanh。我希望在我的项目中使用 ReLU。浏览文档和其他资源,我无法找到一种简单的方法来做到这一点。我能找到的唯一方法是定义我自己的自定义 LSTMCell,但
在 PyTorch 中,有一个 LSTM 模块,除了输入序列、隐藏状态和单元状态之外,它还接受 num_layers 参数,该参数指定我们的 LSTM 有多少层。 然而,还有另一个模块 LSTMCel
没什么好说的作为介绍:我想在 TensorFlow 中将 LSTM 堆叠在另一个 LSTM 上,但一直被错误阻止,我不太明白,更不用说单独解决了。 代码如下: def RNN(_X, _istate,
有人可以解释一下吗?我知道双向 LSTM 具有前向和反向传递,但是与单向 LSTM 相比,它有什么优势? 它们各自更适合什么? 最佳答案 LSTM 的核心是使用隐藏状态保留已经通过它的输入信息。 单向
我想构建一个带有特殊词嵌入的 LSTM,但我对它的工作原理有一些疑问。 您可能知道,一些 LSTM 对字符进行操作,因此它是字符输入,字符输出。我想做同样的事情,通过对单词的抽象来学习使用嵌套的 LS
我编写了一个LSTM回归模型。它是最后一个LSTM层的BATCH_SIZE=1和RETURN_Sequence=True的模型。我还设置了VERIFICATION_DATA和耐心进行培训。但似乎存在一
给定一个训练有素的 LSTM 模型,我想对单个时间步执行推理,即以下示例中的 seq_length = 1。在每个时间步之后,需要为下一个“批处理”记住内部 LSTM(内存和隐藏)状态。在推理的最开始
我是一名优秀的程序员,十分优秀!