深度学习之基于LeNet-5实现cifar10的识别

Cifar10是一个封装好的数据集,里面包括10中类别的事物。而LeNet-5是最先提出来的卷积神经网络,在之前的学习中,我们并没有利用LeNet-5网络进行分类,本次实验我们来看一下基于Lenet-5对cifar10分类的效果。

1.导入库

import tensorflow as tf
import numpy as np
import os,PIL
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import datasets,layers,models

2.数据处理

(train_images,train_labels),(test_images,test_labels) = tf.keras.datasets.cifar10.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0#归一化

all_labels_name = ['airplane', 'automobile', 'bird', 'cat', 'deer','dog', 'frog', 'horse', 'ship', 'truck']
train_db = tf.data.Dataset.from_tensor_slices((train_images,train_labels))
train_db = train_db.shuffle(1000).batch(batch_sizes)
test_db = tf.data.Dataset.from_tensor_slices((test_images,test_labels))
test_db = test_db.batch(batch_sizes)

参数设置

batch_sizes = 128
epochs = 50

数据如下所示:
在这里插入图片描述

3.LeNet-5

经典到不能再经典的图片
在这里插入图片描述

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(6,5,input_shape=(32,32,3)),# 使用6个5*5的卷积核对单通道32*32的图片进行卷积,结果得到6个28*28的特征图
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2), # 对28*28的特征图进行2*2最大池化,得到14*14的特征图
    tf.keras.layers.ReLU(),

    tf.keras.layers.Conv2D(16,5),# 使用16个5*5的卷积核对6通道14*14的图片进行卷积,结果得到16个10*10的特征图
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2),# 对10*10的特征图进行2*2最大池化,得到5*5的特征图
    tf.keras.layers.ReLU(),

    tf.keras.layers.Conv2D(120,5),# 使用120个5*5的卷积核对16通道5*5的图片进行卷积,结果得到120个1*1的特征图
    tf.keras.layers.ReLU(),
    #tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Flatten(),## 将 (None, 1, 1, 120) 的下采样图片拉伸成 (None, 120) 的形状
    tf.keras.layers.Dense(84,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

网络编译&&训练

model.compile(optimizer= "adam",
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
history = model.fit(
    train_db,
    validation_data=test_db,
    epochs=epochs
)

实验结果可视化:
在这里插入图片描述
实验的准确率不高,在60%左右,而且模型的过拟合现象比较严重。因为是第一代神经网络,有这样的不足很正常。
在原始的LeNet-5网络下加入Dropout层

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(6,5,input_shape=(32,32,3)),
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2),
    tf.keras.layers.ReLU(),

    tf.keras.layers.Conv2D(16,5),
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2),
    tf.keras.layers.ReLU(),

    tf.keras.layers.Conv2D(120,5),
    tf.keras.layers.ReLU(),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(84,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

实验结果可视化:
在这里插入图片描述
过拟合问题得到了解决,但是模型的准确率还是比较低。
自己搭建CNN网络

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(16,3,padding="same",activation="relu",input_shape=(32,32,3)),
    tf.keras.layers.MaxPool2D(),
    tf.keras.layers.Conv2D(32,3,padding="same",activation="relu"),
    tf.keras.layers.MaxPool2D(),
    tf.keras.layers.Conv2D(64,3,padding="same",activation="relu"),
    tf.keras.layers.MaxPool2D(),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512,activation="relu"),
    tf.keras.layers.Dense(10,activation="softmax")
])

实验结果可视化:
在这里插入图片描述
过拟合问题得到了改善,模型的准确率得到了提高。

总结:LeNet-5网络对于Cifar10的模型准确率比较低,而且过拟合现象比较严重。在LeNet-5网络中加入Dropout层后,过拟合现象得到了改善,但是模型的准确率还是比较低。博主将epochs由50增加到了100,准确率没有得到提升。由此证明,单纯的增加epochs的次数,并不能很好的改善模型的准确率。利用自己搭建的CNN网络,由于网络的层数增加,模型的准确率得到了提高。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值