这个网络在2014年的ImageNet Large Scale Visual Recognition Challenge 中获得了第二名的好成绩,并且同第一名 Google Net 差距很小,所以需要熟练掌握
图像来源
https://www.bilibili.com/video/BV155411t7ad?p=86
01:52 截图
这里还是要说一下输入的图片大小 2242243 采用 两层大小为33的卷积核 每一层64个卷积核,并且设定 padding = 1 使得输出大小不变
激活函数为 ReLU
进行MaxPooling操作 使用的是VGG独特的22的池化单元,个数为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
加油,加油,加油!