【从零手写RNN的感悟与心得】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


tips

写这篇文章的目的是防止在RNN上踩过的坑,以后再来一次。毕竟结构性的内容不难理解,最重要的代码实现往往最容易出问题,相信一起深耕过paper然后写代码的你们应该也经历过。(other:我个人学习能力属于差生,语言沟通也不是很好,所以文章的问题还望多提意见)

rnn 的核心内容

此处借用了沐神、教父…(后面的名字越来越离谱)的图来说明
参考:https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn.html
rnn原理图
非常简单的两个公式

H t = W x h × X t − 1 + W h h × H t − 1 + b h X p r e d i c t = W q × H t + b q H_t = W_{xh} \times X_{t-1} + W_{hh} \times H_{t-1} + b_h \\ X_{predict} = W_{q} \times Ht + b_q Ht=Wxh×Xt1+Whh×Ht1+bhXpredict=Wq×Ht+bq

在此有一个编码中的误区,那就是如果输入 X t − 1 X_{t-1} Xt1 ,在得到预测结果 X p r e d i c t X_{predict} Xpredict,
得到的 H t H_t Ht在图解中,需要参与下一次 X t X_t Xt纵向的预测,以及生成 H t + 1 H_{t+1} Ht+1

rnn 单个句子的实验代码设计

根据上述原理可以初步设计一个,只有一个句子情况下的rnn编码。

import torch
from torch import nn
import re
import collections
from torch.nn import functional as F

sentence = "this is a difficult problem,is not simple"


def get_words_from_sentence(str):
    return re.sub("[^a-zA-Z]", " ", str).split()


def get_token_to_idx(words):
    words_corpus = collections.Counter(words)
    return {
   
   token: idx for idx, (token, _) in enumerate(words_corpus.items())}


def get_idx_to_token(words):
    return [k for k in get_token_to_idx(words)]


def sgd(params, lr=0.01):
    with torch.no_grad():
        for param in params:
            slope = param
### RNN 模型的构建概述 循环神经网络(RNN)是一种专门处理序列数据的神经网络,适用于自然语言处理、时间序列预测等任务。构建 RNN 模型的过程包括数据准备、模型定义、训练和评估等步骤。以下是详细的实现方法。 #### 数据准备 在构建 RNN 模型之前,需要准备适合模型输入的序列数据。通常情况下,数据需要被转换为张量格式,并按照时间步进行划分。例如,在文本生成任务中,可以将字符或单词转换为整数索引,然后进一步转换为嵌入向量。在 PyTorch 中,可以通过 `torch.Tensor` 或 `torch.LongTensor` 来处理这些数据。 #### 模型定义 在 PyTorch 中,RNN 模型可以通过继承 `nn.Module` 类并定义 `__init__` 和 `forward` 方法来实现。以下是一个简单的 RNN 实现示例: ```python import torch import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, hidden = self.rnn(x) out = self.fc(out) return out ``` 在这个示例中,`nn.RNN` 是一个内置的 RNN 层,它接受输入大小(`input_size`)、隐藏层大小(`hidden_size`)和输出大小(`output_size`)作为参数。`forward` 方法定义了数据如何通过网络传递。 #### 训练过程 训练 RNN 模型通常涉及定义损失函数和优化器,并通过反向传播更新模型参数。以下是一个简单的训练循环: ```python # 假设 model, criterion, optimizer 已经定义 model.train() for epoch in range(num_epochs): for inputs, targets in train_loader: outputs = model(inputs) loss = criterion(outputs, targets) optimizer.zero_grad() loss.backward() optimizer.step() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') ``` 在训练过程中,`criterion` 可以是交叉熵损失函数(`nn.CrossEntropyLoss`),而 `optimizer` 通常使用 Adam 或 SGD 等优化器。 #### 模型评估使用 训练完成后,可以通过验证集评估模型性能。此外,RNN 模型还可以用于生成序列数据,例如文本生成任务中,可以通过递归预测生成新的文本内容。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值