首页 > 编程知识 正文

python残差神经网络,resnet网络结构详解

时间:2023-05-06 07:58:13 阅读:32222 作者:1757

resnet50是何凯明提出的能够有效解决深网络退化问题的结构之一,它将输入的多重非线性变化拟合变为输入和输出拟合的残差,变为恒等映射,50即50阶

巨神崇拜: https://github.com/KaimingHe

2 .基础框架将block分为两类,block1适用于resnet34以下。 只有双层结构。 应该注意的是,至少应该保证两层,在只有一层的情况下,即

out=f(x,w i ) x=wIxbxout=f ) x,w_i ) x=w_ix b x out=F(x ) x,w i ) x=wi x b x仍然是线性关系

block2结构为三层,加入了一个缩放操作。 具体结构如图所示

跨层次链接时,往往存在维,存在大小不一致的现象。 此时,通常有两种方法。 一个是补零的方法,另一个是用1x1的卷积核缩放,然后应用表达式就可以了

输出=[支持输入核的边长2padIngstrIde (步长) 1输出=(FRAC )输入-支持比对的边长2*padding )=[=[stride步长] 1输出=[stride支持输入比对的边长

通常,深度的倍数和大小的缩小倍数一致

3 .构想代码根据框架编写了代码,但没有经过测试,所以不保证代码完全没有错误~~http://www.Sina.com/

class Conv_b

lock(nn.Module): def __init__(self,in_channels,require_channels): super().__init__() if in_channels!=require_channels: self.downscale=require_channels/in_channels self.residual=nn.Sequential( nn.Conv2d(in_channels,require_channels,kernel_size=1,stride=self.downscale), nn.BatchNorm2d(require_channels), nn.ReLU(), nn.Conv2d(require_channels,require_channels,kernel_size=3), nn.BatchNorm2d(require_channels), nn.ReLU(), nn.Conv2d(require_channels,require_channels*4,kernel_size=3), nn.BatchNorm2d(require_channels*4), nn.ReLU(), ) if self.downscale==4: self.cut=nn.Sequential() else: self.cut=nn.Sequential(nn.Conv2d(in_channels,require_channels*4,kernel_size=1,stride=self.downscale)) def forward(self,x): return nn.ReLU(self.residual(x)+self.cut(x))

resnet50:

class Resnet(nn.Module): def __init(self,num_classes): super().__init__() self.downscale=1 self.con1=nn.Sequential( nn.Conv2d(3,64,kernel_size=7,stride=2), nn.MaxPool2d(64,64,kernel_size=3,stride=2), nn.BatchNorm2d(64), nn.ReLU(), ) self.layer1=self._layers(64,64,3) self.layer2=self._layers(64*4,128,4) self.layer3=self._layers(128*4,256,6) self.layer4=self._layers(256*4,512,3) self.classifier=nn.Sequential( nn.AdaptiveAvgPool2d(num_classes*4), nn.AdaptiveAvgPool2d(num_classes), nn.Softmax() ) def _layers(self,in_channels,require_channels,num_blocks): layers=[] for i in range(num_blocks): layers.append(Conv_block(in_channels,require_channels)) in_channels=require_channels*4 return nn.Sequential(*layers) def forward(self,x): con1=self.con1(x) l1=self.layer1(con1) l2=self.layer2(l1) l3=self.layer3(l2) l4=self.layer4(l3) y=self.classifier(l4) return y

如果希望自己训练的话,也可以写个训练模块试试

def optim(self,type,lr): param=self.parameters() if type=='Adam': self.optimizer=torch.optim.Adam(param,lr) def define_loss(self,type): if type=='CrossEntropyLoss': self.loss=nn.CrossEntropyLoss() #封装成tensordataset def train(self,train_loader,epochs,gpu=False,optim,lr,loss): self.optim(optim,lr) self.define_loss(loss) batches=len(train_loader) for epoch in range(1,epochs+1): for batch,(data,target) in enumerate(train_loader): lr_rate=lr*(1-epoch/epochs)*(batch/batches) for params in self.optimizer.param_groups: params['lr']=lr_rate if gpu==True: data,target=data.cuda(),target.cuda() out=self.forward(data) total_loss=self.loss(out,target) self.optimizer.zero_grad() total_loss.backward() self.optimizer.step() #每十个batch,打印一次epoch,batch,loss,lr if batch%10==0: print('Epoch:{}/{},batch:{},loss:{},lr:{}' .format(epoch,epochs,batch,total_loss,lr_rate))

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。