PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
import torch import torch.nn as nn import torchvision import numpy as np print ( "PyTorch Version: " ,torch.__version__) print ( "Torchvision Version: " ,torchvision.__version__) __all__ = [ 'ResNet50' , 'ResNet101' , 'ResNet152' ] def Conv1(in_planes, places, stride = 2 ): return nn.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 ) ) class Bottleneck(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), ) if self .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 ) def forward( self , x): residual = x out = self .bottleneck(x) if self .downsampling: residual = self .downsample(x) out + = residual out = self .relu(out) return out class ResNet(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) for m in self .modules(): if isinstance (m, nn.Conv2d): nn.init.kaiming_normal_(m.weight, mode = 'fan_out' , nonlinearity = 'relu' ) elif isinstance (m, nn.BatchNorm2d): nn.init.constant_(m.weight, 1 ) nn.init.constant_(m.bias, 0 ) def make_layer( self , in_places, places, block, stride): layers = [] layers.append(Bottleneck(in_places, places,stride, downsampling = True )) for i in range ( 1 , block): layers.append(Bottleneck(places * self .expansion, places)) return nn.Sequential( * layers) def forward( 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) return x def ResNet50(): return ResNet([ 3 , 4 , 6 , 3 ]) def ResNet101(): return ResNet([ 3 , 4 , 23 , 3 ]) def ResNet152(): return ResNet([ 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示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/shanglianlm/article/details/86376627