Hi all,
I am trying to preprocess input images in the model using batch_norm instead of normalizing the input tensor using mean/std values. I have the following code in python which works as intended:
class PreProcess(torch.nn.Module): def __init__(self,mean,var): super(PreProcess, self).__init__() self.mean = torch.FloatTensor(mean) self.var = torch.FloatTensor(var) def forward(self, x): """ In the forward function we accept a Tensor of input data and we must return a Tensor of output data. We can use Modules defined in the constructor as well as arbitrary operators on Tensors. """ x = x.permute(0, 3, 1, 2) x = torch.nn.functional.batch_norm(x, self.mean, self.var, weight=None, bias=None, training=False, momentum=0.1, eps=1e-05) return x def load_model(model_path, mean, std): model = torch.jit.load(model_path) var = [x*x for x in std] ppmodel = torch.nn.Sequential(PreProcess(mean, var), model) ppmodel.eval() return ppmodel
I want to do the same using libtorch in C++, so I wrote the following C++ code:
struct PreProcessImpl : torch::nn::Module { torch::Tensor forward(torch::Tensor x) { x = at::permute(x, {0, 3, 1, 2}); namespace F = torch::nn::functional; x = F::batch_norm(x, torch::ones({3}), torch::ones({3}), F::BatchNormFuncOptions().momentum(0.1).eps(1e-05).training(false)); return x; } }; TORCH_MODULE(PreProcess); PreProcess pp; auto ppmodule = torch::nn::Sequential(pp, torch::jit::load(modelFile));
However, it won’t compile because of this error:
torch/include/torch/csrc/api/include/torch/nn/modules/container/sequential.h:250:8: note: candidate function not viable: no known conversion from 'torch::jit::Module' to 'torch::nn::AnyModule' for 1st argument void push_back(AnyModule any_module) { ^
Any ideas on how to do this in C++ using libtorch?