我正在使用 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()
我正在尝试回答我自己的问题。我的答案是否定的,因为
每次前向传递,PyTorch 都会构建一个 计算图 和 中间激活(层之间的输出),这些激活将被保存用于后向传递
.backward()
。在第二种方法中,我认为第一个中间激活将被第二个前向传递中创建的第二个中间激活覆盖。然后模型将仅使用第二遍的中间激活来实现.backward()