pytorch 模型容器 - 模块化构建深度学习网络

pytorch 模型容器 - 模块化构建深度学习网络


pytorch 模型容器总结

pytorch 提供的模型容器包括:
nn.Sequential:按顺序包含多个网络层
nn.ModuleList:类似列表(list)的形式包含多个网络层
nn.ModuleDict:类似字典(dict)的形式包含多个网络层


一、nn.Sequential

nn.Sequential中的模块按顺序排列,输入数据从第一个block输入,依次经过后续的block后得到输出结果
代码示例:

class Net(nn.Module):
    def __init__(self):
        super(CoarseNet_v1, self).__init__()
        self.seq1=nn.Sequential(
            nn.Conv2d(16,32,3,1),
            Block1(32, 32),
            nn.ReLU(inplace=True)
        )
        # Block1为自定义模块
    def forward(self,inputs)
    	output=self.seq1(inputs)  # 这样用一行代码就可以实现网络的前向传输
    	return output

这样在定义前向传播时要便捷很多,但是 nn.Sequential 内部模块执行的顺序是固定的,这是应用时存在的不便之处。

二、nn.ModuleList

nn.ModuleList中的模块以列表的形式进行存储,在使用时,可以采用列表索引的形式实现模块的引用
代码示例:

class NetList(nn.Module):
    def __init__(self):
        super(NetList, self).__init__()
        self.list1=nn.ModuleList(
            [
            nn.Conv2d(16, 32,3,1),
            Block1(32, 32),
            nn.Conv2d(32, 64, 3, 1),
            nn.Conv2d(96, 64, 3, 1),
            Block2(64, 32),
            ]
        )
        # Block1 和 Block2 是自定义模块
   def forward(self,inputs):
   		x= self.list1[0](inputs)  # 这里引用了nn.Conv2d(16,32,3,1)
   		x1= self.list1[1](x)   # 这里引用了Block1(32, 64)
   		x2= self.list1[2](x)   # 这里引用了 nn.Conv2d(32, 64, 3, 1)
   		x3=torch.cat((x1,x2),1) 
			x4=self.list1[3](x3) # 这里引用了 nn.Conv2d(96, 64, 3, 1)
			x5=self.list1[4](x4) # 这里引用了 Block2(64, 32)	

使用ModuleList对模块进行包装,可以实现List内模块的索引,灵活性要好一些。但是也存在一定的问题,但模块数增加的时候,没有对应的注释,程序将会变得不方便阅读,List结构也不利于后续的修改。

三、nn.ModuleDict

nn.ModuleDict中的模块以字典的形式进行存储,在使用时,可以采用字典键值索引的形式实现模块的引用

代码示例:

class NetDict(nn.Module):
    def __init__(self):
        super(NetDict, self).__init__()
        self.net1=nn.ModuleDict({
            'block11':Block1(1, 32),
            'downsample11':ConvLRelu(32, 32, 2, 1),
            'block12':Block2(32, 64),
            'downsample12': ConvLRelu(64, 64, 2, 1),
            "block13": ConvLRelu(64, 128),
            "block21": Block2(1, 32),
            "downsample21":ConvLRelu(32, 32, 2, 2),
            "block22":Block2(32, 64),
            "downsample22":ConvLRelu(64, 64, 2, 2),
            'block23':Block2(64, 128),
        })
        self.net2 = nn.ModuleDict({
            'block_r1' : Block1(128, 128),
            'deconv1' : DeConvLRelu(128, 128),
            'block_r2' : Block1(128, 64),
            'deconv2' : DeConvLRelu(64, 32),
            'clr' :ConvLRelu(64, 32, 1, 1)
             })
        # Block1,Block2 为自定义模块
    def forward(self, inputs, testflag=0):
   		 # net1 部分
        x11 = self.net1['block11'](inputs)
        x21 = self.net1["block21"](inputs)
        xd11 = self.net1['downsample11'](x11)
        xd21 = self.net1['downsample21'](x21)
        x12 = self.net1['block12'](xd11)
        x22 = self.net1['block22'](xd21)
        xd12 = self.net1['downsample12'](x12)
        xd22 = self.net1['downsample22'](x22)
        
        x_cat = torch.cat((xd12 , xd22 ), 1) 
        # net2 部分
        xr1 = self.net2['block_r1'](x_cat) # 128 
        xdc1 = self.net2['deconv1'](x12) # 128
        xadd=torch.add(xr1,xdc1 )
        xr2 = self.net1['block_r2'](xadd)
        xdc2 = self.net1['deconv2'](xr2)
        output= self.net1['clr'](xdc2 )
        return output
        

使用ModuleDict对模块进行包装,可以实现Dict内模块的索引,在定义前向时,可以使用键值索引,灵活性好,也使得程序可读性较好。

后记

使用pytorch 模型容器,主要是考虑对整个网络进行其他操作,所以将网络模块包装起来,方便操作。最近运行一个模型较大,考虑采用模型并行,需要将模型拆开到两个GPU上运行,逐个对网络进行GPU位置的设置比较麻烦,使用容器的话便能很方便地实现网络模块GPU位置的设定。
使用多显卡加速网络训练(数据并行和模型并行)可参考:

B站链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch是一个用于机器学习和深度学习的开源框架,可以用于建立和训练神经网络。在二分类任务中,通常有两个文件夹,每个文件夹分别包含属于两个不同类别的数据。 要实现二分类任务,首先需要导入Pytorch库,并使用它提供的函数和类。然后,我们需要加载和处理数据集。可以使用Pytorch的DataLoader类从文件夹中加载图像数据,并进行预处理操作,如缩放、裁剪和归一化。这样可以确保数据具有相同的尺寸和数值范围,方便神经网络的训练。 接下来,我们需要定义自己的神经网络模型。可以使用Pytorch的nn.Module类创建一个自定义模型,并定义其结构、网络层和参数。常用的二分类模型包括卷积神经网络(CNN)和全连接神经网络(FCN)等。 在模型定义好之后,我们需要选择一个合适的损失函数和优化器。对于二分类任务,常用的损失函数是交叉熵损失函数(CrossEntropyLoss)。优化器可以选择Adam、SGD等常用的优化器,用于更新神经网络的参数。 接下来,我们可以进行模型的训练和评估。通过将训练数据传入模型,计算损失值,然后反向传播更新参数,不断迭代训练,使得模型逐渐收敛。在训练过程中,可以使用验证集来评估模型的性能,并对超参数进行调整,以获得更好的性能。 最后,对于新的输入数据,可以使用训练好的模型进行预测。将输入数据传入模型,得到预测结果,并根据预测结果进行相应的后续处理。 总之,Pytorch提供了一套强大的工具来进行二分类任务。通过加载和处理数据、定义神经网络模型、选择损失函数和优化器,以及进行训练和评估,我们可以利用Pytorch来实现高效准确的二分类任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值