VGG 16 的分析与实现

VGG

这个网络在2014年的ImageNet Large Scale Visual Recognition Challenge 中获得了第二名的好成绩,并且同第一名 Google Net 差距很小,所以需要熟练掌握

结构 这里分析的是VGG16 也就是C

图像来源
https://www.bilibili.com/video/BV155411t7ad?p=86
01:52 截图

其他的结构可以参考这个表VGG 16 的分析与实现_第1张图片

第一大层

这里还是要说一下输入的图片大小 2242243 采用 两层大小为33的卷积核 每一层64个卷积核,并且设定 padding = 1 使得输出大小不变
激活函数为 ReLU
进行MaxPooling操作 使用的是VGG独特的2
2的池化单元,个数为128 步长为2 将图片大小减半

第二大层

紧接着 两层 3*3卷积,同上层一样 个数变成128,紧接着ReLU,MaxPooling操作 同上

第三大层

紧接着 两层 3*3卷积,同上层一样 个数变成256,紧接着ReLU,MaxPooling操作 同上

第四大层

紧接着 两层 3*3卷积,同上层一样 个数变成512,紧接着ReLU,MaxPooling操作 同上

第五大层

紧接着 两层 3*3卷积,同上层一样 个数变成512,紧接着ReLU,MaxPooling操作 同上

第六大层

将数据拉平以后, 两层全连接神经网络,神经元个数为4096个,激活函数还是使用ReLU,机器带不动,我就增加了一个Dropout层,原文中是没有的!

最后得到了一个1000维的输出

上代码

可以参照上面的自行搭建,会更好

number = 1000
model = Sequential([
    layers.Conv2D(filters = 64, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 64, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.MaxPooling2D(pool_size=(2,2), strides=2),
    
    layers.Conv2D(filters = 128, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 128, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.MaxPooling2D(pool_size=(2,2), strides=2),
    
    layers.Conv2D(filters = 256, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 256, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 256, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.MaxPooling2D(pool_size=(2,2), strides=2),
    
    
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.MaxPooling2D(pool_size=(2,2), strides=2),
   
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.Conv2D(filters = 512, kernel_size=3, padding='SAME', strides=1),
    layers.ReLU(),
    layers.MaxPooling2D(pool_size=(2,2), strides=2),
    
    layers.Flatten(),
    layers.Dense(4096, activation='relu'),
    layers.Dropout(0.25),
    layers.Dense(4096, activation='relu'),   
    layers.Dropout(0.25),
    layers.Dense(number, activation='softmax')
])
model.build(input_shape=(None, 224, 224, 3))
model.summary()

model 建立好以后采用相应的compile 和数据预处理,然后放进去跑
训练了大概1500万个参数,耗时很久,jj
还是建议换一下小的数据集,如ciffar 10 或100

补一下 预处理

在数据,图片进行训练之前要进行预处理,现在已经不用局部归一化了,而是使用 B N Batch Normalization 和 G N group Normalization

上课听老师讲:

def normalization(x_test, x_train):  # 注意参数顺序
    x_train = x_train / 255.     #使得像素 pixel 位于 0 ~ 1 之间
    x_test = x_test / 255.
    mean = np.mean(x_train,  axis = (0,1,2,3)
    std = np.std(x_train,  axis = (0,1,2,3)    #算出训练集的均值和方差
    
    x_train = (x_train - mean )/ (std + 1e-8)
	x_test = (x_test - mean )/ (std + 1e-8) # 这是BN的公式 将其中的参数都进行了调整
	# 使用的是 0  1   就先这么用,我再看看
	return x_test, x_train

加油,加油,加油!

你可能感兴趣的:(VGG 16 的分析与实现)