pytorch based
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, in_planes, planes, stride=1):
super(Bottleneck, self).__init__()
self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
self.conv3 = nn.Conv2d(planes, self.expansion*planes, kernel_size=1, bias=False)
self.bn3 = nn.BatchNorm2d(self.expansion*planes)
self.shortcut = nn.Sequential()
if stride != 1 or in_planes != self.expansion*planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(self.expansion*planes)
)
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = F.relu(self.bn2(self.conv2(out)))
out = self.bn3(self.conv3(out))
out += self.shortcut(x)
out = F.relu(out)
return out
My TensorFlow implementation
input_shape = (28,28,1)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(28, kernel_size = (1,1), bias_constraint=None))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(28, kernel_size = (3,3), strides = 1, bias_constraint=None))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Conv2D(28, kernel_size = (1,1), strides = 1, bias_constraint=None))
model.add(tf.keras.layers.BatchNormalization(4))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10,activation=tf.nn.softmax))
Do I need to change something in my implementation?