【发布时间】:2021-12-02 01:26:27
【问题描述】:
我有一个简单的神经网络:
import torch
import torch.nn as nn
import torch.optim as optim
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.fc1 = nn.Linear(1, 5)
self.fc2 = nn.Linear(5, 10)
self.fc3 = nn.Linear(10, 1)
def forward(self, x):
x = self.fc1(x)
x = torch.relu(x)
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Model()
opt = optim.Adam(net.parameters())
我还有一些输入功能:
features = torch.rand((3,1))
我可以用一个最小化的简单损失函数来正常训练它:
for i in range(10):
opt.zero_grad()
out = net(features)
loss = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
print('loss:', loss)
loss.backward()
opt.step()
但是,如果我要为此添加另一个我想要最大化的损失组件--loss2:
loss2s = []
for i in range(10000):
opt.zero_grad()
out = net(features)
loss1 = torch.mean(torch.square(torch.tensor(5) - torch.sum(out)))
loss2 = torch.sum(torch.tensor([torch.sum(w_arr) for w_arr in net.parameters()]))
loss2s.append(loss2)
loss = loss1 + loss2
loss.backward()
opt.step()
由于 2 个损失的规模不同,它看起来变得不稳定。另外,我不确定这是正确的方法,因为损失如何知道最大化一个部分并最小化另一个部分。请注意,这只是一个示例,显然增加权重是没有意义的。
import matplotlib.pyplot as plt
plt.plot(loss2s, c='r')
plt.plot(loss1s, c='b')
而且我相信最小化函数是 ML 训练的常用方法,所以我不确定以某种方式将最大化问题改为最小化问题是否会更好。
【问题讨论】:
标签: python machine-learning neural-network pytorch loss-function