我正在尝试将 PyTorch VAE 转换为 onnx,但我得到:torch.onnx.symbolic.normal does not exist
问题似乎源于一个reparametrize()
函数:
def reparametrize(self, mu, logvar):
std = logvar.mul(0.5).exp_()
if self.have_cuda:
eps = torch.normal(torch.zeros(std.size()),torch.ones(std.size())).cuda()
else:
eps = torch.normal(torch.zeros(std.size()),torch.ones(std.size()))
return eps.mul(std).add_(mu)
我也试过:
eps = torch.cuda.FloatTensor(std.size()).normal_()
这产生了错误:
Schema not found for node. File a bug report.
Node: %173 : Float(1, 20) = aten::normal(%169, %170, %171, %172), scope: VAE
Input types:Float(1, 20), float, float, Generator
和
eps = torch.randn(std.size()).cuda()
这产生了错误:
builtins.TypeError: i_(): incompatible function arguments. The following argument types are supported:
1. (self: torch._C.Node, arg0: str, arg1: int) -> torch._C.Node
Invoked with: %137 : Tensor = onnx::RandomNormal(), scope: VAE, 'shape', 133 defined in (%133 : int[] = prim::ListConstruct(%128, %132), scope: VAE) (occurred when translating randn)
我正在使用cuda
.
任何想法表示赞赏。也许我需要z
为 onnx 以不同的方式处理 /latent ?
注意:逐步检查,我可以看到它正在寻找RandomNormal()
,torch.randn()
这应该是正确的。但是当时我真的无法访问这些论点,那么我该如何解决呢?