Forwarding a list of tensors

Hi,
I’m testing pytorch mobile capabilities and when I try to forward a single tensors there’s no problem.
But trying to pass a list of tensors is completely different.
I declared and defined an array of tensors in which I passed the images I want to forward to the module.
Then I convert that to a list of tensors with this: “List i = Arrays.asList(mInputTensor);”.
Because I would like to pass the entire list to the forward method, then I do: “final Tensor[] o = module.forward(IValue.listFrom(i)).toTensorList();”.
But this expression gives me errors, I can’t understand where is the problem, could anyone help me with this?
Thanks

Could anyone help me?
I just want to know if I can put as input an array of tensors to the forward method, and if yes how.
Thanks

@simoloca I face the same problems with you. I want to feed a network with List[Tensor] using c++.

Hello @simoloca, @dragen
Sorry for delay with reply.

List[Tensor] is a separate type than list of IValue that is Tensor inside.
Make sure that overloaded IValue.listFrom goes to IValue.listFrom(Tensor... list) , not to IValue.listFrom(IValue... array) .

I created PR for example where I call scripted method that accepts List[Tensor] :

import torch

print(torch.version.__version__)

def scriptAndSave(module, fileName):
    print('-' * 80)
    script_module = torch.jit.script(module)
    print(script_module.graph)
    outputFileName = fileName
    script_module.save(outputFileName)
    print("Saved to " + outputFileName)
    print('=' * 80)

class Test(torch.jit.ScriptModule):
    def __init__(self):
        super(Test, self).__init__()

    @torch.jit.script_method
    def forward(self, input):
        return None

    @torch.jit.script_method
    def sumTensorsList(self, input):
        # type: (List[Tensor]) -> Tensor
        sum = torch.zeros_like(input[0])
        for x in input:
            sum += x
        return sum
scriptAndSave(Test(), "sum_tensors_list.pt")
  private Tensor makeTensor(final long[] shape, float value) {
    long numElements = 1;
    for (int i = 0; i < shape.length; i++) {
      numElements *= shape[i];
    }
    FloatBuffer buffer = Tensor.allocateFloatBuffer((int) numElements);
    for(int i = 0; i < numElements; i++) {
      buffer.put(i, value);
    }
    return Tensor.fromBlob(buffer, shape);
  }

  final long[] shape = new long[] {2, 2};

    IValue ivalue = IValue.listFrom(
      makeTensor(shape, 1),
      makeTensor(shape, 2),
      makeTensor(shape, 3));

    final Tensor outputTensor = mModule.runMethod("sumTensorsList", ivalue).toTensor();
1 Like

I did, but I made the following mistakes:

final Tensor img1 = TensorImageUtils.bitmapToFloat32Tensor(bitmap1,
                            TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);
final Tensor img2 = TensorImageUtils.bitmapToFloat32Tensor(bitmap2,
                    TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB);
IValue img = IValue.listFrom(img1, img2);
final Tensor outputTensor = module.forward(img).toTensor();

see my comment in How to use module.foward(Ivalue).toTensor() - #3 by gohna