微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pytorch-Trick AutoGrad认为另一种输出是最终结果 场景:所需的结果:这是我需要知道的:编辑1

如何解决Pytorch-Trick AutoGrad认为另一种输出是最终结果 场景:所需的结果:这是我需要知道的:编辑1

场景:

  • 我有一个简单的炬管CNN网络,可以预测给定的图像输入是狗还是猫。

  • 获得神经网络的输出后,我需要将X的修饰符应用于每个预测。例如,如果神经网络返回[0.6,0.4],并且我想应用[0.05,-0.03]修饰符,则我需要将结果设为[0.65,0.37]。

所需的结果:

  • 我希望AutoGrad认为最终输出为[0.65,0.37]。也就是说,AutoGrad根本不应该考虑添加修饰符。实际上,需要欺骗它以使最后一个运算结果是[0.65,0.37]而不是[0.6,0.4],并考虑到反向传播。

这是我需要知道的:

  • 我应该怎么做?我知道Torch会记录每个操作并相应地计算动态图。我根本不希望记录此操作,也不能使用torch.no_grad()包装器,因为之后需要进行反向传播。

编辑1

@trsvchn这是我执行您的方法时发生的情况。这是预期的吗?进行反向传播时,autograd会使用“ T”值而不是“数据”值吗?

enter image description here

解决方法

使用awk 'length==6{printf("%.0f MHz\n",$0/10^3); next} length==7{printf("%.1f GHz\n",$0/10^6)}' /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 上下文管理器来停用torch.no_grad,例如,该操作将不会被记录,但是您应该使用就地操作,否则将添加另一个没有{{1}的张量并打破图表。就您而言:

autograd
,

这应该很简单: 您在forward函数中进行的任何数学运算通常都会包含在反向传播中,因为它已添加到计算图中。 因此,据我了解,您可以执行以下操作:


def forward(self,x):
    x = self.layer1(x)
    x = self.layerN(x)

    x = x + torch.tensor([0.5,-0.3]).cuda() #or .cpu()

您可以向前进行任何数学运算(只要它包括火炬张量即可)并将其包含在反向传播中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。