我真的很享受使用PyTorch进行分类和回归。我有一个有趣的新问题要解决,我无法弄清楚解决方案,我觉得我真的很亲密。
我的问题:我创建了一个有三个输出的网络,我们称之为x,y和z我有一个函数F(x,y,z),它返回一个介于0.0和100.0之间的值,其中100更好我的自定义丢失因此是100 -F(x,y,z)每一步目标是找出问题F(...)的最佳输出组合(我知道遗传算法将胜过这个,这是我的项目,现在证明它在一系列问题)
为了实现上述目标,我强制网络拥有1个输入数据和1个批量大小,然后在损失中我们完全忽略“真实”和“预测”值并用100-F替换损失(的x,y,z)表示。基本上我们的权重和输出将在每个时期产生一个解,并且该解的适合度与给出损失的最大可能适度相反(即,适应度100将导致损失0,100-100)。
输出四舍五入为整数,因为F(...)需要它们。为了防止这成为一个问题,我有一个很大的动力和学习率。
我遇到的问题是,尽管损失函数正在运行并且我的第一个[x,y,z]正在被评估,但值永远不会改变。网络没有从所产生的结果中学习。
我的代码如下:注意testnetwork()太长而无法粘贴,但它是上面提到的F(x,y,z) - 任何虚函数都可以代替它。 'return x + zy / 2'等以最小化此功能(100 - x + zy / 2)
import torch
import torch.nn as nn
from testnetwork import *
n_in, n_h, n_out, batch_size = 10, 5, 3, 5
x = torch.randn(batch_size, n_in)
y = torch.tensor([[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [0.0], [1.0], [1.0]])
model = nn.Sequential(nn.Linear(n_in, n_h),
nn.ReLU(),
nn.ReLU()
)
def fitness(string):
print(string)
list = string.split(",")
list[0] = (int(round(float(list[0]))))
list[1] = (int(round(float(list[1]))))
list[2] = (int(round(float(list[2]))))
print(list)
loss = 100 - testnetwork(list[0], list[1], list[2])
return loss
def my_loss(output, target):
table = str.maketrans(dict.fromkeys('tensor()'))
ftn = fitness(str(output.data[0][0]).translate(table) + ", " + str(output.data[0][1]).translate(table) + ", " + str(output.data[0][2]).translate(table))
loss = torch.mean((output - output)+ftn)
return loss
#optimizer = torch.optim.SGD(model.parameters(), lr=1, momentum=2)
optimizer = torch.optim.Adam(model.parameters(), lr=1, momentum=2)
for epoch in range(10):
# Forward Propagation
y_pred = model(x)
# Compute and print loss
loss = my_loss(y_pred, y)
print('epoch: ', epoch,' loss: ', loss.item())
# Zero the gradients
optimizer.zero_grad()
# perform a backward pass (backpropagation)
loss.backward(retain_graph=True)
# Update the parameters
optimizer.step()
非常感谢您阅读我的帖子!
epoch: 0 loss: 50.339725494384766
0., 0.0200, 0.6790
[0, 0, 1]
testing: [0, 0, 1]
epoch: 1 loss: 50.339725494384766
0., 0.0200, 0.6790
[0, 0, 1]
testing: [0, 0, 1]
epoch: 2 loss: 50.339725494384766
0., 0.0200, 0.6790
[0, 0, 1]
testing: [0, 0, 1]
epoch: 3 loss: 50.339725494384766
0., 0.0200, 0.6790
[0, 0, 1]
testing: [0, 0, 1]
epoch: 4 loss: 50.339725494384766
0., 0.0200, 0.6790
[0, 0, 1]
......等等,似乎没有什么能从时代变为时代。
首先,两个ReLU
s相继使用是没用的,应用一个就足够了。
第二,你的问题就在这一行
ftn = fitness(str(output.data[0][0]).translate(table) + ", " + str(output.data[0][1]).translate(table) + ", " + str(output.data[0][2]).translate(table))
你在调用.data
这不是Tensor并且不能记录backprop操作,所以基本上你是在计算你在detached
张量上的损失
我想,我知道你想要实现的目标是什么。在这一行:
loss = torch.mean((output - output)+ftn)
你可能想要detach
的第二个输出,它类似于TF的stop_grad()
。
loss = torch.mean((output - output.detach())+ftn)