title: PyTorch: DecoderRNN: RuntimeError: input must have 3 dimensions, got 2
body: <p>I am building a DecoderRNN using PyTorch (This is an image-caption decoder):</p>
  
  <pre><code>class DecoderRNN(nn.Module):
      def __init__(self, embed_size, hidden_size, vocab_size):
  
          super(DecoderRNN, self).__init__()
          self.hidden_size = hidden_size
          self.gru = nn.GRU(embed_size, hidden_size, hidden_size)
          self.softmax = nn.LogSoftmax(dim=1)
  
      def forward(self, features, captions):
  
          print (features.shape)
          print (captions.shape)
          output, hidden = self.gru(features, captions)
          output = self.softmax(self.out(output[0]))
          return output, hidden 
  </code></pre>
  
  <p>The data have the following shapes:</p>
  
  <pre><code>torch.Size([10, 200])  &lt;- features.shape (10 for batch size)
  torch.Size([10, 12])   &lt;- captions.shape (10 for batch size)
  </code></pre>
  
  <p>Then I got the following errors. Any ideas what I missed here? Thanks!</p>
  
  <pre><code>---------------------------------------------------------------------------
  RuntimeError                              Traceback (most recent call last)
  &lt;ipython-input-2-76e05ba08b1d&gt; in &lt;module&gt;()
       44         # Pass the inputs through the CNN-RNN model.
       45         features = encoder(images)
  ---&gt; 46         outputs = decoder(features, captions)
       47 
       48         # Calculate the batch loss.
  
  /opt/conda/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
      323         for hook in self._forward_pre_hooks.values():
      324             hook(self, input)
  --&gt; 325         result = self.forward(*input, **kwargs)
      326         for hook in self._forward_hooks.values():
      327             hook_result = hook(self, input, result)
  
  /home/workspace/model.py in forward(self, features, captions)
       37         print (captions.shape)
       38         # features = features.unsqueeze(1)
  ---&gt; 39         output, hidden = self.gru(features, captions)
       40         output = self.softmax(self.out(output[0]))
       41         return output, hidden
  
  /opt/conda/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
      323         for hook in self._forward_pre_hooks.values():
      324             hook(self, input)
  --&gt; 325         result = self.forward(*input, **kwargs)
      326         for hook in self._forward_hooks.values():
      327             hook_result = hook(self, input, result)
  
  /opt/conda/lib/python3.6/site-packages/torch/nn/modules/rnn.py in forward(self, input, hx)
      167             flat_weight=flat_weight
      168         )
  --&gt; 169         output, hidden = func(input, self.all_weights, hx)
      170         if is_packed:
      171             output = PackedSequence(output, batch_sizes)
  
  /opt/conda/lib/python3.6/site-packages/torch/nn/_functions/rnn.py in forward(input, *fargs, **fkwargs)
      383             return hack_onnx_rnn((input,) + fargs, output, args, kwargs)
      384         else:
  --&gt; 385             return func(input, *fargs, **fkwargs)
      386 
      387     return forward
  
  /opt/conda/lib/python3.6/site-packages/torch/autograd/function.py in _do_forward(self, *input)
      326         self._nested_input = input
      327         flat_input = tuple(_iter_variables(input))
  --&gt; 328         flat_output = super(NestedIOFunction, self)._do_forward(*flat_input)
      329         nested_output = self._nested_output
      330         nested_variables = _unflatten(flat_output, self._nested_output)
  
  /opt/conda/lib/python3.6/site-packages/torch/autograd/function.py in forward(self, *args)
      348     def forward(self, *args):
      349         nested_tensors = _map_variable_tensor(self._nested_input)
  --&gt; 350         result = self.forward_extended(*nested_tensors)
      351         del self._nested_input
      352         self._nested_output = result
  
  /opt/conda/lib/python3.6/site-packages/torch/nn/_functions/rnn.py in forward_extended(self, input, weight, hx)
      292             hy = tuple(h.new() for h in hx)
      293 
  --&gt; 294         cudnn.rnn.forward(self, input, hx, weight, output, hy)
      295 
      296         self.save_for_backward(input, hx, weight, output)
  
  /opt/conda/lib/python3.6/site-packages/torch/backends/cudnn/rnn.py in forward(fn, input, hx, weight, output, hy)
      206         if (not is_input_packed and input.dim() != 3) or (is_input_packed and input.dim() != 2):
      207             raise RuntimeError(
  --&gt; 208                 'input must have 3 dimensions, got {}'.format(input.dim()))
      209         if fn.input_size != input.size(-1):
      210             raise RuntimeError('input.size(-1) must be equal to input_size. Expected {}, got {}'.format(
  
  RuntimeError: input must have 3 dimensions, got 2
  </code></pre>