Search code examples
pythonpytorchartificial-intelligencereinforcement-learning

pytoch RuntimeError: Dimension out of range (expected to be in range of [-1, 0], but got 1


I am trying to train a Actor Critic Model with LSTM in both actor and critic. I am new to all this and can not understand why "RuntimeError: Dimension out of range (expected to be in range of [-1, 0], but got 1)" is comming.

I am forwardPropagating from actor and getting error

below is my code and error message.I am using pytorch version 0.4.1

Can someone please help to check what is wrong with this code.

import os
import time
import random
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import StandardScaler
import torch
import torch.nn as nn
import torch.nn.functional as F
from random import random as rndm
from torch.autograd import Variable
from collections import deque
   
torch.set_default_tensor_type('torch.DoubleTensor')


class Actor(nn.Module):
  
  def __init__(self, state_dim, action_dim, max_action):
    super(Actor, self).__init__()
    self.lstm = nn.LSTMCell(state_dim, 256)
    self.layer_1 = nn.Linear(256, 400)
    self.layer_2 = nn.Linear(400, 300)
    self.layer_3 = nn.Linear(300, action_dim)
    self.hx = torch.zeros(1,256)
    self.cx = torch.zeros(1,256)
    self.max_action = max_action

  def forward(self, x):
    self.hx, self.cx = self.lstm(x, (self.hx, self.cx))
    x = F.relu(self.layer_1(self.hx))
    x = F.relu(self.layer_2(x))
    x = self.max_action * torch.tanh(self.layer_3(x))
    return x

state_dim = 3
action_dim = 3
max_action = 1

policy = Actor(state_dim, action_dim, max_action)

s = torch.tensor([20,20,100])
next_action = policy(s)

and the error message is :

next_action = policy(s)
Traceback (most recent call last):

  File "<ipython-input-20-de717f0ad3d2>", line 1, in <module>
    next_action = policy(s)

  File "C:\Users\granthjain\anaconda3\lib\site-packages\torch\nn\modules\module.py", line 477, in __call__
    result = self.forward(*input, **kwargs)

  File "<ipython-input-4-aed4daf511cb>", line 14, in forward
    self.hx, self.cx = self.lstm(x, (self.hx, self.cx))

  File "C:\Users\granthjain\anaconda3\lib\site-packages\torch\nn\modules\module.py", line 477, in __call__
    result = self.forward(*input, **kwargs)

  File "C:\Users\granthjain\anaconda3\lib\site-packages\torch\nn\modules\rnn.py", line 704, in forward
    self.check_forward_input(input)

  File "C:\Users\granthjain\anaconda3\lib\site-packages\torch\nn\modules\rnn.py", line 523, in check_forward_input
    if input.size(1) != self.input_size:

RuntimeError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

I am using pytorch version 0.4.1

Can someone please help to check what is wrong with this code.


Solution

  • Got it.

    The input of the lstm layer has different shape. https://pytorch.org/docs/master/generated/torch.nn.LSTMCell.html