在 Pytorch LSTM 中,基础 class 是否自行处理隐藏层,还是必须定义它(其他问题)
In a Pytorch LSTM, does the base class take care of a hidden layer on its own, or must it be defined (additional questions)
让我们看下面的代码:
'''
LSTM class
'''
import torch
import pandas as pd
import numpy as np
import torch.nn.CrossEntropyLoss
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super (LSTM, self).__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
def forward(self, x):
# receive an input, create a new hidden state, return output?
# reset the hidden state?
hidden = (torch.zeros(num_layers, hidden_size), torch.zeros(num_layers, hidden_size))
x, hidden = self.lstm(x, hidden)
#since our observation has several sequences, we only want the output after the last sequence of the observation'''
x = x[:, -1]
return x
我在这里有几个问题,如果允许的话,我宁愿一次问所有问题,也不愿在单个帖子之间等待 90 分钟。
我在 pytorch 中看到并遵循了很多 LSTM 示例,每个示例似乎对不同部分的处理方式略有不同。由于我不是 python 或神经网络方面的专家,这让我很困惑。我会按照它们在上面代码中出现的顺序依次问我的问题。
我已经看到隐藏层在几个不同的实现中都被定义、归零、忽略和完全忽略。我知道它的用途,但在我制作的实现中(它本身是几个教程的合并)隐藏层似乎没有连接到任何东西。在前向函数中,我们将单个输入传递给隐藏层(首先归零),然后在其上调用 self.lstm。这是否等同于让 lstm“处理”隐藏层本身?
这会正确地产生隐藏状态吗?
我说的优化只发生在训练循环期间是否正确?我以这个特定教程为例:
https://pytorch.org/tutorials/beginner/basics/optimization_tutorial.html
def train_loop(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
for batch, (X, y) in enumerate(dataloader):
# Compute prediction and loss
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
在优化器教程中,我假设 y 是观察的真实标签,对吗?
我的意图是使用交叉熵损失,因为这似乎是定义我对数据所做的事情的正确方法(标签不是离散的,并且是真正的正浮点数范围,其中有 3 个),所以输出大小应该是 3。鉴于优化器教程,我需要做的就是将损失函数传递给训练步骤的输出和正确的标签,然后反向传播。这也对吗?
我知道这里有很多问题,所以我很感激任何愿意提供帮助的人对任何问题的回答,即使你不能回答所有问题。谢谢你的时间。
我与一位同事进行了交谈,我已经能够回答我自己的一些问题,所以我会 post 这些问题,因为它可能会对其他人有所帮助。
隐藏状态 zero-out 并未修改 hidden_layer,它在开始时 zero-ing 超出隐藏状态,因为单元格开始时为空,因为您期待任何语言 object-oriented。事实证明这是不必要的,因为很长一段时间以来,pytorch 的默认设置是将这些值清零,如果它们没有手动初始化的话。
这个简单的实现将产生一个隐藏的状态。
这个问题的答案是肯定的。在我们到达优化部分之前,我们不会对网络结果进行“评分”,或者更具体地说,是损失函数。
y是真正的标签,教程中没有识别出来。另外,需要注意的重要一点是,pred 不是“预测”,而是一个 pytorch 对象,它指向网络根据输入的观察结果进行操作的结果。换句话说,打印出“pred”不会向您显示向量表示预测的值
这也是正确的。 Pytorch 自行处理真实标签和预测标签之间的“距离度量”。
让我们看下面的代码:
'''
LSTM class
'''
import torch
import pandas as pd
import numpy as np
import torch.nn.CrossEntropyLoss
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super (LSTM, self).__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
def forward(self, x):
# receive an input, create a new hidden state, return output?
# reset the hidden state?
hidden = (torch.zeros(num_layers, hidden_size), torch.zeros(num_layers, hidden_size))
x, hidden = self.lstm(x, hidden)
#since our observation has several sequences, we only want the output after the last sequence of the observation'''
x = x[:, -1]
return x
我在这里有几个问题,如果允许的话,我宁愿一次问所有问题,也不愿在单个帖子之间等待 90 分钟。
我在 pytorch 中看到并遵循了很多 LSTM 示例,每个示例似乎对不同部分的处理方式略有不同。由于我不是 python 或神经网络方面的专家,这让我很困惑。我会按照它们在上面代码中出现的顺序依次问我的问题。
我已经看到隐藏层在几个不同的实现中都被定义、归零、忽略和完全忽略。我知道它的用途,但在我制作的实现中(它本身是几个教程的合并)隐藏层似乎没有连接到任何东西。在前向函数中,我们将单个输入传递给隐藏层(首先归零),然后在其上调用 self.lstm。这是否等同于让 lstm“处理”隐藏层本身?
这会正确地产生隐藏状态吗?
我说的优化只发生在训练循环期间是否正确?我以这个特定教程为例: https://pytorch.org/tutorials/beginner/basics/optimization_tutorial.html
def train_loop(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
for batch, (X, y) in enumerate(dataloader):
# Compute prediction and loss
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
optimizer.zero_grad()
loss.backward()
optimizer.step()
在优化器教程中,我假设 y 是观察的真实标签,对吗?
我的意图是使用交叉熵损失,因为这似乎是定义我对数据所做的事情的正确方法(标签不是离散的,并且是真正的正浮点数范围,其中有 3 个),所以输出大小应该是 3。鉴于优化器教程,我需要做的就是将损失函数传递给训练步骤的输出和正确的标签,然后反向传播。这也对吗?
我知道这里有很多问题,所以我很感激任何愿意提供帮助的人对任何问题的回答,即使你不能回答所有问题。谢谢你的时间。
我与一位同事进行了交谈,我已经能够回答我自己的一些问题,所以我会 post 这些问题,因为它可能会对其他人有所帮助。
隐藏状态 zero-out 并未修改 hidden_layer,它在开始时 zero-ing 超出隐藏状态,因为单元格开始时为空,因为您期待任何语言 object-oriented。事实证明这是不必要的,因为很长一段时间以来,pytorch 的默认设置是将这些值清零,如果它们没有手动初始化的话。
这个简单的实现将产生一个隐藏的状态。
这个问题的答案是肯定的。在我们到达优化部分之前,我们不会对网络结果进行“评分”,或者更具体地说,是损失函数。
y是真正的标签,教程中没有识别出来。另外,需要注意的重要一点是,pred 不是“预测”,而是一个 pytorch 对象,它指向网络根据输入的观察结果进行操作的结果。换句话说,打印出“pred”不会向您显示向量表示预测的值
这也是正确的。 Pytorch 自行处理真实标签和预测标签之间的“距离度量”。