是否使用 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

tf.squeeze和tf.nn.rnn的功能是什么?

tf 版本更新 记录

Tensorflow 与 Keras 中的 RNN,tf.nn.dynamic_rnn() 的贬值

tf.nn.rnn_cell.MultiRNNCell

tf.nn.dynamic_rnn 中的排名错误