0


torch.nn.RNN()相关的参数设置

torch.nn.RNN()相关的参数设置

  1. classtorch.nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity='tanh', bias=True, batch_first=False, dropout=0, bidirectional=False, proj_size=0)

在这里插入图片描述

  1. import torch
  2. import torch.nn as nn
  3. # 定义 RNN 模型classRNNModel(nn.Module):def__init__(self, input_size, hidden_size, num_layers, num_classes):super(RNNModel, self).__init__()
  4. self.hidden_size = hidden_size
  5. self.num_layers = num_layers
  6. self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
  7. self.fc = nn.Linear(hidden_size, num_classes)defforward(self, x):# 初始化隐藏状态
  8. h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)# 前向传播
  9. out, _ = self.rnn(x, h0)# 取最后一个时间步的输出
  10. out = self.fc(out[:,-1,:])return out
  11. # 超参数设置
  12. input_size =10# 输入特征维度
  13. hidden_size =20# 隐藏层神经元数量
  14. num_layers =2# RNN 层数
  15. num_classes =5# 输出类别数
  16. sequence_length =15# 序列长度
  17. batch_size =3# 批次大小# 实例化模型
  18. model = RNNModel(input_size, hidden_size, num_layers, num_classes)# 打印模型结构print(model)# 创建输入数据 (batch_size, sequence_length, input_size)
  19. inputs = torch.randn(batch_size, sequence_length, input_size)# 前向传播
  20. outputs = model(inputs)# 打印输出print(outputs)

假设你有一段语音信号,每段语音信号被切分为 15 个时间步,每个时间步包含 10 个特征(例如 MFCC 特征)。你希望使用一个两层的 RNN 模型来处理这些数据,并且最终的输出是 5 个类别中的一个。

  1. input_size =10# 每个时间步的特征向量长度
  2. sequence_length =15# 每个输入序列的时间步数量
  3. batch_size =3# 每个训练批次中的样本数量# 创建输入数据 (batch_size, sequence_length, input_size)
  4. inputs = torch.randn(batch_size, sequence_length, input_size)

以上代码创建了一个形状为 (3, 15, 10) 的输入张量,表示 3 个样本,每个样本包含 15 个时间步,每个时间步的特征向量长度为 10。这就定义了 input_size 的具体含义,即每个时间步输入特征的维度。

在这里插入图片描述

写一个单层、单向的RNN模型训练实例:

  1. import torch
  2. import torch.nn as nn
  3. import numpy as np
  4. # 1. 数据准备# 假设我们的输入序列是一个简单的正弦波序列
  5. time_steps = np.linspace(0, np.pi,100)
  6. data = np.sin(time_steps)# 我们将使用前90个时间步作为训练数据,后10个时间步用于预测
  7. train_data = data[:90]
  8. test_data = data[90:]# 转换为 PyTorch 张量
  9. train_data = torch.FloatTensor(train_data).view(-1)
  10. test_data = torch.FloatTensor(test_data).view(-1)# 创建输入序列和目标序列defcreate_inout_sequences(input_data, tw):
  11. inout_seq =[]
  12. L =len(input_data)for i inrange(L - tw):
  13. train_seq = input_data[i:i + tw]
  14. train_label = input_data[i + tw:i + tw +1]
  15. inout_seq.append((train_seq, train_label))return inout_seq
  16. # 序列长度
  17. seq_length =10
  18. train_inout_seq = create_inout_sequences(train_data, seq_length)# 2. 定义 RNN 模型classRNNModel(nn.Module):def__init__(self, input_size, hidden_size, output_size):super(RNNModel, self).__init__()
  19. self.hidden_size = hidden_size
  20. self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
  21. self.fc = nn.Linear(hidden_size, output_size)defforward(self, x, hidden):
  22. out, hidden = self.rnn(x, hidden)
  23. out = self.fc(out[:,-1,:])return out, hidden
  24. definit_hidden(self, batch_size):return torch.zeros(1, batch_size, self.hidden_size)# 超参数设置
  25. input_size =1
  26. hidden_size =50
  27. output_size =1
  28. learning_rate =0.01# 实例化模型
  29. model = RNNModel(input_size, hidden_size, output_size)# 定义损失函数和优化器
  30. criterion = nn.MSELoss()
  31. optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)# 3. 训练模型
  32. epochs =200for epoch inrange(epochs):for seq, labels in train_inout_seq:
  33. optimizer.zero_grad()
  34. seq = seq.view(1,-1, input_size)
  35. labels = labels.view(1,-1, output_size)
  36. hidden = model.init_hidden(1)
  37. y_pred, hidden = model(seq, hidden)
  38. loss = criterion(y_pred, labels)
  39. loss.backward()
  40. optimizer.step()if epoch %10==0:print(f'Epoch {epoch +1}/{epochs}, Loss: {loss.item()}')# 4. 预测
  41. model.eval()
  42. test_inputs = train_data[-seq_length:].tolist()
  43. model.hidden = model.init_hidden(1)for i inrange(len(test_data)):
  44. seq = torch.FloatTensor(test_inputs[-seq_length:])
  45. seq = seq.view(1,-1, input_size)with torch.no_grad():
  46. model.hidden = model.init_hidden(1)
  47. y_pred, model.hidden = model(seq, model.hidden)
  48. test_inputs.append(y_pred.item())# 将结果转换为 numpy 数组
  49. predicted = np.array(test_inputs[seq_length:])# 5. 绘图import matplotlib.pyplot as plt
  50. plt.figure(figsize=(10,5))
  51. plt.plot(time_steps, data, label='True Data')
  52. plt.plot(time_steps[90:], predicted, label='Predicted Data', linestyle='--')
  53. plt.legend()
  54. plt.show()

写一个单层、双向的RNN模型训练实例:

  1. import torch
  2. import torch.nn as nn
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. # 1. 数据准备# 假设我们的输入序列是一个简单的正弦波序列
  6. time_steps = np.linspace(0, np.pi,100)
  7. data = np.sin(time_steps)# 我们将使用前90个时间步作为训练数据,后10个时间步用于预测
  8. train_data = data[:90]
  9. test_data = data[90:]# 转换为 PyTorch 张量
  10. train_data = torch.FloatTensor(train_data).view(-1)
  11. test_data = torch.FloatTensor(test_data).view(-1)# 创建输入序列和目标序列defcreate_inout_sequences(input_data, tw):
  12. inout_seq =[]
  13. L =len(input_data)for i inrange(L-tw):
  14. train_seq = input_data[i:i+tw]
  15. train_label = input_data[i+tw:i+tw+1]
  16. inout_seq.append((train_seq, train_label))return inout_seq
  17. # 序列长度
  18. seq_length =10
  19. train_inout_seq = create_inout_sequences(train_data, seq_length)# 2. 定义双向 RNN 模型classBiRNNModel(nn.Module):def__init__(self, input_size, hidden_size, output_size):super(BiRNNModel, self).__init__()
  20. self.hidden_size = hidden_size
  21. self.rnn = nn.RNN(input_size, hidden_size, batch_first=True, bidirectional=True)
  22. self.fc = nn.Linear(hidden_size *2, output_size)# *2 because of bidirectionaldefforward(self, x, hidden):
  23. out, hidden = self.rnn(x, hidden)
  24. out = self.fc(out[:,-1,:])# We take the output from the last time stepreturn out, hidden
  25. definit_hidden(self, batch_size):# Because it's bidirectional, we need to initialize two hidden statesreturn torch.zeros(2, batch_size, self.hidden_size)# 超参数设置
  26. input_size =1
  27. hidden_size =50
  28. output_size =1
  29. learning_rate =0.01# 实例化模型
  30. model = BiRNNModel(input_size, hidden_size, output_size)# 定义损失函数和优化器
  31. criterion = nn.MSELoss()
  32. optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)# 3. 训练模型
  33. epochs =100for epoch inrange(epochs):for seq, labels in train_inout_seq:
  34. optimizer.zero_grad()
  35. seq = seq.view(1,-1, input_size)
  36. labels = labels.view(1,-1, output_size)
  37. hidden = model.init_hidden(1)
  38. y_pred, hidden = model(seq, hidden)
  39. loss = criterion(y_pred, labels)
  40. loss.backward()
  41. optimizer.step()if epoch %10==0:print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item()}')# 4. 预测
  42. model.eval()
  43. test_inputs = train_data[-seq_length:].tolist()
  44. model.hidden = model.init_hidden(1)for i inrange(len(test_data)):
  45. seq = torch.FloatTensor(test_inputs[-seq_length:])
  46. seq = seq.view(1,-1, input_size)with torch.no_grad():
  47. model.hidden = model.init_hidden(1)
  48. y_pred, model.hidden = model(seq, model.hidden)
  49. test_inputs.append(y_pred.item())# 将结果转换为 numpy 数组
  50. predicted = np.array(test_inputs[seq_length:])# 5. 绘图
  51. plt.figure(figsize=(10,5))
  52. plt.plot(time_steps, data, label='True Data')
  53. plt.plot(time_steps[90:], predicted, label='Predicted Data', linestyle='--')
  54. plt.legend()
  55. plt.show()

在这里插入图片描述


本文转载自: https://blog.csdn.net/guoqingru0311/article/details/140815309
版权归原作者 郭庆汝 所有, 如有侵权,请联系我们删除。

“torch.nn.RNN()相关的参数设置”的评论:

还没有评论