Python 使用for循环定义nn.parameters
我对使用Pytorch在自定义神经网络中定义L权重感兴趣 如果L已知,则逐个定义它们不是问题,但如果L未知,则我希望使用for循环来定义它们。我的想法是做这样的事情(不起作用) 这样做应该是这样的(相反,它可以工作,但仅限于特定数量的权重): 在我尝试做的事情中,有一个问题是Pytorch只识别字符串“namew”,而不是“namew”的“动态”字符串。因此,只定义了1个权重,而不是L个权重Python 使用for循环定义nn.parameters,python,neural-network,pytorch,Python,Neural Network,Pytorch,我对使用Pytorch在自定义神经网络中定义L权重感兴趣 如果L已知,则逐个定义它们不是问题,但如果L未知,则我希望使用for循环来定义它们。我的想法是做这样的事情(不起作用) 这样做应该是这样的(相反,它可以工作,但仅限于特定数量的权重): 在我尝试做的事情中,有一个问题是Pytorch只识别字符串“namew”,而不是“namew”的“动态”字符串。因此,只定义了1个权重,而不是L个权重 有什么方法可以解决这个问题吗?我用这行代码代替for循环解决了这个问题: self.weights =
有什么方法可以解决这个问题吗?我用这行代码代替for循环解决了这个问题:
self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])
实现这一点的最佳方法是使用
参数dict
或模块dict
(对于nn.module
层):
也许值得从这里开始:你能为你的
forward
方法添加代码,这样我们就可以看到权重是如何使用的吗?谢谢,我已经解决了我在答案中所写代码行的问题。我是在看你分享的问题时想到这个主意的。我还为未来的观众提供了一个答案,因为我认为这是一个不错的问题。请注意,如果需要,您可以使用ParameterDict
为每组参数指定名称。再次感谢您,因为您可以指定名称,所以这样看起来更好。
class Network(nn.Module):
def __init__(self, ):
super(Network, self).__init__()
self.nl = nn.ReLU()
self.weight1 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
self.weight2 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
self.weight3 = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.nl = nn.ReLU()
# define some nn.module layers
self.layers = nn.ModuleDict()
for i in range(L):
self.layers("layer{}".format(i) = torch.nn.Linear(i-1,i)
# define some non-module layers
self.weights = torch.nn.ParameterDict()
for i in range(L):
self.weights["weights{}".format(i)] = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)