pytorch基本操作 | 您所在的位置:网站首页 › pytorch基本操作考察 › pytorch基本操作 |
1.用pytorch进行操作时,需要提前将数据转换为tensor(张量)的格式,tensor(张量)格式是pytorch底层所支持的格式。 2.学习一个框架不要去看基础操作,看了基础的也会忘记,也背不过,不如直接看一个例子,一步步去走,遇到不会用的地方去查。 3.框架最厉害的就是把反向传播都计算好了。 pytorch中的add_module函数 - 蒙面的普罗米修斯 - 博客园 (cnblogs.com) 在自定义网络的时候,由于自定义变量不是Module类型(例如,我们用List封装了几个网络),所以pytorch不会自动注册网络模块。add_module函数用来为网络添加模块的,所以我们可以使用这个函数手动添加自定义的网络模块。当然,这种情况,我们也可以使用ModuleList来封装自定义模块,pytorch就会自动注册了。 add_module函数是在自定义网络添加子模块,例如,当我们自定义一个网络的过程中,我们既可以 (1)通过self.module=xxx_module的方式(如下面第3行代码),添加网络模块; (2)通过add_module函数对网络中添加模块。 (3)通过用nn.Sequential对模块进行封装等等 class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.layers = nn.Linear(28*28,28*28) self.add_module('layers',nn.Linear(28*28,28*28)) # 跟上面的方式等价 self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU() ) def forward(self, x): for layer in layers: x = layer(x) logits = self.linear_relu_stack(x) return logits我们实例化类,然后输出网络的模块看一下: 0 Linear(in_features=784, out_features=784, bias=True) 1 Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() )但是,有时候pytorch不会自动给我们注册模块,我们需要根据传进来的参数对网络进行初始化,例如: class NeuralNetwork(nn.Module): def __init__(self, layer_num): super(NeuralNetwork, self).__init__() self.layers = [nn.Linear(28*28,28*28) for _ in range(layer_num)] self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU() ) def forward(self, x): for layer in layers: x = layer(x) logits = self.linear_relu_stack(x) return logits我们实例化类,然后输出网络的模块看一下: 0 Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() )定义的Linear模块都不见了!而上面定义的时候,明明都定义好了了。这是因为pytorch在注册模块的时候,会查看成员的类型,如果成员变量类型是Module的子类,那么pytorch就会注册这个模块,否则就不会。而这里的self.layers是python的List类型,所以不会注册,进而实例化的时候也就不会这个部分,所以在定义之后,需要手动注册,即add_module部分,如下面所示: class NeuralNetwork(nn.Module): def __init__(self, layer_num): super(NeuralNetwork, self).__init__() self.layers = [nn.Linear(28*28,28*28) for _ in range(layer_num)] for i,layer in enumerate(self.layers): self.add_module('layer_{}'.format(i),layer) self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU() ) def forward(self, x): for layer in layers: x = layer(x) logits = self.linear_relu_stack(x) return logits此时,输出子模块 model = NeuralNetwork(4) for index,item in enumerate(model.children()): print(index,item)就会得到: output 0 Linear(in_features=784, out_features=784, bias=True) 1 Linear(in_features=784, out_features=784, bias=True) 2 Linear(in_features=784, out_features=784, bias=True) 3 Linear(in_features=784, out_features=784, bias=True) 4 Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU()上面的方法是用add_module的方式进行注册的,下面也可以采用一个Module中的List来注册,作用等同于add_module class NeuralNetwork(nn.Module): def __init__(self, layer_num): super(NeuralNetwork, self).__init__() self.layers = nn.ModuleList([nn.Linear(28*28,28*28) for _ in range(layer_num)]) self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU() ) def forward(self, x): for layer in layers: x = layer(x) logits = self.linear_relu_stack(x) return logits |
CopyRight 2018-2019 实验室设备网 版权所有 |