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网络,由于网络的层数增加,模型的准确率得到了提高。