PyTorch实现ResNet50、ResNet101和ResNet152示例
PyTorch:https://github.com/shanglianlm0525/PyTorch-Networks
importtorch importtorch.nnasnn importtorchvision importnumpyasnp print("PyTorchVersion:",torch.__version__) print("TorchvisionVersion:",torchvision.__version__) __all__=['ResNet50','ResNet101','ResNet152'] defConv1(in_planes,places,stride=2): returnnn.Sequential( nn.Conv2d(in_channels=in_planes,out_channels=places,kernel_size=7,stride=stride,padding=3,bias=False), nn.BatchNorm2d(places), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3,stride=2,padding=1) ) classBottleneck(nn.Module): def__init__(self,in_places,places,stride=1,downsampling=False,expansion=4): super(Bottleneck,self).__init__() self.expansion=expansion self.downsampling=downsampling self.bottleneck=nn.Sequential( nn.Conv2d(in_channels=in_places,out_channels=places,kernel_size=1,stride=1,bias=False), nn.BatchNorm2d(places), nn.ReLU(inplace=True), nn.Conv2d(in_channels=places,out_channels=places,kernel_size=3,stride=stride,padding=1,bias=False), nn.BatchNorm2d(places), nn.ReLU(inplace=True), nn.Conv2d(in_channels=places,out_channels=places*self.expansion,kernel_size=1,stride=1,bias=False), nn.BatchNorm2d(places*self.expansion), ) ifself.downsampling: self.downsample=nn.Sequential( nn.Conv2d(in_channels=in_places,out_channels=places*self.expansion,kernel_size=1,stride=stride,bias=False), nn.BatchNorm2d(places*self.expansion) ) self.relu=nn.ReLU(inplace=True) defforward(self,x): residual=x out=self.bottleneck(x) ifself.downsampling: residual=self.downsample(x) out+=residual out=self.relu(out) returnout classResNet(nn.Module): def__init__(self,blocks,num_classes=1000,expansion=4): super(ResNet,self).__init__() self.expansion=expansion self.conv1=Conv1(in_planes=3,places=64) self.layer1=self.make_layer(in_places=64,places=64,block=blocks[0],stride=1) self.layer2=self.make_layer(in_places=256,places=128,block=blocks[1],stride=2) self.layer3=self.make_layer(in_places=512,places=256,block=blocks[2],stride=2) self.layer4=self.make_layer(in_places=1024,places=512,block=blocks[3],stride=2) self.avgpool=nn.AvgPool2d(7,stride=1) self.fc=nn.Linear(2048,num_classes) forminself.modules(): ifisinstance(m,nn.Conv2d): nn.init.kaiming_normal_(m.weight,mode='fan_out',nonlinearity='relu') elifisinstance(m,nn.BatchNorm2d): nn.init.constant_(m.weight,1) nn.init.constant_(m.bias,0) defmake_layer(self,in_places,places,block,stride): layers=[] layers.append(Bottleneck(in_places,places,stride,downsampling=True)) foriinrange(1,block): layers.append(Bottleneck(places*self.expansion,places)) returnnn.Sequential(*layers) defforward(self,x): x=self.conv1(x) x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) x=self.layer4(x) x=self.avgpool(x) x=x.view(x.size(0),-1) x=self.fc(x) returnx defResNet50(): returnResNet([3,4,6,3]) defResNet101(): returnResNet([3,4,23,3]) defResNet152(): returnResNet([3,8,36,3]) if__name__=='__main__': #model=torchvision.models.resnet50() model=ResNet50() print(model) input=torch.randn(1,3,224,224) out=model(input) print(out.shape)
以上这篇PyTorch实现ResNet50、ResNet101和ResNet152示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。