我正在定義一個火車函式,我將它作為字典傳遞給 data_loader。
- data_loader['train']:包含訓練資料
- data_loader['val'] 包含驗證資料。
我創建了一個回圈,該回圈遍歷我所處的階段(train 或 val),并將模型相應地設定為 model.train() 或 model.eval()。但是我覺得我這里有太多嵌套的 for 回圈,這使得它的計算成本很高。誰能推薦一種更好的方法來構建我的火車功能?我應該創建一個單獨的函式來驗證嗎?
以下是我到目前為止的內容:
#Make train function (simple at first)
def train_network(model, optimizer, data_loader, no_epochs):
total_epochs = notebook.tqdm(range(no_epochs))
for epoch in total_epochs:
for phase in ['train', 'val']:
if phase == 'train':
model.train()
else:
model.eval()
for i, (images, g_truth) in enumerate(data_loader[phase]):
images = images.to(device)
g_truth = g_truth.to(device)
uj5u.com熱心網友回復:
在撰寫訓練腳本時,最外層和最內層的 for 回圈很常見。
我看到的最常見的模式是:
total_epochs = notebook.tqdm(range(no_epochs))
for epoch in total_epochs:
# Training
for i, (images, g_truth) in enumerate(train_data_loader):
model.train()
images = images.to(device)
g_truth = g_truth.to(device)
...
# Validating
for i, (images, g_truth) in enumerate(val_data_loader):
model.eval()
images = images.to(device)
g_truth = g_truth.to(device)
...
如果你需要使用你之前的變數data_loader,你可以train_data_loader用data_loader["train"]和val_data_loader替換data_loader["val"]
這種布局很常見,因為我們通常希望在驗證而不是訓練時做一些不同的事情。這還可以更好地構建代碼,并避免if phase == "train"在最內層回圈的不同部分可能需要的很多內容。然而,這確實意味著您可能需要復制一些代碼。權衡是普遍接受的,如果我們有 3 個或更多階段,例如多個驗證階段或評估階段,則可能會考慮您的原始代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/449702.html
下一篇:按組劃分的評分者間信度
