pytorch基本操作

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值