• 《PyTorch深度学习实践》第十二课(循环神经网络RNN)


    b站刘二视频,地址:

    《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili

    以往的网络DNN(Dense稠密网络)

     在序列数据中,处理数据过大,linear层比卷积核的运算类要大很多,因此采用卷积核的方式

    RNN模型

    h0先验条件,如果用于图像生成文本,可以在h0前面加上cnn+fc

     g:三维到五维(h0三维,输出五维),本质上是线性层

    用tanh是因为取值在+1和-1之间

    pytorch中的RNN Cell

    只需要输入特征数,和输出特征数就行了,因为本质上是一个线性层

     RNN的输入即输出

    利用numlayers构建多层 

     

     例子

     step1 按字母序建立词典 再转换为独热向量

    因为文字非数字,无法计算,因此需要转换

    inputsize最后一个表格的列数

     输入向量是一个维度是4的独热向量,输出向量也是个维度是4的概率向量

     step2  loss

    参数设置

    seq_len序列长度(x1, x2, x3)

    input_size输入数据每一个(x1)都是一个四维的向量

    hidden_size每个隐层都是有两个元素

    数据定义

    要把inputs和labels重新view,-1为自适应

    inputs的格式为(seqlen, batchsize, inputsize)

    lables的格式为 (seqlen,1)

    seqlen其实就是循环次数

     代码,将hello变成ohlol(RNNCell)

    1. import torch
    2. input_size = 4
    3. hidden_size = 4
    4. batch_size = 1
    5. idx2char = ['e', 'h', 'l', 'o']
    6. x_data = [1, 0, 2, 2, 3]
    7. y_data = [3, 1, 2, 3, 2]
    8. one_hot_lookup = [
    9. [1, 0, 0, 0],
    10. [0, 1, 0, 0],
    11. [0, 0, 1, 0],
    12. [0, 0, 0, 1]
    13. ]
    14. x_one_hot = [one_hot_lookup[x] for x in x_data]
    15. inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)
    16. lables = torch.LongTensor(y_data).view(-1, 1)
    17. class Model(torch.nn.Module):
    18. def __init__(self, input_size, hidden_size, batch_size):
    19. super(Model, self).__init__()
    20. self.input_size = input_size
    21. self.hidden_size = hidden_size
    22. self.batch_size = batch_size
    23. self.rnncell = torch.nn.RNNCell(self.input_size, self.hidden_size)
    24. def forward(self, inputs, hidden):
    25. hidden = self.rnncell(inputs, hidden)
    26. return hidden
    27. def init_hidden(self):
    28. return torch.zeros(self.batch_size, self.hidden_size)
    29. net = Model(input_size, hidden_size, batch_size)
    30. criterion = torch.nn.CrossEntropyLoss()
    31. optimizer = torch.optim.Adam(net.parameters(), lr=0.1)
    32. for epoch in range(15):
    33. loss = 0
    34. hidden = net.init_hidden()
    35. print('Predicted string: ', end='\n')
    36. for input, lable in zip(inputs, lables):
    37. hidden = net(input, hidden)
    38. loss += criterion(hidden, lable)
    39. _, idx = hidden.max(dim=1)
    40. print(idx2char[idx.item()], end='')
    41. optimizer.zero_grad()
    42. loss.backward()
    43. optimizer.step()
    44. print(', Epoch[%d/15] loss = %.4f' %(epoch + 1, loss.item()))

    代码,采用pytorch中的RNN

    改变了out的维度

    改变了lables的维度 

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

    采用Embedding vectors

    独热向量降维为Embedding vectors 

     四维转换为5维

     例如原来维度中的第二个,找到第二行,然后输出就行了

    改变网络结构 

     

    改变维度 

  • 相关阅读:
    第4章 决策树
    纯血鸿蒙来了,企业开发者应该关注什么
    模型保存和加载
    【毕业设计】基于单片机的太空游戏机 - 嵌入式 物联网 stm32 51
    .NET Core多线程 (4) 锁机制
    菜谱小程序源码免费分享【推荐】
    C#/.NET/.NET Core优秀项目和框架2023年9月简报
    微信小程序(非个人)备案指南
    地理位置数据存储方案——Redis GEO
    【MySQL】在CentOS环境下安装MySQL
  • 原文地址:https://blog.csdn.net/falldeep/article/details/126166614