使用GoogleNet训练Fashion_mnist
GoogLeNet简介
GoogLeNet是2014年提出的一种全新的深度学习结构,在这之前的AlexNet、VGG、NIN等结构都通过增大网络深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception从另一种角度来提升训练结果:在相同的计算量下能提取到更多的特征,从而提升性能。
- GoogLeNet 由Inception基础块组成
- Inception块相当于一个有4条子线路的小网络,它通过不同的filter卷积层和最大池化层来并行抽取信息,并使用1X1卷积层减少通道数从而降低模型复杂度.
- 可以自定义的超参数是每个层的输出通道数没我们以此来控制模型的复杂度.
Inception块
Inception块由四条并行路径组成。 前三条路径使用窗口大小为 1×1 、 3×3 和 5×5 的卷积层,从不同空间大小中提取信息。 中间的两条路径在输入上执行 1×1 卷积,以减少通道数,从而降低模型的复杂性。 第四条路径使用 3×3 最大池化层,然后使用 1×1 卷积层来改变通道数。 这四条路径都使用合适的填充来使输入与输出的高和宽一致,最后我们将每条线路的输出在通道维度上连结,并构成Inception块的输出。在Inception块中,通常调整的超参数是每层输出通道的数量。
import tensorflow as tf
# Inception
class Inception(tf.keras.Model):
# 4条路径输出的通道数
def __init__(self, c1, c2, c3, c4):
super().__init__()
# 第一条
self.p1_1 = layers.Conv2D(c1, 1, activation='relu')
# 第二条
self.p2_1 = layers.Conv2D(c2[0], 1, activation='relu')
self.p2_2 = layers.Conv2D(c2[1], 3, padding='same', activation='relu')
# 第三条
self.p3_1 = layers.Conv2D(c3[0], 1, activation='relu')
self.p3_2 = layers.Conv2D(c3[1], 5, padding='same', activation='relu')
# 第四条
self.p4_1 = layers.MaxPool2D(3, 1, padding='same')
self.p4_2 = layers.Conv2D(c4, 1