Как использовать другой размер тестовой партии для RNN в PyTorch? - PullRequest
0 голосов
/ 01 октября 2019

Я хочу обучить RNN более чем на 5 обучающих точках, где каждая последовательность также имеет размер 5. Во время тестирования я хочу отправить одну точку данных и вычислить вывод.

Задачапредсказать следующий символ в последовательности из пяти символов (все закодированы как 1-горячие векторы). Я пытался дублировать тестовую точку данных пять раз. Тем не менее, я уверен, что это не правильный способ решения этой проблемы.

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). Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Вы получаете ошибку, потому что вы используете:

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.

0 голосов
/ 01 октября 2019

Другой вариант - просто удалить аргумент ключевого слова, batch_first=True при определении модели.

# Define the model
net = nn.RNN(input_size=4, hidden_size=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...