簡體   English   中英

Pytorch 深度學習 - 類模型()和訓練函數

[英]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]))

train vs model.train

def train(epochs): ...是訓練模型的方法,不是Net類的屬性。 modelNet類的對象,它繼承自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM