如何在 PyTorch 中为 RNN 使用不同的测试批量大小?
How to use a different test batch size for RNN in PyTorch?
我想在 5 个训练点上训练一个 RNN,其中每个序列的大小也为 5。在测试时,我想发送一个数据点并计算输出。
任务是预测五个字符序列中的下一个字符(全部编码为 1-hot 向量)。我试过五次复制测试数据点。但是,我确信这不是解决这个问题的正确方法。
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
# Define the parameters
H = [ 1, 0, 0, 0 ]
E = [ 0, 1, 0, 0 ]
L = [ 0, 0, 1, 0 ]
O = [ 0, 0, 0, 1 ]
# Define the model
net = nn.RNN(input_size=4, hidden_size=4, batch_first=True)
# Generate data
data = [[H,E,L,L,O],
[E,L,L,O,H],
[L,L,O,H,E],
[L,O,H,E,L],
[O,H,E,L,L]]
inputs = torch.tensor(data).float()
hidden = torch.randn(1,5,4) # Random initialization
correct_outputs = torch.tensor(np.array(data[1:]+[data[0]]).astype(float).tolist(), requires_grad=True)
# Set the loss function
criterion = torch.nn.MSELoss()
# Set the optimizer
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
# Perform gradient descent until convergence
for epoch in range(1000):
# Forward Propagation
outputs, hidden = net(inputs, hidden)
# Compute and print loss
loss = criterion(nn.functional.softmax(outputs,2), correct_outputs)
print('epoch: ', epoch,' loss: ', loss.item())
# Zero the gradients
optimizer.zero_grad()
# Backpropagation
loss.backward(retain_graph=True)
# Parameter update
optimizer.step()
# Predict
net(torch.tensor([[H,E,L,L,O]]).float(),hidden)
我收到以下错误:
RuntimeError: Expected hidden size (1, 1, 4), got (1, 5, 4)
我知道 torch 需要一个大小为 (1,1,4) 的张量,但我不确定如何将初始隐藏状态从 (1, 5, 4) 转换为 (1, 1, 4) .任何帮助将不胜感激!
您收到错误是因为您正在使用:
hidden = torch.randn(1,5,4) # Random initialization
相反,您应该使用:
hidden = torch.randn(1,inputs.size(0),4) # Random initialization
以应对输入的批量大小。所以,请执行以下操作:
# Predict
inputs = torch.tensor([[H,E,L,L,O]]).float()
hidden = torch.randn(1,inputs.size(0),4)
net(inputs, hidden)
建议:通过学习 PyTorch 中的一些优秀示例来改进您的编码风格。
另一种选择是在定义模型时只删除关键字参数,batch_first=True
。
# Define the model
net = nn.RNN(input_size=4, hidden_size=4)
我想在 5 个训练点上训练一个 RNN,其中每个序列的大小也为 5。在测试时,我想发送一个数据点并计算输出。
任务是预测五个字符序列中的下一个字符(全部编码为 1-hot 向量)。我试过五次复制测试数据点。但是,我确信这不是解决这个问题的正确方法。
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
# Define the parameters
H = [ 1, 0, 0, 0 ]
E = [ 0, 1, 0, 0 ]
L = [ 0, 0, 1, 0 ]
O = [ 0, 0, 0, 1 ]
# Define the model
net = nn.RNN(input_size=4, hidden_size=4, batch_first=True)
# Generate data
data = [[H,E,L,L,O],
[E,L,L,O,H],
[L,L,O,H,E],
[L,O,H,E,L],
[O,H,E,L,L]]
inputs = torch.tensor(data).float()
hidden = torch.randn(1,5,4) # Random initialization
correct_outputs = torch.tensor(np.array(data[1:]+[data[0]]).astype(float).tolist(), requires_grad=True)
# Set the loss function
criterion = torch.nn.MSELoss()
# Set the optimizer
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)
# Perform gradient descent until convergence
for epoch in range(1000):
# Forward Propagation
outputs, hidden = net(inputs, hidden)
# Compute and print loss
loss = criterion(nn.functional.softmax(outputs,2), correct_outputs)
print('epoch: ', epoch,' loss: ', loss.item())
# Zero the gradients
optimizer.zero_grad()
# Backpropagation
loss.backward(retain_graph=True)
# Parameter update
optimizer.step()
# Predict
net(torch.tensor([[H,E,L,L,O]]).float(),hidden)
我收到以下错误:
RuntimeError: Expected hidden size (1, 1, 4), got (1, 5, 4)
我知道 torch 需要一个大小为 (1,1,4) 的张量,但我不确定如何将初始隐藏状态从 (1, 5, 4) 转换为 (1, 1, 4) .任何帮助将不胜感激!
您收到错误是因为您正在使用:
hidden = torch.randn(1,5,4) # Random initialization
相反,您应该使用:
hidden = torch.randn(1,inputs.size(0),4) # Random initialization
以应对输入的批量大小。所以,请执行以下操作:
# Predict
inputs = torch.tensor([[H,E,L,L,O]]).float()
hidden = torch.randn(1,inputs.size(0),4)
net(inputs, hidden)
建议:通过学习 PyTorch 中的一些优秀示例来改进您的编码风格。
另一种选择是在定义模型时只删除关键字参数,batch_first=True
。
# Define the model
net = nn.RNN(input_size=4, hidden_size=4)