PyTorch:如何编写仅返回权重的神经网络?

时间:2019-09-18 15:05:25

标签: python neural-network pytorch

我正在训练一个学习一些权重的神经网络,并基于这些权重,计算与权重结合生成预测模型的变换。我的网络无法正常学习,因此我正在编写其他网络,除了返回独立于输入x的权重之外,什么也不做(使用softmax和转置进行归一化之后)。这样,我想找出问题是出在网络上还是在网络外的转换估计中。但这是行不通的。这就是我所拥有的。

class DoNothingNet(torch.nn.Module):
    def __init__(self, n_vertices=6890, n_joints=14):
        super(DoNothingNet, self).__init__()
        self.weights = nn.parameter.Parameter(torch.randn(n_vertices, n_joints))

    def forward(self, x, indices):
        self.weights = F.softmax(self.weights, dim=1)
        return self.weights.transpose(0,1)

但是行self.weights = F.softmax(self.weights, dim=1)不起作用,并产生错误TypeError: cannot assign 'torch.cuda.FloatTensor' as parameter 'weights' (torch.nn.Parameter or None expected)。我该如何解决?代码甚至有意义吗?

1 个答案:

答案 0 :(得分:1)

nn.Module跟踪nn.Parameter类型的所有字段进行训练。在代码中的每个前向调用中,您尝试通过将其分配给Tensor类型来更改参数权重,因此会发生错误。

以下代码在不更改存储的权重的情况下输出归一化的权重。希望这会有所帮助。

import torch
from torch import nn
from torch.nn import functional as F

class DoNothingNet(torch.nn.Module):
    def __init__(self, n_vertices=6890, n_joints=14):
        super(DoNothingNet, self).__init__()
        self.weights = nn.parameter.Parameter(torch.randn(n_vertices, n_joints))

    def forward(self, x, indices):
        output = F.softmax(self.weights, dim=1)
        return output.transpose(0,1)