我正在训练一个学习一些权重的神经网络,并基于这些权重,计算与权重结合生成预测模型的变换。我的网络无法正常学习,因此我正在编写其他网络,除了返回独立于输入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)
。我该如何解决?代码甚至有意义吗?
答案 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)