我有一个关于Python代码的基本问题。
例如,
进口火炬import torch.nn as nn
loss = nn.MSELoss()input = torch.randn(3,5,requires_grad = True)target = torch.randn(3,5)输出= …
从理论上讲,任何事情都可能发生,因为当你导入模块代码时,Python中的所有内容都是动态的。
但实际上,如果写成第四行,则很可能表现为第四行
output = nn.MSELoss()(input, target)
没有将其分配给 loss 先变量。
loss
我在假设 torch.randn 不依赖于你之前已经创造了一个损失的事实。这在技术上是可行的,但实际上不是pythonic。
torch.randn
正如其他一些人所指出的, nn.MSELoss 是一个类而不是一个函数。在第1行中,您将创建一个类型的对象 torch.nn.modules.loss.MSELoss 。而且因为它继承自 nn.Module ,你可以像调用函数一样调用这个对象,就像在第4行中那样。 如果您不想使用MSELoss类,也可以 import torch.nn.functional as F 然后使用 F.mse_loss(input, target) 直接(这是pytorch通常要求你的)。
nn.MSELoss
torch.nn.modules.loss.MSELoss
nn.Module
import torch.nn.functional as F
F.mse_loss(input, target)