我想在两个损失函数或 nn.Modules 或 python 对象之间动态应用数学运算。在pytorch中生成动态图也可以被视为一个问题。
\n例如:在下面的例子中,我想添加两个损失函数。
\nnn.L1Loss() + nn.CosineEmbeddingLoss()\nRun Code Online (Sandbox Code Playgroud)\n如果我这样做,它会给我一个错误:
\n----> 1 nn.L1Loss() + nn.CosineEmbeddingLoss()\nTypeError: unsupported operand type(s) for +: 'L1Loss' and 'CosineEmbeddingLoss'\nRun Code Online (Sandbox Code Playgroud)\n我还尝试创建一个具有转发功能和火炬操作的包装器,如下所示,但它也不起作用。在下面的情况下x, 和y可以是任何损失函数,也op可以是任何数学运算,例如加法、减法等。
class Execute_Op(nn.Module):\n def __init__(self):\n super().__init__()\n \n def forward(self, x, y, op):\n if op == 'add':\n return torch.add(x, y)\n elif op == 'subtract':\n return torch.subtract(x - y)\n\nexec_op = Execute_Op()\nexec_op(nn.L1Loss(), nn.CosineEmbeddingLoss(), 'add')\nRun Code Online (Sandbox Code Playgroud)\n它给出如下错误:
\nExecute_Op.forward(self, x, y, op)\n 5 def forward(self, x, y, op):\n …Run Code Online (Sandbox Code Playgroud)