python - LSTM 预测模式 010101... 了解隐藏状态
问题描述
我做了一个快速实验,看看我是否能理解hidden state
LSTM 的作用......
我试图让 LSTM 根据X
with的输入序列预测 [1,0,1,0,1...] 的序列,X[0] = 1
其余为随机噪声。
X = [1, randFloat, randFloat, randFloat...]
label = [1, 0, 1, 0...]
在我的脑海中,模型会理解:
- 输入
X
没有任何意义,或者至少没有什么意义(因为它是噪音) - 所以它会在大多数情况下丢弃这些值 - 仅
hidden state
来自上一个序列/时间步长的n
将用于预测下一个时间步长n+1
... [1, 0, 1, 0...] - 我还设置
X[0] = 1
了第一个初始值,以试图引导网络预测第一个项目的 1(它确实如此)
所以,这没有用。理论上,不应该吗?你能解释一下吗?
它基本上永远不会收敛,并且处于猜测0
或之间的风口浪尖1
## Code
import os
import numpy as np
import torch
from torchvision import transforms
from torch import nn
from sklearn import preprocessing
from util import create_sequences
import torch.optim as optim
创建一些虚假数据
sequence_1 = torch.tensor(np.random.uniform(size=50)).float().detach()
sequence_1[0] = 1
sequence_2 = torch.tensor(np.random.uniform(size=50)).float().detach()
sequence_2[0] = 1
labels_1 = np.zeros(50)
labels_1[::2] = 1
labels_1 = torch.tensor(labels_1, dtype=torch.long)
labels_2 = labels_1.clone()
training_data = [sequence_1, sequence_2]
label_data = [labels_1, labels_2]
创建简单的 LSTM 模型
class LSTM(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super(LSTM, self).__init__()
self.lstm = nn.LSTM(input_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, seq):
lstm_out, _ = self.lstm(seq.view(len(seq), 1, -1))
out = self.fc(lstm_out.view(len(seq), -1))
out = F.log_softmax(out, dim=1)
return out
我们尝试过拟合数据集
INPUT_DIM = 1
HIDDEN_DIM = 6
model = LSTM(INPUT_DIM, HIDDEN_DIM, 2)
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
for epoch in range(500):
for i, seq in enumerate(training_data):
labels = label_data[i]
model.zero_grad()
scores = model(seq)
loss = loss_function(scores, labels)
loss.backward()
print(loss)
optimizer.step()
with torch.no_grad():
seq_d = training_data[0]
tag_scores = model(seq_d)
for score in tag_scores:
print(np.argmax(score))
解决方案
我会说这不是为了工作。
该模型将始终尝试理解并在其训练的数据中找到模式sequence_1
,即“验证”它已“找到”它们,它使用labels_1
. 由于数据是随机的,模型无法找到模式。
模型试图找到的模式不在标签中,而是在数据中,因此标签的排列方式并不重要。标签实际上从未穿过模型,所以NO。
如果也许,你在一个例子上训练它,那么肯定是。该模型将变得过度拟合,并为您提供您的 1 和 0,并在其他示例中惨遭失败,否则无论大小如何,它都无法理解随机数据。
隐藏状态
仅前一个序列/时间步 n 的隐藏状态将用于预测下一个时间步 n+1... [1, 0, 1, 0...]
关于隐藏状态,注意它不是可训练的参数,它是对数据和参数执行一些操作的结果,这意味着输入数据决定隐藏状态。
隐藏状态的作用是保存模型从先前时间步中提取的信息,并将其传递给下一个时间步或作为输出。在 LSTM 的情况下,它会在通过之前进行一些遗忘和更新。
推荐阅读
- android - 来自 Firebase storageReference 的 getBytes 不起作用
- pandas - 熊猫 groupby 和排名 - 重复的排名相同
- excel - 在 IE 窗口中填写表格:按下按钮并填写文本框
- mongodb - $lookup 在 MongoDB 中工作,但不与 mongoose 一起工作
- layout - 如何在 amp-story 的上三分之一处居中文本?
- javascript - CredentialsError:配置节点中缺少凭据
- ruby-on-rails - 表单中的第一个参数不能包含 nil 或为空,但它不应为 nil 或空
- prism - Prism 7.1.0 使用 app.config 加载模块
- python - 在 django 项目中组织模板
- json - 使用 JSON.Net 将 JSON 数组反序列化为 Dictionary