深度学习之基于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

数据如下所示:
深度学习之基于LeNet-5实现cifar10的识别_第1张图片

3.LeNet-5

经典到不能再经典的图片
深度学习之基于LeNet-5实现cifar10的识别_第2张图片

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
)

实验结果可视化:
深度学习之基于LeNet-5实现cifar10的识别_第3张图片
实验的准确率不高,在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')
])

实验结果可视化:
深度学习之基于LeNet-5实现cifar10的识别_第4张图片
过拟合问题得到了解决,但是模型的准确率还是比较低。
自己搭建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的识别_第5张图片
过拟合问题得到了改善,模型的准确率得到了提高。

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

你可能感兴趣的:(机器学习,神经网络,深度学习,LeNet-5)