pytorch基本操作 您所在的位置:网站首页 pytorch基本操作考察 pytorch基本操作

pytorch基本操作

2023-08-30 08:49| 来源: 网络整理| 查看: 265

1.用pytorch进行操作时,需要提前将数据转换为tensor(张量)的格式,tensor(张量)格式是pytorch底层所支持的格式。

2.学习一个框架不要去看基础操作,看了基础的也会忘记,也背不过,不如直接看一个例子,一步步去走,遇到不会用的地方去查。

3.框架最厉害的就是把反向传播都计算好了。

1.001^{365}1.001^{365}

pytorch的add_model函数的作用

pytorch中的add_module函数 - 蒙面的普罗米修斯 - 博客园 (cnblogs.com)icon-default.png?t=M85Bhttps://www.cnblogs.com/datasnail/p/14903643.html自定义网络中add_module的作用:

        在自定义网络的时候,由于自定义变量不是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 实验室设备网 版权所有