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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。