[英]Pytorch Deep Learning - Class Model() and training function
我是 Pytorch 的新手,我正在閱讀本教程以了解如何使用該庫進行深度學習。 我在找出部分代碼時遇到問題。
有一個名為 Net 的類和一個從它實例化的名為 model 的對象。 然后是稱為 train(epoch) 的訓練函數。 在 train 函數體的下一行中,我看到了這個: model.train() 我無法理解。 你能幫我理解這部分代碼嗎? 當該方法尚未在類內部定義時,我們如何調用該類的方法? 為什么該方法與它在內部調用的函數具有完全相同的名稱? 這是類定義: class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(2304, 256) self.fc2 = nn.Linear(256, 17) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(x.size(0), -1) # Flatten layer x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.sigmoid(x) model = Net() # On CPU # model = Net().cuda() # On GPU
這是這個類之后定義的函數:
def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): # data, target = data.cuda(async=True), target.cuda(async=True) # On GPU data, target = Variable(data), Variable(target) optimizer.zero_grad() output = model(data) loss = F.binary_cross_entropy(output, target) loss.backward() optimizer.step() if batch_idx % 10 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.data[0]))
def train(epochs): ...
是訓練模型的方法,不是Net
類的屬性。 model
是Net
類的對象,它繼承自nn.Module
。
在 PyTorch 中,所有層都繼承自nn.Module
,這為它們提供了許多通用功能,例如model.children()
或layer.children()
、 model.apply()
等。
model.train()
在nn.Module
也有類似的實現。 它實際上並沒有訓練模型或任何繼承自nn.Module
層,而是將其設置為訓練模式,所以說它相當於執行model.set_train()
。 在測試模型之前,您可以調用一個等效的方法model.eval()
來設置評估模式。
層/模型中可能有一些參數在訓練和評估模式時會表現不同。 明顯的例子是BatchNorm
的 γ 和 β
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.