pytorch深度学习实践4——循环神经网络RNN

循环神经网络(基础篇)

在这里插入图片描述
在RNN反向传播的过程中,如果参数w的值过小,在经过反向传播后,到达终点时的值可能为0,会出现梯度消失的问题;反之,若参数w的值过大,到达终点后会出现梯度爆炸的现象,而LSTM可以解决这个问题。

RNN主要处理有序列关系的数据:天气、股市、自然语言等有时间序列的数据
在这里插入图片描述
RNN示例:
在这里插入图片描述

import torch

batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2

cell = torch.nn.RNNCell(input_size = input_size,hidden_size = hidden_size)
dataset = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(batch_size,hidden_size)
for idx,input in enumerate(dataset):
    print('='*20,idx,'='*20)
    print('input size:',input.shape)
    hidden = cell(input,hidden)
    print('outputs size:',hidden.shape)
    print(hidden)

RNN工作方式:
在这里插入图片描述
RNN示例2:
在这里插入图片描述

import torch

batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers = 1

cell = torch.nn.RNN(input_size = input_size,hidden_size = hidden_size,
                        num_layers = num_layers)
inputs = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(num_layers,batch_size,hidden_size)
out,hidden = cell(inputs,hidden)
print('Output size:',out.shape)
print('Output',out)
print('Hidden size',hidden.shape)
print('Hidden:',hidden)

RNN的实现:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import torch

input_size = 4
hidden_size = 4
batch_size =1

idx2char = ['e','h','l','o']
x_data = [1,0,2,2,3]
y_data = [3,1,2,3,2]

one_hot_lookup = [[1,0,0,0],
                  [0,1,0,0],
                  [0,0,1,0],
                  [0,0,0,1]]
x_one_hot = [one_hot_lookup[x] for x in x_data]

inputs = torch.Tensor(x_one_hot).view(-1,batch_size,input_size)
labels = torch.LongTensor(y_data).view(-1,1)

class Model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size):
        super(Model,self).__init__()
        self.batch_size = batch_size
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.rnncell = torch.nn.RNNCell(input_size=self.input_size,
                                        hidden_size = self.hidden_size)
    def forward(self,input,hidden):
        hidden = self.rnncell(input,hidden)
        return hidden
    def init_hidden(self):
        return torch.zeros(self.batch_size,self.hidden_size)
net = Model(input_size,hidden_size,batch_size)

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(),lr=0.1)


for epoch in range(15):
    loss = 0
    optimizer.zero_grad()
    hidden = net.init_hidden()
    #print('input',inputs)
    print('Predicted string:',end='')
    for input,label in zip(inputs,labels):
        hidden = net(input,hidden)
        loss+=criterion(hidden,label)
        _,idx = hidden.max(dim = 1)
        print(idx2char[idx.item()],end = '')
    loss.backward()
    optimizer.step()
    print(',Epoch [%d/15] loss = %.4f' % (epoch+1,loss.item()))

运用RNN:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import torch

input_size = 4
hidden_size = 4
batch_size =1
seq_len=5

idx2char = ['e','h','l','o']
x_data = [1,0,2,2,3]
y_data = [3,1,2,3,2]

one_hot_lookup = [[1,0,0,0],
                  [0,1,0,0],
                  [0,0,1,0],
                  [0,0,0,1]]
#将x_data与one_hot_lookup相对应
#x_data中的1对应one_hot_lookup中的[0,1,0,0]
#x_data中的2对应one_hot_lookup中的[0,0,1,0]
#x_data中的3对应one_hot_lookup中的[0,0,0,1]
#x_data中的0对应one_hot_lookup中的[1,0,0,0]
x_one_hot = [one_hot_lookup[x] for x in x_data]
print('x_ont_hot:',x_one_hot)
#转换为tensor矩阵
inputs = torch.Tensor(x_one_hot).view(seq_len,batch_size,input_size)
print('inputs:',inputs)
#将y_data转换为tensor矩阵
labels = torch.LongTensor(y_data)
print('labels:',labels)
#定义神经网络模型
class Model(torch.nn.Module):
    def __init__(self,input_size,hidden_size,batch_size,num_layers=1):
        super(Model,self).__init__()
        self.num_layers = num_layers
        self.batch_size = batch_size
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.rnn = torch.nn.RNN(input_size=self.input_size,
                                hidden_size=self.hidden_size,
                                num_layers=self.num_layers)
    def forward(self,input):
        hidden = torch.zeros(self.num_layers,
                             self.batch_size,
                             self.hidden_size)
        out,_=self.rnn(input,hidden)
        return out.view(-1,self.hidden_size)

net = Model(input_size, hidden_size, batch_size,num_layers=1)
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(),lr=0.1)


for epoch in range(15):
    optimizer.zero_grad()
    outputs = net(inputs)
    loss = criterion(outputs,labels)
    loss.backward()
    optimizer.step()

    _,idx = outputs.max(dim = 1)
    idx = idx.data.numpy()
    print('Predicted:',''.join([idx2char[x] for x in idx]),end='')
    print(',Epoch [%d/15] loss = %.4f' % (epoch+1,loss.item()))

嵌入层:
在这里插入图片描述
示例3:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LSTM
GRU

循环神经网络训练器

在这里插入图片描述
示例:
python中,时间的单位是秒(s)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据准备:
在这里插入图片描述
构建模型:
在这里插入图片描述
双向循环神经网络:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
训练:
在这里插入图片描述
测试:
在这里插入图片描述

其他示例

用RNN作诗
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《PyTorch深度学习实践》是由牟大恩编写的一本介绍PyTorch深度学习实践指南。这本书主要分为两部分,第一部分介绍了PyTorch的基本概念和使用方法,包括PyTorch的基本原理、张量运算、自动求导、数据集、数据加载等;第二部分涵盖了构建深度学习网络的高级主题,包括卷积神经网络循环神经网络、生成对抗网络、迁移学习等。 《PyTorch深度学习实践》的优点在于其内容深入浅出,对于初学者也很友好。书中提供了很多实例和代码,可以帮助读者更好地理解和掌握PyTorch的使用。此外,这本书还介绍了一些实际应用案例,可以让读者了解深度学习在不同领域的应用。 如果您正在学习PyTorch深度学习,或者正在进行深度学习相关研究,那么《PyTorch深度学习实践》是一本很有价值的参考书籍。无论您是初学者还是有经验的研究人员,都可以从这本书中获得一些实用的知识和灵感。如果您对这本书感兴趣,可以在各大图书网站上下载或购买。 ### 回答2: PyTorch是近年来非常受欢迎的深度学习框架之一。而《PyTorch深度学习实践》这本书则是由牟大恩所写,是一本介绍PyTorch框架及其应用的指南。 本书主要分为三个部分:第一部分介绍了Python基础、NumPy、Tensor和PyTorch基础,这对于初学者非常重要;第二部分是深度学习PyTorch的应用,包括图像分类、预训练模型、目标检测和分割等内容;第三部分则涉及更高级的深度学习技术,如生成对抗网络、自然语言处理和强化学习。 此外,本书还提供了大量的实例代码和Jupyter笔记本,供读者练习和实践。这些案例覆盖了诸如文本分类、时间序列分析、语音识别等不同领域。 总之,如果你想学习深度学习PyTorch框架,特别是如果你已经具有Python编程经验,那《PyTorch深度学习实践》是一本非常实用的图书。它可以帮助你深入了解该框架,学习如何构建和训练深度神经网络,并通过实践掌握更高级的深度学习技巧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值