先学习下如何自己完成一个resnet网络用于cifar100训练,后面在使用迁移学习训练。
如果不知道resnet具体的网络结构可以自己学习下,这里只进行实现。
1. BasicBlock实现
BasicBlock首先是继承layer.Layer
class BasicBlock(layers.Layer):
然后重写里面的init和call方法。
1)先在init定义Basic中的基础操作,由上图我们知道,就是两个Conv2D,如果第1个conv下采样了,第二个就不进行下采样。
这里的下采样指的是stride不等于1的情况。这里每个conv后,有个batchnormal操作,bn操作是会训练一个α和β参数的,
如果不是要共享权值,最好定义两个self.bn{$(num)}
。relu层是没有训练的参数的,可以使用相同的,但是为了可以
更清晰的了解网络结构,建议分别定义。
def __init__(self,filter_num,stride):
super(BasicBlock,self).__init__()
self.conv1=layers.Conv2D(filter_num,kernel_size=(3,3),strides=stride,padding='same')
self.bn1=layers.BatchNormalization()
self.relu1=layers.Activation('relu')
self.cov2=layers.Conv2D(filter_num,kernel_size=(3,3),strides=1,padding='same')
self.bn2=layers.BatchNormalization()
self.relu2=layers.Activation('relu')
if stride % 2 != 0:
self.downsample=lambda x:x
else:
self.downsample=Sequential()