深度学习分类任务(2):TF2.0基于fashion数据集的AlexNet神经网络搭建

TF2.0基于fashion数据集的AlexNet神经网络搭建

1、AlexNet模型简介

深度学习分类任务(2):TF2.0基于fashion数据集的AlexNet神经网络搭建_第1张图片
这张图片本来上半部分就没有,论文中就是给的这个图。

然后之所以用的上下两半一样的结构,是因为他们当时用的GPU计算力有限,所以用了两块GPU:GTX 580。现在都是2020年了,你笔记本上的GPU估计都是GTX1080了,所以下面讲的时候就当作是只用的一个GPU来分析。

AlexNet共有八层,有60M以上的参数量。

前五层为卷积层:convolutional layer;
后三层为全连接层,fully connected layer。
最后一个全连接层输出具有1000个输出的softmax。

大致的分层结构如下:
深度学习分类任务(2):TF2.0基于fashion数据集的AlexNet神经网络搭建_第2张图片

  • 第一层:

①输入图片为224x 224 x3, 表示长宽是224个像素,RGB彩色图通道为3通道,所以还要乘以3.(学界普遍认为论文中说的224不太合适,讲道理应该是227的大小才对,这也成为一个悬案),

②然后采用了96个11 x 11 x 3 的filter。在stride为4的设置下,对输入图像进行了卷积操作。所以经过这一卷积后的操作,输出就变成了55 x 55 x96 的data map。这三个数字的由来:(227-11)/ 4 + 1 = 55,96就是滤波器的个数。

③然后经过激活函数ReLu,再进行池化操作-pooling:滤波器的大小为3 x 3,步长stride为2. 所以池化后的输出为27x 27 x 96

(55-3)/ 2 + 1 =27. 96仍为原来的深度。

④LRN,局部响应归一化。后来大家都认为这个操作没有什么太大的作用,所以后面的网络几乎都没有这个操作,我也就不提了。

●其他第2、3、4、5层的计算过程类似。

●第六层:本层的输入为6 x 6 x 256,全连接层其实就是一个矩阵运算,它完成一个空间上的映射。所以把输入看成一个列向量X,维度为9216(6 x 6 x 256),也就是你可以把输入看成一个9216 x 1的矩阵。

然后和参数矩阵W相乘,参数矩阵W你此时设置为4096 x 9216

所以最后本全连接层的输出就是 矩阵相乘Y = W·X得 4096 x 1的矩阵

●第八层:第八层的输出就为1000 x 1的矩阵,即1000维度的一个列向量,对应softmax regression的1000个标签

一些创新点分析
①ReLU

RectifiedLinear Uints,修正线性单元即f(x)=max(0,x)。是一种非饱和非线性激活函数。相较于f(x)=tanh(x)和sigmoid函数:f(x)=(1+e-x)-1,这两种饱和非线性激活函数而言,SGD梯度下降的时间更快。

②Dropout

它做的就是以0.5的概率将每个隐层神经元的输出设置为零。以这种方式”droppedout”的神经元既不参与前向传播,也不参与反向传播。所以每次提出一个输入,该神经网络就尝试一个不同的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。正因如此,要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。前两个全连接层使用dropout。如果没有dropout,我们的网络会表现出大量的过拟合。dropout使收敛所需的迭代次数大致增加了一倍。

③数据扩充

一般的观点认为神经网络是靠足够多的数据训练出来的。增加海量的数据,在一定程度上能提升算法准确率。当数据有限时,可以通过已有的数据做一定的变换生成新的数据,进而扩充数据量。

用到了三种数据变换方式:

A: 平移变换(crop) 从256×256的图像中提取随机的224×224的小块:

四个边角和中心区域共5个

B:反射变换(flip) 把A中的5张图进行水平反转

C:光照和彩色变换

④重叠池化

一个pooling层可以被认为是由间隔s像素的pooling单元网格组成,每个网格总结出一个z×z大小的邻近关系,都位于pooling单元的中心位置。若设s=z,我们得到传统的局部pooling,正如常用于CNN中的那样。若设s

⑤LRN局部响应归一化

后来加入到DL研究工作中的大佬们说这个LRN设计有点搞笑,而且用处其实不大,所以我直接就忽略。

2、使用tensorflow2.0实现AlexNet网络并训练Fashion-mnist数据集

关于Fashion-mnist数据集的简介轻餐开前一篇文章《深度学习分类任务(1):TF2.0基于fashion数据集的LeNet神经网络搭建》

2.1 准备数据集

import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model

np.set_printoptions(threshold=np.inf)

fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
print("x_train.shape", x_train.shape)
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)  # 给数据增加一个维度,使数据和网络结构匹配
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
print("x_train.shape", x_train.shape)

2.2 搭建网络

class AlexNet8(Model):
    def __init__(self):
        super(AlexNet8, self).__init__()
        self.c1 = Conv2D(filters=96, kernel_size=(3, 3))
        self.b1 = BatchNormalization()
        self.a1 = Activation('relu')
        self.p1 = MaxPool2D(pool_size=(3, 3), strides=2)

        self.c2 = Conv2D(filters=256, kernel_size=(3, 3))
        self.b2 = BatchNormalization()
        self.a2 = Activation('relu')
        self.p2 = MaxPool2D(pool_size=(3, 3), strides=2)

        self.c3 = Conv2D(filters=384, kernel_size=(3, 3), padding='same',
                         activation='relu')

        self.c4 = Conv2D(filters=384, kernel_size=(3, 3), padding='same',
                         activation='relu')

        self.c5 = Conv2D(filters=256, kernel_size=(3, 3), padding='same',
                         activation='relu')
        self.p3 = MaxPool2D(pool_size=(3, 3), strides=2)

        self.flatten = Flatten()
        self.f1 = Dense(2048, activation='relu')
        self.d1 = Dropout(0.5)
        self.f2 = Dense(2048, activation='relu')
        self.d2 = Dropout(0.5)
        self.f3 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)

        x = self.c2(x)
        x = self.b2(x)
        x = self.a2(x)
        x = self.p2(x)

        x = self.c3(x)

        x = self.c4(x)

        x = self.c5(x)
        x = self.p3(x)

        x = self.flatten(x)
        x = self.f1(x)
        x = self.d1(x)
        x = self.f2(x)
        x = self.d2(x)
        y = self.f3(x)
        return y


model = AlexNet8()

2.3装配网络

odel.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

2.4 设置权重文件保存路径和callback

checkpoint_save_path = "./checkpoint/AlexNet8.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
    print('-------------load the model-----------------')
    model.load_weights(checkpoint_save_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                 save_weights_only=True,
                                                 save_best_only=True)

2.5 开始训练

history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                    callbacks=[cp_callback])
model.summary()

深度学习分类任务(2):TF2.0基于fashion数据集的AlexNet神经网络搭建_第3张图片

2.6 显示训练集和验证集的acc和loss曲线

acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

深度学习分类任务(2):TF2.0基于fashion数据集的AlexNet神经网络搭建_第4张图片

你可能感兴趣的:(TF2.0图像分类,深度学习,神经网络)