用 for 循环定义 nn.parameters
Define nn.parameters with a for loop
我有兴趣使用 Pytorch 在自定义神经网络中定义 L 个权重。
如果L是已知的,那么一个一个定义它们不是问题,但如果L是未知的,我想使用for循环来定义它们。我的想法是做这样的事情(这是行不通的)
class Network(nn.Module):
def __init__(self, ):
super(Network, self).__init__()
self.nl = nn.ReLU()
for i in range(L):
namew = 'weight'+str(i)
self.namew = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
这应该做这样的事情(虽然有效但仅限于特定数量的权重):
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)
在我尝试做的事情中,存在一个问题,即 Pytorch 只识别字符串 'namew',而不是 'namew' 的“动态”字符串。因此,只定义了 1 个权重,而不是 L 个权重。
有什么办法可以解决这个问题吗?
我用这行代码解决了问题,代替了 for 循环:
self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])
完成此操作的最佳方法您可以使用 ParameterDict
或 ModuleDict
(对于 nn.module
层)来完成此操作:
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)
我有兴趣使用 Pytorch 在自定义神经网络中定义 L 个权重。
如果L是已知的,那么一个一个定义它们不是问题,但如果L是未知的,我想使用for循环来定义它们。我的想法是做这样的事情(这是行不通的)
class Network(nn.Module):
def __init__(self, ):
super(Network, self).__init__()
self.nl = nn.ReLU()
for i in range(L):
namew = 'weight'+str(i)
self.namew = torch.nn.Parameter(data=torch.Tensor(2,2), requires_grad=True)
这应该做这样的事情(虽然有效但仅限于特定数量的权重):
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)
在我尝试做的事情中,存在一个问题,即 Pytorch 只识别字符串 'namew',而不是 'namew' 的“动态”字符串。因此,只定义了 1 个权重,而不是 L 个权重。
有什么办法可以解决这个问题吗?
我用这行代码解决了问题,代替了 for 循环:
self.weights = nn.ParameterList([nn.Parameter(torch.randn(2, 2)) for i in range(L)])
完成此操作的最佳方法您可以使用 ParameterDict
或 ModuleDict
(对于 nn.module
层)来完成此操作:
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)