次のコードを実行しようとしています。
import matplotlib.pylab as plt
import numpy as np
import torch
import torch.nn as nn
class LSTM(nn.Module):
def __init__(self, input_shape, n_actions):
super(LSTM, self).__init__()
self.lstm = nn.LSTM(input_shape, 12)
self.hidden2tag = nn.Linear(12, n_actions)
def forward(self, x):
out = self.lstm(x)
out = self.hidden2tag(out)
return out
state = [(1,2,3,4,5),(2,3,4,5,6),(3,4,5,6,7),(4,5,6,7,8),(5,6,7,8,9),(6,7,8,9,0)]
device = torch.device("cuda")
net = LSTM(5, 3).to(device)
state_v = torch.FloatTensor(state).to(device)
q_vals_v = net(state_v.view(1, state_v.shape[0], state_v.shape[1]))
_, action = int(torch.max(q_vals_v, dim=1).item())
そして、それはこのエラーを返します:
Traceback (most recent call last):
File "/home/dikkerj/Documents/PycharmProjects/LSTMReactor/QuestionStackoverflow.py", line 26, in <module>
q_vals_v = net(state_v.view(1, state_v.shape[0], state_v.shape[1]))
File "/home/dikkerj/.local/lib/python3.5/site-packages/torch/nn/modules/module.py", line 477, in __call__
result = self.forward(*input, **kwargs)
File "/home/dikkerj/Documents/PycharmProjects/LSTMReactor/QuestionStackoverflow.py", line 15, in forward
out = self.hidden2tag(out)
File "/home/dikkerj/.local/lib/python3.5/site-packages/torch/nn/modules/module.py", line 477, in __call__
result = self.forward(*input, **kwargs)
File "/home/dikkerj/.local/lib/python3.5/site-packages/torch/nn/modules/linear.py", line 55, in forward
return F.linear(input, self.weight, self.bias)
File "/home/dikkerj/.local/lib/python3.5/site-packages/torch/nn/functional.py", line 1022, in linear
if input.dim() == 2 and bias is not None:
AttributeError: 'Tuple' object has no attribute 'dim'
誰もがこれを修正する方法を知っていますか? (テンソルがタプルであることを取り除き、LSTMネットワークにフィードできるようにするため)
PytorchLSTMはタプルを返します。
したがって、線形レイヤー_self.hidden2tag
_はこのタプルを処理できないため、このエラーが発生します。
だから変更:
_out = self.lstm(x)
_
に
_out, states = self.lstm(x)
_
これにより、out
が単なる出力テンソルになるようにタプルを分割することで、エラーが修正されます。
out
は非表示の状態を格納し、states
は最後の非表示のセル状態を含む別のタプルです。
こちらもご覧ください:
https://pytorch.org/docs/stable/nn.html#torch.nn.LSTM
max()
がタプルも返すため、最後の行で別のエラーが発生します。しかし、これは簡単に修正できるはずですが、それでも別のエラーです:)
最初に状態をnumpy配列に変換します。
state = np.array(state)
PyTorchのAPIにnp.asarray
がない可能性があります。