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?