是否使用 nn.RNN 的代码差异
Posted
技术标签:
【中文标题】是否使用 nn.RNN 的代码差异【英文标题】:difference in code between using nn.RNN or not 【发布时间】:2021-09-07 23:17:46 【问题描述】:嗨,我是 rnn 的新手,我从 pytorch 官方教程中找到了 RNN NLP FROM SCRATCH,我认为它被命名为“from scrantch”,因为它没有使用 pytorch 中的 nn
内置的 nn.RNN
类似这样的行 @ def __init__(self, input_size, hidden_size, output_size):
段中的 987654324@。那么如果使用nn.RNN
,代码将如何演变?
class RNN(nn.Module):
# implement RNN from scratch rather than using nn.RNN
def __init__(self, input_size, hidden_size, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
self.i2o = nn.Linear(input_size + hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input_tensor, hidden_tensor):
combined = torch.cat((input_tensor, hidden_tensor), 1)
hidden = self.i2h(combined)
output = self.i2o(combined)
output = self.softmax(output)
return output, hidden
def init_hidden(self):
return torch.zeros(1, self.hidden_size)
def train(line_tensor, category_tensor):
hidden = rnn.init_hidden()
for i in range(line_tensor.size()[0]):
output, hidden = rnn(line_tensor[i], hidden)
loss = criterion(output, category_tensor)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return output, loss.item()
这个问题的另一个等价物是如何使用self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
重写代码,或者如果不可能,内部nn.RNN
结构是什么样的?
【问题讨论】:
【参考方案1】:这个模型是指在引入autograde模块之前RNN的实现,它是RNN
的纯实现。在此示例中,隐藏状态和梯度完全由图形处理。
def init_hidden(self):
return torch.zeros(1, self.hidden_size)
上面的行初始化了隐藏状态(最初是零)。在第一步之后,我们得到output
和下一个hidden state
,它们稍后会在下一步中提供。
所有这个过程都由graph
处理。
【讨论】:
嗨,我已经编辑了我的问题并补充说,我认为因为self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
未被使用,所以它被称为“从头开始”,所以为什么你认为它是从头开始命名的。 “自动升级模块介绍”在哪里
好的,如果这个也是 rnn 的实现,我想要一个使用 self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True) 的。
你能回答吗?以上是关于是否使用 nn.RNN 的代码差异的主要内容,如果未能解决你的问题,请参考以下文章
深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expa