pytorch-查看网络模型

1、print(model)

import torch


class MyNet(torch.nn.Module):
    def __init__(self):
        # 必须调用父类的构造函数,因为想要使用父类的方法,这也是继承Module的目的
        super(MyNet, self).__init__()
        self.conv1 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.relu1 = torch.nn.ReLU()
        self.max_pooling1 = torch.nn.MaxPool2d(2, 1)
        self.conv2 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.relu2 = torch.nn.ReLU()
        self.max_pooling2 = torch.nn.MaxPool2d(2, 1)
        self.dense1 = torch.nn.Linear(32 * 3 * 3, 128)
        self.dense2 = torch.nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu1(x)
        x = self.max_pooling1(x)
        x = self.conv2(x)
        x = self.relu2(x)
        x = self.max_pooling2(x)
        x = self.dense1(x)
        x = self.dense2(x)
        return x

model = MyNet()
print(model)
'''运行结果为:
MyNet(
  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu1): ReLU()
  (max_pooling1): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
  (conv2): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu2): ReLU()
  (max_pooling2): MaxPool2d(kernel_size=2, stride=1, padding=0, dilation=1, ceil_mode=False)
  (dense1): Linear(in_features=288, out_features=128, bias=True)
  (dense2): Linear(in_features=128, out_features=10, bias=True)
)
可以看出打印模型后,显示的就是自定义类的属性,且顺序是按照定义顺序,
'''

再看一个例子

import torch
import torch.nn.functional as F


class MyNet(torch.nn.Module):
    def __init__(self):
        # 必须调用父类的构造函数,因为想要使用父类的方法,这也是继承Module的目的
        super(MyNet, self).__init__() 
        self.conv1 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.conv2 = torch.nn.Conv2d(3, 32, 3, 1, 1)
        self.dense1 = torch.nn.Linear(32 * 3 * 3, 128)
        self.dense2 = torch.nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = F.max_pool2d(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x)
        x = self.dense1(x)
        x = self.dense2(x)
        return x

model = MyNet()
print(model)
'''运行结果为:
MyNet(
  (conv1): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (dense1): Linear(in_features=288, out_features=128, bias=True)
  (dense2): Linear(in_features=128, out_features=10, bias=True)
)
可看出此种方式与上面的区别了吧,打印模型后不知道模型使用激活层,池化层等的超参数配置,没有上面方式一目了然。
'''

2、children方法

class MyNet(torch.nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        self.conv = torch.nn.Sequential(
      
               torch.nn.Conv2d(3, 32, 3, 1, 1),
               torch.nn.ReLU(),
               torch.nn.MaxPool2d(2)
                
            )

        self.dense = torch.nn.Sequential(
         
                 torch.nn.Linear(32 * 3 * 3, 128),
                 torch.nn.ReLU(),
                 torch.nn.Linear(128, 10)
            )
        

    def forward(self, x):
        conv_out = self.conv1(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out

model = MyNet()
# modules方法将整个模型的所有构成(包括包装层Sequential、单独的层、自定义层等)由浅入深依次遍历出来,直到最深处的单层
for i in model.children():
    print(i)
    print('==============================')

 

3、modules方法 

class MyNet(torch.nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        self.conv = torch.nn.Sequential(
      
               torch.nn.Conv2d(3, 32, 3, 1, 1),
               torch.nn.ReLU(),
               torch.nn.MaxPool2d(2)
                
            )

        self.dense = torch.nn.Sequential(
         
                 torch.nn.Linear(32 * 3 * 3, 128),
                 torch.nn.ReLU(),
                 torch.nn.Linear(128, 10)
            )
        

    def forward(self, x):
        conv_out = self.conv1(x)
        res = conv_out.view(conv_out.size(0), -1)
        out = self.dense(res)
        return out

model = MyNet()
# modules方法将整个模型的所有构成(包括包装层Sequential、单独的层、自定义层等)由浅入深依次遍历出来,直到最深处的单层
for i in model.modules():
    print(i)
    print('==============================')

 

 

总结:

如果想看看网络的模型长什么样
建议使用法1 也就是print(modle)

如果想修改网络 建议使用法2

class resUnet3D(nn.Module):
    def __init__(self):
        super(resUnet,self).__init__()
        self.model  = UNet3D(1, 1)
        self.encoder = nn.Sequential(*list(self.model.children())[:-2])
        print(self.encoder)
    def forward(self,x):
        y = self.encoder(x)
        return y

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值