我有一個包含不同大小特征的訓練資料集。我理解這對網路架構的影響,并相應地設計了我的網路來處理這些異構形狀。但是,當談到我的訓練回圈時,我對 、 和 的順序/放置optimizer.zero_grad()感到loss.backward()困惑optimizer.step()。
由于特征大小不相等,我不能同時對一批特征進行前向傳遞。因此,我的訓練回圈手動回圈遍歷批次樣本,如下所示:
for epoch in range(NUM_EPOCHS):
for bidx, batch in enumerate(train_loader):
optimizer.zero_grad()
batch_loss = 0
for sample in batch:
feature1 = sample['feature1']
feature2 = sample['feature2']
label1 = sample['label1']
label2 = sample['label2']
pred_l1, pred_l2 = model(feature1, feature2)
sample_loss = compute_loss(label1, pred_l1)
sample_loss = compute_loss(label2, pred_l2)
sample_loss.backward() # CHOICE 1
batch_loss = sample_loss.item()
# batch_loss.backward() # CHOICE 2
optimizer.step()
我想知道這里是否有意義,使用稱為每個樣本(CHOICE 1)sample_loss的優化器步驟對每個呼叫向后呼叫。BATCH_SIZE我認為,另一種選擇是向后呼叫batch_loss(選擇 2),我不太確定哪個是正確的選擇。
uj5u.com熱心網友回復:
微分是一種線性運算,因此理論上,您是否首先區分不同的損失并添加它們的導數,或者您是否首先添加損失然后計算它們的總和的導數都無關緊要。
因此,出于實際目的,它們都應該導致相同的結果(忽略通常的浮點問題)。
您可能會得到稍微不同的記憶體要求和計算速度(我猜第二個版本可能會稍微快一些。),但這很難預測,但您可以通過對這兩個版本進行計時來輕松找到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453456.html
上一篇:成對讀取序列并將堿基增加 1
下一篇:如何識別段落中每個句子的情緒
