基于ResNet18的CIFAR-10图像分类
CIFAR-10数据分类
CIFAR-10数据简介
Cifar-10 数据集是由Hinton教授的学生Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的计算机视觉数据集,它包含 60000 张 32 * 32 的 RGB 彩色图片,总共 10 个分类,每一类包含6000张图片。其中,包括 50000 张用于训练集,10000 张用于测试集。在该数据集中,文件 data_batch_1.bin 、data_batch_2.bin 、… 、data_batch_5.bin 和test_ batch.bin中各有10000个样本。一个样本由3073个字节组成, 第一个字节为标签,剩下3072个字节为图像数据。整个数据集的10个类型分别为:飞机、小汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。
使用python版本的tensorflow框架,tensorflow框架提供了该数据集的自动下载和读取的方式。随机抽取展示20张图,如图所示,可以看出数据集上的图片为彩色图像。
ResNet18网络
深度残差网络(ResNet)模型诞生于2015年,是在针对于网络的退化问题,何凯明提出的残差学习方法,他提出的该模型获得了当年ImageNet竞赛的冠军。它的top5错误率为3.57%。该网络表明,卷积神经网络的层数存在着饱和度,并不是层数的堆叠就一定能够提高性能。其次,提出了层间残差跳连的思想,改善网络层数增加导致的退化,即梯度消失问题。
ResNet模型借鉴了Highway Network的思想,若网络的输入为x,并且希望得到的输出为H(x)。如果我们直接的进行这样的复杂映射,可能会比较困难。但是,如果把输入x直接作为初始结果,则输出为H(x)=F(x)+x,当F(x)=0时,该式转化为恒等映射,ResNet的学习目标变为残差,即H(x)-x,此时,训练的目标则是尽可能的使残差趋于0,这样训练的难度就大大的降低。
通过残差跨层连接结构,网络中某一层的输出可以跳过中间的某几层作为后面的其中一层的输入。ResNet的出现为加深网络层次而模型的性能提升提供了新的方向(如 DenseNet等),使得卷积神经网络的层数可以大大的加深。
import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.python.keras.api._v2.keras import layers, Sequential, regularizers
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model
from tensorflow.keras.utils import plot_model
from tensorflow import keras
import tensorflow.keras.preprocessing.image as image
np.set_printoptions(threshold=np.inf)#控制台输出所有的值,不需要省略号
#预处理
cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
#数据集切分
x_valid,x_train=x_train[:3000],x_train[3000:]
y_valid,y_train=y_train[:3000],y_train[3000:]
#数据展示
labels = ['飞机','小汽车','鸟','猫','鹿','狗','青蛙','马','船','卡车']
plt.figure(figsize=(14,14))
#显示前10张图像,并在图像上显示类别
for i in range(20):
plt.subplot(4,5,i+1)
plt.grid(False)
plt.imshow(x_train[i,:,:,],cmap=plt.cm.binary)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
t = labels[y_train[i][