Python PyTorch网络参数空间距离的计算

Python PyTorch网络参数空间距离的计算,python,pytorch,Python,Pytorch,我是皮托克的新手。我想在参数空间中跟踪我的模型通过优化所经过的距离。这是我正在使用的代码 class ParameterDiffer(object): def __init__(self, network): network_params = [] for p in network.parameters(): network_params.append(p.data.numpy()) self.network_par

我是皮托克的新手。我想在参数空间中跟踪我的模型通过优化所经过的距离。这是我正在使用的代码

class ParameterDiffer(object):
    def __init__(self, network):
        network_params = []
        for p in network.parameters():
            network_params.append(p.data.numpy())
        self.network_params = network_params

    def get_difference(self, network):
        total_diff = 0.0
        for i, p in enumerate(network.parameters()):
            p_np = p.data.numpy()
            diff = self.network_params[i] - p_np
            # print(diff)
            scalar_diff = np.sum(diff ** 2)
            total_diff += scalar_diff
        return total_diff
这样行吗?我一直在跟踪总差异,并记录下来,但它似乎总是为零。尽管模型的性能正在提高,这让我非常困惑。

原因是什么 这是因为PyTorch处理numpy数组和torch
张量之间的转换的方式。如果numpy数组和torch张量之间的底层数据类型相同,则它们将共享内存。更改其中一个的值也会更改另一个的值。我在这里举一个具体的例子

x = Variable(torch.rand(2, 2))
y = x.data.numpy()
x
Out[39]: 
Variable containing:
 0.8442  0.9968
 0.7366  0.4701
[torch.FloatTensor of size 2x2]
y
Out[40]: 
array([[ 0.84422851,  0.996831  ],
       [ 0.73656738,  0.47010136]], dtype=float32)
然后,如果您在适当的位置更改x,并查看x和y中的值,您将发现它们仍然相同

x += 2
x
Out[42]: 
Variable containing:
 2.8442  2.9968
 2.7366  2.4701
[torch.FloatTensor of size 2x2]
y
Out[43]: 
array([[ 2.84422851,  2.99683094],
       [ 2.7365675 ,  2.47010136]], dtype=float32)
因此,在模型更新期间,模型中的参数和类
parameterDifference
中的参数将始终相同。这就是为什么你会看到零

如何解决这个问题? 如果numpy数组和torch Tensor的底层数据类型不兼容,它将强制在torch Tensor中复制原始数据,这将使numpy数组和torch Tensor具有单独的内存

一种简单的方法就是将numpy数组转换为类型
np.float64
。而不是

network_params.append(p.data.numpy())
你可以用

network_params.append(p.data.numpy().astype(np.float64))
重要参考资料

  • 非常感谢你,我真的不知道这是怎么回事。非常透彻的解释,我希望我能多投一票。