pytorch进行自由模型构建(以残差模块为例)

构建darknet53网络

1、首先定义残差网络模块
class BasicBlock(nn.Module):	#继承自nn.module模块
    def __init__(self, inplanes, planes):
        super(BasicBlock, self).__init__()
        self.conv1  = nn.Conv2d(inplanes, planes[0], kernel_size=1, stride=1, padding=0, bias=False)
        self.bn1    = nn.BatchNorm2d(planes[0])
        self.relu1  = nn.LeakyReLU(0.1)
        
        self.conv2  = nn.Conv2d(planes[0], planes[1], kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2    = nn.BatchNorm2d(planes[1])
        self.relu2  = nn.LeakyReLU(0.1)

    def forward(self, x):
        residual = x

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu1(out)

        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu2(out)

        out += residual  # 相比于正常的定义网络就是这里加入了一部跳连接
        return out

以上定义出了一个继承自module类的BasicBlock网络层

2、然后搭建darknet网络主体
lass DarkNet(nn.Module): #网络同样继承自Module
    def __init__(self, layers):
        super(DarkNet, self).__init__()
        
        self.inplanes = 32
        self.conv1  = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1    = nn.BatchNorm2d(self.inplanes)
        self.relu1  = nn.LeakyReLU(0.1)

       
        self.layer1 = self._make_layer([32, 64], layers[0])  		#  self._make_layer是这里自定的包含残差网络的网络模块 416,416,32 -> 208,208,64
        self.layer2 = self._make_layer([64, 128], layers[1])        # 208,208,64 -> 104,104,128
        self.layer3 = self._make_layer([128, 256], layers[2]) 		# 104,104,128 -> 52,52,256
        self.layer4 = self._make_layer([256, 512], layers[3])        # 52,52,256 -> 26,26,512
        self.layer5 = self._make_layer([512, 1024], layers[4])        # 26,26,512 -> 13,13,1024
        ........
        
    def _make_layer(self, planes, blocks): 			#这个函数自定义构造残差网络模块
        layers = []
		# 在一个列表中创建网络层,每个元素有两个子元素,第一个是网络名,第二个是torch.nn.modules.conv.Conv2d格式的网络层,append摞起来就行
        # 下采样,步长为2,卷积核大小为3
        layers.append(("ds_conv", nn.Conv2d(self.inplanes, planes[1], kernel_size=3, stride=2, padding=1, bias=False)))  
        layers.append(("ds_bn", nn.BatchNorm2d(planes[1])))
        layers.append(("ds_relu", nn.LeakyReLU(0.1)))


        # 加入残差结构
        self.inplanes = planes[1]
        for i in range(0, blocks):
            layers.append(("residual_{}".format(i), BasicBlock(self.inplanes, planes))) 	#这里也是一个名+一个网络层,继续往layer列表里添加
        return nn.Sequential(OrderedDict(layers)) 		#最后通过OrderDict函数将封装好各网络层的layer列表转换成collections.OrderedDict变量,最终再使用nn.Sequential函数将其转换成torch.nn.modules.container.Sequential,变为module类网络,供后续使用
        
    def forward(self, x):  # 定义前向传播
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu1(x)

        x = self.layer1(x)
        x = self.layer2(x)
        out3 = self.layer3(x)
        out4 = self.layer4(out3)
        out5 = self.layer5(out4)

        return out3, out4, out5
     
# 最后,实例化darknet网络        
def darknet53():
    model = DarkNet([1, 2, 8, 8, 4])
    return model
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
残差模块的代码如下所示: ```python class ResidualBlock(torch.nn.Module): def __init__(self, channels): super(ResidualBlock, self).__init__() self.channels = channels self.conv1 = torch.nn.Conv2d(channels, channels, kernel_size=3, padding=1) self.conv2 = torch.nn.Conv2d(channels, channels, kernel_size=3, padding=1) def forward(self, x): y = F.relu(self.conv1(x)) y = self.conv2(y) return F.relu(x + y) ``` 这个代码定义了一个继承自`torch.nn.Module`的`ResidualBlock`类。在初始化函数中,它接受一个`channels`参数,用于指定输入和输出的通道数。然后,它定义了两个卷积层`conv1`和`conv2`,它们都使用3x3的卷积核和1的padding。在前向传播函数中,输入通过第一个卷积层和ReLU激活函数后,再经过第二个卷积层。最后,将输入和输出相加,并通过ReLU激活函数输出。 这个残差模块可以用于构建深度神经网络,如麦田怪圈中的网络模型。 #### 引用[.reference_title] - *1* *2* [PyTorch实现简单的残差网络](https://blog.csdn.net/weixin_43821559/article/details/123384077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [pytorch进行自由模型构建(以残差模块为例)](https://blog.csdn.net/weixin_44456198/article/details/127574393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值