Hi,
I got an error message when exporting the following model with onnx. It looks like onnx does not support slice operator. In the model definition, I just want the last output of lstm layer. So I use slice operator, i.e., ‘output[:, -1, :]’. In addition, the ‘view’ method will get the same error with onnx exporting.

The model definition:


class Model1(torch.nn.Module):
    def __init__(self, use_cuda, input_size, hidden_size, output_size):
        super(Model1, self).__init__()
        self.model_name = 'model1'
        self.use_cuda = use_cuda
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.hidden_layer = torch.nn.LSTM(input_size, hidden_size)
        self.output_layer = torch.nn.Linear(hidden_size, output_size)


    def dummy_features(self, batch_size):
        seq_tensor = Variable(torch.randn(batch_size, MAX_SEQ_LEN, self.input_size), requires_grad=True).float()
        seq_lengths = Variable(torch.randn(batch_size), requires_grad=True).long()
        return seq_tensor, seq_lengths


    def forward(self, seq_tensor, seq_lengths):
        batch_size = seq_tensor.shape[0]

        h0 = Variable(torch.rand(1, batch_size, self.hidden_size), requires_grad=False)
        c0 = Variable(torch.rand(1, batch_size, self.hidden_size), requires_grad=False)

        if self.use_cuda:
            h0 = h0.cuda()
            c0 = c0.cuda()

        inputs = pack_padded_sequence(seq_tensor, seq_lengths.cpu().data.numpy(), batch_first=True)
        output, (hn, cn) = self.hidden_layer(inputs, (h0, c0))
        output, _ = pad_packed_sequence(output, batch_first=True)
        output = self.output_layer(output[:, -1, :])
        return output



The model graph:

graph(%1 : Float(1, 50, 256)
      %2 : Long(1)
      %3 : Float(64, 256)
      %4 : Float(64, 16)
      %5 : Float(64)
      %6 : Float(64)
      %7 : Float(2, 16)
      %8 : Float(2)) {
  %9 : Float(50!, 1!, 256) = Transpose[perm=[1, 0, 2]](%1), uses = [%10.i0];
  %10 : Float(1!, 1!, 256) = Slice[axes=[0, 1], ends=[1, 1], starts=[0, 0]](%9), uses = [%11.i0];
  %11 : Float(1, 256) = Reshape[shape=[-1, 256]](%10), uses = [%12.i0];
  %12 : Float(1, 256) = Concat[axis=0](%11), uses = [];
  return ();
}


The export code:

onnx_features = cpu_model.dummy_features(onnx_batch_size)
torch.onnx.export(cpu_model, onnx_features, os.path.join(model_save_path, 'model.onnx'), export_params=True)


The error message:

  File "/home/abc/platform/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/onnx/__init__.py", line 75, in export
    _export(model, args, f, export_params, verbose, training)
  File "/home/abc/platform/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/onnx/__init__.py", line 122, in _export
    _optimize_trace(trace)
  File "/home/abc/platform/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/onnx/__init__.py", line 81, in _optimize_trace
    torch._C._jit_pass_onnx(trace)
  File "/home/abc/platform/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/onnx/__init__.py", line 148, in _run_symbolic_method
    return symbolic_fn(*args)
  File "/home/abc/platform/anaconda3/envs/pytorch/lib/python3.6/site-packages/torch/autograd/_functions/tensor.py", line 77, in symbolic
    raise ValueError('Unsupported index type {}'.format(type(index)))
ValueError: Unsupported index type <class 'slice'>


An additional operator with the same error message (I want all the outputs of lstm and reshaped):

output.contiguous().view(batch_size, -1)