学习pytorch(四)简单RNN举例

import torch
#简单RNN学习举例。
# RNN(循环神经网络)是把一个线性层重复使用,适合训练序列型的问题。单词是一个序列,序列的每个元素是字母。序列中的元素可以是任意维度的。实际训练中,
# 可以首先把序列中的元素变为合适的维度,再交给RNN层。
#学习 将hello 转为 ohlol。

dict=['e','h','l','o'] #字典。有4个字母
x_data=[1,0,2,2,3] #输入hello在字典中的引索
x_data=torch.LongTensor(x_data) #后面要用到把引索转化为高维向量的工具,那个工具要求输入是LongTensor而不是默认的floatTensor
y_data=torch.LongTensor([3,1,2,3,2]) #后面用到的交叉熵损失要求输入是一维longTensor。LongTensor的类型是长整型。

# 上边提到的把引索转为高维向量的工具,可以理解为编码器。引索是标量,编出的码可以是任意维度的矢量,在这个例子中
# 把从字典长度为4(只有4个不同的字母的字典)的字典中取出的5个字母hello构成一个序列,编码为5个(一个样本,这个样本有5个元素,也就是
# batch_size=1,seqlen(序列长度)=5,1*5=5)10维向量(bedding_size=10)。
# 然后通过RNN层,降维为5个8维向量(hidding_size=8)。RNN层的输入形状是样本数*序列长度*元素维度,(本例中是1*5*10)RNN的输入有两个,这里我们关心第一个输出
# 它的形状为样本数*序列长度*输出元素维度(本例中为1*5*8)。
# 然后把RNN层的输出视为(样本数*序列长度)*输出元素维度(本例:5*8)的向量交给全连接层降维为5*4。4是因为这是个多分类问题,输入的每个字母对应哪个分类。
# 这里输出分类类别只有4个。(num_class=4)
# 把得到5*4张量交给交叉熵损失计算预测与目标的损失。(后面的工作就是多分类的工作了)。
class rnnmodel(torch.nn.Module):
    def __init__(self,dictionary_size,num_class):
        super(rnnmodel, self).__init__()
        self.hidden_size=8
        self.bedding_size=10
        self.dictionary_size=dictionary_size
        self.num_class=num_class
        self.embeddinger=torch.nn.Embedding(self.dictionary_size,self.bedding_size) #把5个引索转化为5个张量。并继承输入的维度。(本例中继承batch_size*seglen),
        # 输出为batch_size*seglen*bedding_size
        self.rnn=torch.nn.RNN(input_size=self.bedding_size,hidden_size=self.hidden_size,num_layers=1,batch_first=True)
        # 指定batch_fisrt=True,则要求输入维度为batch_size*seglen*input_size,否则,要求输入为seglen*input_size。
        # 指定batch_fisrt=True要求的输入形状更方便与构建数据集。数据集的原始维度就是这样的。
        # batch_fisrt默认为false ,之所以为false,是因为seglen*input_size这样的形状更有利于RNN的实现。
        self.linear=torch.nn.Linear(self.hidden_size,self.num_class) #10维降为4维。
    def forward(self,x): #x 的形状为(样本数,序列长度)
        h0=torch.zeros(1,x.size(0),self.hidden_size) #RNN要有两个输入,x为数据,h为序列中上一个元素计算的结果。由于第一个元素没有
        #上一个元素,所以要指定一个初始值。如果没有先验数据,一般设置为全0。它的形状为num_layer*batch_size*hidden_size。num_layers是什么,本人很懒不想画图,其他博客对这个的解释
        #非常清晰。
        x=self.embeddinger(x)
        x,_=self.rnn(x,h0) #x的形状为(样本数,序列长度,每个单元的维度)
        x=x.view(-1,self.hidden_size) #合并前两个维度,放入全连接层计算。如果需要,计算完之后再拆分。
        x=self.linear(x)
        return x

if __name__=='__main__':
    model=rnnmodel(4,4)
    criterion=torch.nn.CrossEntropyLoss()
    optimizer=torch.optim.Adam(model.parameters(),lr=0.1)
    x_data=x_data.view(-1,5)
    y_data=y_data.view(-1)
    for epoch in range(15):
        y_hat=model(x_data)
        _,index=torch.max(y_hat,1)
        index=index.data.numpy()
        loss=criterion(y_hat,y_data)

        print(epoch,' loss:', loss.item(),'guess:',''.join([dict[x] for x in index]))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中搭建RNN的过程分为以下几步: 1. 准备数据:需要将数据转换为张量形式并进行处理,如对文本数据进行one-hot编码、对序列数据进行padding等。 2. 定义模型:可以使用PyTorch提供的nn.RNN或nn.LSTM等内置模型,也可以自己定义RNN的前向传播函数。 3. 定义损失函数:常用的损失函数包括交叉熵损失函数、均方误差损失函数等。 4. 定义优化器:常用的优化器包括随机梯度下降法(SGD)、Adam优化器等。 5. 训练模型:将数据输入到模型中进行训练,并根据损失函数和优化器进行反向传播和参数更新。 6. 测试模型:使用测试数据对模型进行评估,计算模型的准确率、召回率等指标。 下面是一个使用PyTorch内置的nn.RNN模型搭建RNN的示例代码: ```python import torch import torch.nn as nn # 定义RNN模型 class RNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(RNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size) self.fc = nn.Linear(hidden_size, output_size) def forward(self, input): hidden = torch.zeros(1, 1, self.hidden_size) output, hidden = self.rnn(input, hidden) output = self.fc(output[0]) return output # 准备数据 input_size = 10 hidden_size = 20 output_size = 5 input = torch.randn(1, 1, input_size) # 定义模型、损失函数和优化器 model = RNN(input_size, hidden_size, output_size) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.1) # 训练模型 for epoch in range(100): output = model(input) loss = criterion(output, torch.tensor([1])) optimizer.zero_grad() loss.backward() optimizer.step() # 测试模型 test_input = torch.randn(1, 1, input_size) test_output = model(test_input) ``` 在这个例子中,我们使用nn.RNN定义RNN模型,并将其输入一个随机生成的张量,然后使用交叉熵损失函数和随机梯度下降法进行训练,最后使用另一个随机生成的张量进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值