Pytorch:使用完整数据进行一次前向传递,使用数据子集进行多次前向传递,它们是否相同?

问题描述 投票:0回答:1

我正在使用 PyTorch 优化我的神经网络(LSTM 网络)。由于某些原因(在训练期间),我无法一次传递所有数据,而只能传递数据的子集(请参阅下面的代码)。在这两种方法中,假设我仅在所有 x 数据(x 小批量数据)通过后更新网络权重。我的问题是,对于网络权重的优化,这两种方法是否相同。

import torch

# Create input
x = {}
x["one"] = torch.rand(10,2)
x["two"] = torch.rand(7,2)

y = {}
y["one"] = torch.rand(10,1)
y["two"] = torch.rand(7,1)

# LSTM model
model = torch.nn.LSTM(input_size=2, hidden_size=1)

# Train the model
optim = torch.optim.Adam(model.parameters(), lr=0.001)
loss = torch.nn.L1Loss()

#------------------------------------------------------------------------------
#   First approach
#------------------------------------------------------------------------------
y_true = torch.cat((y["one"], y["two"]), dim = 0)
for epoch in range(3):
    y_predict = {}
    for key in x.keys():
        y_predict[key], _ = model(x[key])
    
    # reset gradient to zero
    optim.zero_grad()
    
    # convert y predict to torch tensor
    y_predict = torch.cat((y_predict["one"], y_predict["two"]), dim = 0)
    
    # calculating loss and update weights
    L1loss = loss(y_true, y_predict)
    L1loss.backward()
    optim.step()
    
#------------------------------------------------------------------------------
# Second approach
#------------------------------------------------------------------------------

input = torch.cat((x["one"], x["two"]), dim = 0)
for epoch in range(3):
    y_predict, _ = model(input)

    # reset gradient to zero
    optim.zero_grad()

    # calculating loss and update weights
    L1loss = loss(y_true, y_predict)
    L1loss.backward()
    optim.step()
optimization pytorch loss
1个回答
0
投票

我正在尝试回答我自己的问题。我的答案是否定的,因为

每次前向传递,PyTorch 都会构建一个 计算图中间激活(层之间的输出),这些激活将被保存用于后向传递

.backward()
。在第二种方法中,我认为第一个中间激活将被第二个前向传递中创建的第二个中间激活覆盖。然后模型将仅使用第二遍的中间激活来实现
.backward()

© www.soinside.com 2019 - 2024. All rights reserved.