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

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

1、Fashion数据集简介

不同于mnist手写字数据集那么简单,Fashion——mnist数据集包含了10个类别的图像,分别是:t-shirt(T恤),trouser(牛仔裤),pullover(套衫),dress(裙子),coat(外套),sandal(凉鞋),shirt(衬衫),sneaker(运动鞋),bag(包),ankle boot(短靴)。数据及已经被集成在keras中,通过tf.keras.datasets.fashion_mnist.load_data()就可以自动下载。

2、LeNet-5简介

LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 《Gradient-based learning applied to document
recognitionr 》中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。在 MNIST 数据集
上, LeNet-5 模型可以达到大约 99.2%的正确率。之后,随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在12年迎来了历史突破。12年之后,CNN的演化路径可以总结为四条:1)更深的网络,2)增强卷积模的功能以及上诉两种思路的融合,3)从分类到检测,4)增加新的功能模块。
下面我们就正式介绍 LeNet5网络
在这里插入图片描述
LeNet-5共有7层,每层都包含可训练的参数。输入的是一个32×32大小的图片,输入的图片比原来的图片大小(20×20,28×28)要大,这主要是因为需要检测图像的边界特征信息,比如角、点等。输入的像素都进行了归一化处理,所以白色的背景值对应于0.1,黑色的对应值为1.175,这也使得输入的平均值近似为0,方差近似为1,这样大大的加快了学习速度(原因参考一个扁形的梯度下降图和一个相对较圆的梯度下降图,不再赘述)。
下面总结 LeNet-5 模型每一层的结构。

  • 第一层: 卷积层

输入: 原始的图像像素矩阵(长、宽、色彩), 大小为 32×32×1。

卷积层参数: 过滤器尺寸为 5×5,深度为 6,不使用全 0 填充,步长为1。

输出:大小为 28×28×6。

分析:因为没有使用全 0 填充,所以这一层输出尺寸为 32-5+1=28, 深度为 6;

该卷积层共有 5×5×1×6+6=156 个参数,其中 6个为偏置项参数;

因为下一层的节点矩阵有 28×28×6=4704 个节点,每个节点和 5×5=25 个当前层节点相连,所以本层卷积层共有 4704×(25+1)=122304 个连接。

  • 第二层: 池化层

输入: 大小为 28×28×6。

池化层参数: 过滤器尺寸为 2×2,长和宽的步长均为2。

输出: 大小为 14×14×6

分析: 6 个特征图共包含 6×2=12 个可训练参数,以及 14×14×6×(2×2+1)=5880 个连接。

  • 第三层: 卷积层

输入: 大小为 14×14×6。

卷积层参数: 过滤器尺寸为 5×5,深度为 16,不使用全 0 填充,步长为1。

输出:大小为 10×10×16。

分析:因为没有使用全 0 填充,所以这一层输出尺寸为 14-5+1=10, 深度为 16;

该卷积层共有 5×5×6×16+16=2416 个参数,其中 16个为偏置项参数;

因为下一层的节点矩阵有 10×10×16=1600 个节点,每个节点和 5×5=25 个当前层节点相连,所以本层卷积层共有 1600×(25+1)=41600 个连接。

  • 第四层: 池化层

输入: 大小为 10×10×16。

池化层参数: 过滤器尺寸为 2×2,长和宽的步长均为2。

输出: 大小为 5×5×16。

分析: 16 个特征图共包含 16×2=32 个可训练参数,以及 5×5×16×(2×2+1)=2000个连接。

  • 第五层: 全连接层

输入节点个数: 5×5×16=400。

参数个数: 5×5×16×120+120=48120 。

输出节点个数: 120。

  • 第六层: 全连接层

输入节点个数: 120。

参数个数: 120×84+84=10164 。

输出节点个数: 84。

  • 第七层: 全连接层

输入节点个数: 84。

参数个数: 84×10+10=850 。

输出节点个数: 10。

3、使用tensorflow2.0实现LeNet-5网络并训练Fashion-mnist数据集

3.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

3.2 加载Fashion-mnist数据集并做预处理

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)

3.3 搭建网络

class LeNet5(Model):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5),
                         activation='sigmoid')
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2)

        self.c2 = Conv2D(filters=16, kernel_size=(5, 5),
                         activation='sigmoid')
        self.p2 = MaxPool2D(pool_size=(2, 2), strides=2)

        self.flatten = Flatten()
        self.f1 = Dense(120, activation='sigmoid')
        self.f2 = Dense(84, activation='sigmoid')
        self.f3 = Dense(10, activation='softmax')

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

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

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


model = LeNet5()

3.4装配网络

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

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

checkpoint_save_path = "./checkpoint/LeNet5.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)

3.6 开始训练

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()#打印模型结构

在这里插入图片描述

3.7 可以把权重保存到txt文件观察(可以不用写这部分)

# print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
    file.write(str(v.name) + '\n')
    file.write(str(v.shape) + '\n')
    file.write(str(v.numpy()) + '\n')
file.close()

3.8 显示训练集和验证集的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()

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tf2.0深度学习实战(三)是一本介绍如何搭建lenet-5卷积神经网络的书籍。Lenet-5是一个经典的深度学习模型,通常用于手写数字识别任务。该书籍详细介绍了如何使用TensorFlow 2.0框架来实现Lenet-5模型,从搭建模型、编写代码到模型训练和验证,全方位地指导读者进行实战。 首先,书籍介绍了Lenet-5模型的结构和原理,包括卷积层、池化层和全连接层等基本组件的构成,以及激活函数、损失函数和优化器的选择。然后,通过TensorFlow 2.0的高层API,书籍演示了如何使用keras库来构建Lenet-5模型的代码,包括定义模型结构、编译模型、设置优化器和损失函数等步骤,使读者能够快速上手。 接着,书籍详细讲解了如何使用MNIST手写数字数据集来训练和验证Lenet-5模型,包括数据预处理、模型训练和测试评估等内容。通过实际的代码演示和实验结果展示,读者可以直观地了解模型的性能和训练过程,提升对深度学习模型的理解和实践能力。 最后,书籍还介绍了如何对Lenet-5模型进行优化和改进,包括调整模型结构、改变参数配置和使用其他技巧来提升模型的性能。通过这些内容,读者可以深入理解Lenet-5模型的原理和实现细节,为之后在实际项目中应用深度学习模型打下良好的基础。整体而言,tf2.0深度学习实战(三)通过详细的讲解和实战操作,帮助读者掌握了搭建Lenet-5卷积神经网络的技能和经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值