【发布时间】:2022-01-18 00:36:42
【问题描述】:
作为我实际研究问题的简化版本,假设我有一个二阶多项式函数 y = ax^2 + bx + c,我想使用深度神经网络给定变量 x 和函数 y 的值来预测参数 a、b 和 c。变量 x 和参数 a,b,c 是从 [0,1] 范围内的均匀分布中提取的。
当我尝试使用最常用的不同架构、成本函数和超参数组合来训练网络时,我总是遇到同样的问题:训练和测试损失迅速收敛到显着高于 0 的值,然后开始波动以一种奇怪的方式并且预测不准确(参见数字作为一般示例,b 的预测相似,c 略好但仍不令人满意)。即使我设置了更高的动量或更低的学习率,也会发生这种情况。此外,如果我尝试一次恢复一个参数,我也会遇到同样的问题。
例如,这是我在第一次测试中使用的 PyTorch 代码(4 层,前 3 层,然后是 ReLU、MSELoss、RMSprop 优化器,学习率 = 0.001,动量为 0.9)。
class PRNet(nn.Module):
def __init__(self, input_size, output_size):
super(PRNet, self).__init__()
self.input_size = input_size
self.fc1 = nn.Linear(self.input_size, 32)
self.relu1 = nn.ReLU()
self.fc2 = nn.Linear(32, 64)
self.relu2 = nn.ReLU()
self.fc3 = nn.Linear(64, 64)
self.relu3 = nn.ReLU()
self.fc4 = nn.Linear(64, output_size)
def forward(self, x):
output = self.fc1(x)
output = self.relu1(output)
output = self.fc2(output)
output = self.relu2(output)
output = self.fc3(output)
output = self.relu3(output)
output = self.fc4(output)
return output
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
var_x = np.random.rand(100000)
pars_abc = np.random.rand(3, 100000)
func_y = pars[0]*var**2 + pars[1] * var + pars[2]
data = np.vstack((var_x, func_y)).T
parameters = pars_abc.T
X = torch.Tensor(data).to(device).float()
y = torch.Tensor(parameters).to(device).float()
train_size = int(0.8 * len(data))
batch_size = 100
train_dataset = TensorDataset(X[:train_size], y[:train_size])
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=False)
prnet = PRNet(X.shape[1], 3).to(device)
loss_function = nn.MSELoss()
optimizer = torch.optim.RMSprop(prnet.parameters(), lr=1e-4, momentum=0.9)
num_epochs = 25
for epoch in range(0, num_epochs):
print(f'Starting epoch {epoch+1}')
current_loss = 0.0
for i, batch in enumerate(train_dataloader, 0):
inputs, targets = batch
optimizer.zero_grad()
outputs = prnet(inputs)
test_outputs = prnet(X[train_size:].to(device))
train_loss = loss_function(outputs, targets)
test_loss = loss_function(test_outputs, y[train_size:])
train_loss_plot[epoch,i] = train_loss.item()
test_loss_plot[epoch,i] = test_loss.item()
train_loss.backward()
optimizer.step()
此问题的原因可能是什么?特征不够有代表性吗?我需要更适合这个问题的自定义损失吗?
【问题讨论】:
标签: python deep-learning neural-network pytorch regression