• 深度学习(PyTorch)——循环神经网络(RNN)基础篇四


    B站up主“刘二大人”视频 笔记

    本文章是该视频的一部分,该部分的案例代码使用RNN做一个简单的实验,其余部分见作者的其他文章。

    一、什么是循环神经网络

    循环神经网络或RNN是一类用于处理序列数据的神经网络。就像卷积网络是专门用于处理网格化数据的神经网络。

    RNN的思想是利用序列化的信息。在传统的神经网络中,我们假设所有输入和输出彼此独立。但对于许多任务而言,这个假设有问题。例如你想预测句子中的下一个单词,就需要知道它前面有哪些单词。

    RNN被称为循环,因为它对序列列的每个元素执行相同的任务,并且基于先前的计算进行输出。RNN的另一个优点是它具有“记忆”,它可以收集到目前为止已经计算的信息。理论上,RNN可以在任意长的序列中使用信息,但实际使用中仅仅往回记录几步。

    二、神经网络中的参数共享

    参数共享可以使得模型能够拓展到不同形式的样本(序列数据中指不同长度的样本)并进行泛化。
    在处理网格化数据时(例如图像问题),卷积神经网络就是采用了参数共享的思想(卷积核),不但大大减少了参数量,而且提升了网络性能。在处理序列数据时,例如时延神经网络中,它在一维时间序列上使用卷积,每个时间步使用相同的卷积核。
    循环神经网络以不同方式共享参数,输出的每一项是前一项的函数,输出的每一项对先前的输出应用相同的更新规则而产生。

    二、循环神经网络能干什么

    RNN在许多NLP任务中取得了巨大成功。 在这个领域最常用的RNN类型是LSTM,它在捕获长期依赖方面要比普通的RNN好得多。但不要担心,LSTM和RNN基本相同,它们只是采用不同的方式来计算隐藏状态。

    三、RNN使用案例,代码如下:

    1. import torch
    2. input_size = 4
    3. hidden_size = 4
    4. num_layers = 1
    5. batch_size = 1
    6. seq_len = 5
    7. idx2char = ['e', 'h', 'l', 'o']
    8. x_data = [1, 0, 2, 2, 3] # hello
    9. y_data = [3, 1, 2, 3, 2] # ohlol
    10. one_hot_lookup = [
    11. [1, 0, 0, 0],
    12. [0, 1, 0, 0],
    13. [0, 0, 1, 0],
    14. [0, 0, 0, 1],
    15. ]
    16. x_one_hot = [one_hot_lookup[x] for x in x_data]
    17. inputs = torch.Tensor(x_one_hot).view(seq_len, batch_size, input_size)
    18. labels = torch.LongTensor(y_data)
    19. class Model(torch.nn.Module):
    20. def __init__(self, input_size, hidden_size, batch_size, num_layers=1):
    21. super(Model, self).__init__()
    22. self.num_layers = num_layers
    23. self.batch_size = batch_size
    24. self.input_size = input_size
    25. self.hidden_size = hidden_size
    26. self.rnn = torch.nn.RNN(input_size=self.input_size,
    27. hidden_size=self.hidden_size,
    28. num_layers=num_layers)
    29. def forward(self, input):
    30. hidden = torch.zeros(self.num_layers, # 构造h0
    31. self.batch_size,
    32. self.hidden_size)
    33. out, _ = self.rnn(input, hidden)
    34. return out.view(-1, self.hidden_size)
    35. net = Model(input_size, hidden_size, batch_size, num_layers)
    36. criterion = torch.nn.CrossEntropyLoss()
    37. optimizer = torch.optim.Adam(net.parameters(), lr=0.05)
    38. for epoch in range(15):
    39. optimizer.zero_grad() # 优化器归零
    40. outputs = net(inputs)
    41. loss = criterion(outputs, labels)
    42. loss.backward() # 反向传播
    43. optimizer.step() # 优化器更新
    44. _, idx = outputs.max(dim=1)
    45. idx = idx.data.numpy()
    46. print('Predicted: ', ''.join([idx2char[x] for x in idx]), end='')
    47. print(', Epoch [%d/15] loss=%.3f ' % (epoch + 1, loss.item()))

    运行结果如下:

     视频截图如下:

     

     ​​​​​

     

     

     

  • 相关阅读:
    半减器、全减器和减法器原理和设计
    2024.3.28成都AI与机器视觉技术工业应用研讨会
    GCC编译过程
    类加载器知识
    【无标题】
    蓝牙Mesh系统开发五 ble mesh设备增加与移除
    k8s备份
    【云原生】无VIP稳定性和可扩展性更强的k8s高可用方案讲解与实战操作
    Python和Java二选一该学啥?
    点云从入门到精通技术详解100篇-基于多尺度深度特征分析的点云模型法向估计(续)
  • 原文地址:https://blog.csdn.net/qq_42233059/article/details/126570646