Как подготовить состояние ячейки для ввода, разделенного на последовательностиPython

Программы на Python
Ответить
Anonymous
 Как подготовить состояние ячейки для ввода, разделенного на последовательности

Сообщение Anonymous »

У меня есть 500 состояний, действий, наград и скрытых состояний. Но я получаю ошибку времени выполнения из-за несовпадающих форм.

Произошло исключение: RuntimeError
Размер тензора a (500) должен соответствовать размеру тензора b (16) в неодноэлементном измерении 0
Файл "/mnt/c/Users/User/code/VideoPPO/test.py", строка 33, в
выходных данных = model(features, (h_x, c_x))
Ошибка выполнения: Размер тензора a (500) должен соответствовать размеру тензора b
(16) в неодноэлементном измерении 0

Это происходит потому, что у меня 500 состояний, но после разделения их на последовательности по 32 состояния в каждой нам нужно в 32 раза меньше скрытых состояний и Я не знаю, как это сделать. То есть у нас есть скрытые состояния с формой [2, 500, 256], но нам нужна форма [2, 16, 256].
Небольшое уточнение: это упрощенный код для задачи RL, в которой мы объединяем состояния, действия и вознаграждения, а затем отправляем их в LSTM для получения результатов.
Это код.
import torch as t
from torch import nn

model = nn.LSTM(67, 256, num_layers=2, batch_first=True)

states = t.randn(500, 64) # [n_steps, state_dim]
actions = t.randn(500, 2) # [n_steps, action_dim]
rewards = t.randn(500, 1) # [n_steps, reward_dim]

h_x = t.randn(2, 500, 256) # [num_layers, n_steps, hidden_size]
c_x = t.randn(2, 500, 256) # [num_layers, n_steps, hidden_size]

# Split into sequences.
# We get 16 sequences where the last one is not full.
states = t.split(states, split_size_or_sections=32)
actions = t.split(actions, split_size_or_sections=32)
rewards = t.split(rewards, split_size_or_sections=32)

# Compute unpadded lengths
lengths = [i.shape[0] for i in states]

# Padding
states = t.nn.utils.rnn.pad_sequence(states, batch_first=True, padding_value=0)
actions = t.nn.utils.rnn.pad_sequence(actions, batch_first=True, padding_value=0)
rewards = t.nn.utils.rnn.pad_sequence(rewards, batch_first=True, padding_value=0)

# Concatenation and packing.
features = t.cat([states, actions, rewards], dim=-1)
features = t.nn.utils.rnn.pack_padded_sequence(features, lengths, batch_first=True, enforce_sorted=True)

# LSTM forward
with t.no_grad():
"""
Exception has occurred: RuntimeError
The size of tensor a (500) must match the size of tensor b (16) at non-singleton dimension 0
File "/mnt/c/Users/User/code/VideoPPO/test.py", line 33, in
outputs = model(features, (h_x, c_x))
RuntimeError: The size of tensor a (500) must match the size of tensor b (16) at non-singleton dimension 0
"""
"""
Error has occured because we have hidden states with the shape
[2, 500, 256] while as we must have shape [2, 500 // 32, 256] and we need 32 times fewer of data.
"""
outputs = model(features, (h_x, c_x))

# Unpacking
outputs, lengths = t.nn.utils.rnn.pad_packed_sequence(features, batch_first=True, padding_value=0.0)

# Unpadding
outputs = t.nn.utils.rnn.unpad_sequence(outputs, lengths, batch_first=True)

# Concatenation
outputs = t.cat(outputs, dim=0)

pass


Подробнее здесь: https://stackoverflow.com/questions/798 ... -sequences
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»