from paddle import fluid import numpy as np from paddle.fluid.dygraph.base import to_variable from paddle.fluid import dygraph as dygraph from paddle.fluid.dygraph import BatchNorm, Conv2D, Sequential, Pool2D from paddle.fluid.layers import relu class BasicBlock(dygraph.Layer): def __init__(self, in_channels, out_channels, stride=1): super(BasicBlock, self).__init__() self.conv1 = Conv2D(in_channels, out_channels, filter_size=3, stride=stride, padding=1) self.bn1 = BatchNorm(out_channels, act='relu') self.conv2 = Conv2D(out_channels, out_channels, filter_size=3, padding=1) self.bn2 = BatchNorm(out_channels) if in_channels != out_channels or stride != 1: self.shortcut = Conv2D(in_channels, out_channels, filter_size=1, stride=stride) self.bn3 = BatchNorm(out_channels) else: self.shortcut = None def forward(self, x): residual = x x = self.bn1(self.conv1(x)) x = self.bn2(self.conv2(x)) if self.shortcut: residual = self.bn3(self.shortcut(residual)) return relu(x + residual) class Resnet18(dygraph.Layer): def __init__(self): super(Resnet18, self).__init__() self.inplanes = [64, 128, 256, 512] self.blocknums = [2, 2, 2, 2] self.stride = [1, 2, 2, 2] self.FirstConv = Conv2D(3, 64, filter_size=7, stride=2, padding=3) self.Pool = Pool2D(pool_type='max', pool_size=3, pool_stride=2, pool_padding=1) self.block1 = self.add_layer(0, self.blocknums[0], self.inplanes[0], self.inplanes[0], self.stride[0]) self.block2 = self.add_layer(1, self.blocknums[1], self.inplanes[0], self.inplanes[1], self.stride[1]) self.block3 = self.add_layer(2, self.blocknums[2], self.inplanes[1], self.inplanes[2], self.stride[2]) self.block4 = self.add_layer(3, self.blocknums[3], self.inplanes[2], self.inplanes[3], self.stride[3]) self.globalPool = Pool2D(pool_type='avg', global_pooling=True) def add_layer(self, block_index, block_repeats, in_channels, out_channels, stride=1): blocklist = Sequential() blocklist.add_sublayer('Block{}_{}'.format(block_index, 0), BasicBlock(in_channels, out_channels, stride)) for num in range(1, block_repeats): blocklist.add_sublayer('Block{}_{}'.format(block_index, num), BasicBlock(out_channels, out_channels)) return blocklist def forward(self, x): x = self.FirstConv(x) x = self.Pool(x) x = self.block1(x) x = self.block2(x) x = self.block3(x) x = self.block4(x) return self.globalPool(x) with fluid.dygraph.guard(): x = np.random.randn(5, 3, 224, 224).astype('float32') x = to_variable(x) net = Resnet18() out = net(x) print(out.shape)