问题描述
我无法理解,如果预测是通过正向方法计算的,那么为什么需要“输出=自我(图像)”及其作用。我对此代码有些困惑。
class MnistModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(input_size,num_classes)
def forward(self,xb):
xb = xb.reshape(-1,784)
out = self.linear(xb)
return out
def training_step(self,batch):
images,labels = batch
out = self(images) # Generate predictions
loss = F.cross_entropy(out,labels) # Calculate loss
return loss
def validation_step(self,labels = batch
out = self(images) # Generate predictions
loss = F.cross_entropy(out,labels) # Calculate loss
acc = accuracy(out,labels) # Calculate accuracy
return {'val_loss': loss,'val_acc': acc}
def validation_epoch_end(self,outputs):
batch_losses = [x['val_loss'] for x in outputs]
epoch_loss = torch.stack(batch_losses).mean() # Combine losses
batch_accs = [x['val_acc'] for x in outputs]
epoch_acc = torch.stack(batch_accs).mean() # Combine accuracies
return {'val_loss': epoch_loss.item(),'val_acc': epoch_acc.item()}
def epoch_end(self,epoch,result):
print("Epoch [{}],val_loss: {:.4f},val_acc: {:.4f}".format(epoch,result['val_loss'],result['val_acc']))
model = MnistModel()
解决方法
在python中,自身是指您从类创建的实例(类似于Java和C ++中的 this )。实例是可调用的,这意味着,如果方法 _ call _ 被覆盖,则可以像函数本身一样调用它。
示例:
class A:
def __init__(self):
pass
def __call__(self,x,y):
return x + y
a = A()
print(a(3,4)) # Prints 7
在您的情况下,_ 调用 _方法在超类(nn.Module)中实现。 由于它是神经网络模块,因此需要输入占位符。 “输出” 是数据的占位符,该数据将把模块的输出转发到模型的下一层或模块。
在nn.Module类实例(以及从类继承的实例)的情况下,forward方法用作 call 方法。至少在针对nn.Module类定义的位置。