PyTorch权重和输出没有变化

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

我真的很享受使用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]

......等等,似乎没有什么能从时代变为时代。

python machine-learning deep-learning pytorch backpropagation
1个回答
0
投票

首先,两个ReLUs相继使用是没用的,应用一个就足够了。

第二,你的问题就在这一行

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)
© www.soinside.com 2019 - 2024. All rights reserved.