700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【神经网络与深度学习】CIFAR10数据集介绍 并使用卷积神经网络训练图像分类模型——[

【神经网络与深度学习】CIFAR10数据集介绍 并使用卷积神经网络训练图像分类模型——[

时间:2019-11-22 05:04:28

相关推荐

【神经网络与深度学习】CIFAR10数据集介绍 并使用卷积神经网络训练图像分类模型——[

【神经网络与深度学习】CIFAR-10数据集介绍,并使用卷积神经网络训练模型——[附完整代码]

一、CIFAR-10数据集介绍1.1 CIFAR-10数据集的内容1.2 CIFAR-10数据集的结构组成1.3 CIFAR-10数据集的下载方式1.4 CIFAR-10数据集与CIFAR-100数据集(拓展)1.5 CIFAR-10数据集与MNIST数据集对比(拓展)二、卷积神经网络2.1卷积神经网络函数介绍三、模型训练思路四、代码实现——直接用五、训练好的模型文件——直接用

一、CIFAR-10数据集介绍

1.1 CIFAR-10数据集的内容

CIFAR10数据集共有60000个样本,每个样本都是一张32*32像素的RGB图像(彩色图像),每个RGB图像又必定分为3个通道(R通道、G通道、B通道)。这60000个样本被分成了50000个训练样本和10000个测试样本。

CIFAR10数据集是用来监督学习训练的,那么每个样本就一定都配备了一个标签值(用来区分这个样本是什么),不同类别的物体用不同的标签值,CIFAR10中有10类物体,标签值分别按照0~9来区分,他们分别是飞机( airplane )、汽车( automobile )、鸟( bird )、猫( cat )、鹿( deer )、狗( dog )、青蛙( frog )、马( horse )、船( ship )和卡车( truck )。

CIFAR10数据集的内容,如图所示。

(该图源于官网)

CIFAR-10数据集有多种下载方式,本文仅介绍两种。

1.2 CIFAR-10数据集的结构组成

CIFAR10数据集结构组成可分为这四个部分:

·train_x:(50000, 32, 32, 3)——训练样本

·train_y:(50000, 1)——训练样本标签

·test_x:(10000, 32, 32, 3)——测试样本

·test_y:(10000, 1)——测试样本标签

1.3 CIFAR-10数据集的下载方式

方法一:

官网下载链接:http://www.cs.toronto.edu/~kriz/cifar.html

可以下载这三个版本,分别是python版本、Matlab版本和C编译好的二进制版本。

方法二:

在Keras中已经内置了多种公共数据集,其中就包含CIFAR-10数据集,如图所示。

所以可以直接调用 tf.keras.datasets.cifar10,直接下载数据集。

1.4 CIFAR-10数据集与CIFAR-100数据集(拓展)

这个数据集与CIFAR-10类似,只不过它有100个类,每个类包含600个图像。每个类有500个训练图像和100个测试图像。CIFAR-100中的100个子类被分为20个大类。每个图像都有一个“fine”标签(它所属的子类)和一个“coarse”标签(它所属的大类)。

CIFAR-100的结构组成:

CIFAR-10数据集与CIFAR-100数据集的区别也就显而易见啦。

1.5 CIFAR-10数据集与MNIST数据集对比(拓展)

关于MNIST数据集的介绍,我写过一篇文章,并也附带了MNIST数据集的模型训练完整代码,感兴趣的朋友可以看它。

使用MNIST数据集训练手写数字识别模型——附完整代码训练好的模型文件——直接用

链接:/weixin_45954454/article/details/114455209?spm=1001..3001.5501

CIFAR-10数据集与MNIST数据集二者的区别主要是在以下几点:

·维度不同:CIFAR-10数据集有4个维度,MNIST数据集有3个维度

·图像类型不同:CIFAR-10数据集是RGB图像(有三个通道),MNIST数据集是灰度图像,这也是为什么CIFAR-10数据集比MNIST数据集多出一个维度的原因。

·图像内容不同:CIFAR-10数据集展示的是各种不同的物体(猫、狗、飞机、汽车…),MNIST数据集展示的是不同人的手写0~9数字。

二、卷积神经网络

2.1卷积神经网络函数介绍

主要使用函数:tf.keras.layers.Conv2D()

tf.keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,dilation_rate=(1, 1), activation=None, use_bias=True,kernel_initializer='glorot_uniform', bias_initializer='zeros',kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,kernel_constraint=None, bias_constraint=None, **kwargs)

这一层创建了一个卷积核,它与层输入进行卷积以产生输出张量。如果use_bias为真,则创建一个偏差向量并添加到输出中。最后,如果激活不是None,它也会应用到输出。

当使用这一层作为模型的第一层时,提供关键字参数input_shape(整数元组,不包括样本轴),例如,对于data_format="channels_last"中的128x128 RGB图片,输入input_shape=(128, 128, 3)。

input_shape:

如果data_format=‘channels_first’,则4D张量的形状:(batch_size, channels, rows, cols);或者如果data_format=‘channels_last’,则4D张量的形状:(batch_size, rows, cols, channels)。

output_shape:

4D张量的形状:(batch_size, filters, new_rows, new_cols)如果data_format=‘channels_first’,或者4D张量的形状:(batch_size, new_rows, new_cols, filters)如果data_format=‘channels_last’。rows和cols值可能由于填充而改变。

(仅翻译的官方说明文档)

Tensorflow官方API网址如下,可以用来查询Tensorflow其他API的使用。(很全很详细)

Tensorflow官方API链接:/versions

三、模型训练思路

CIFAR-10数据集的模型训练思路与下面这篇文章相似,想了解设计过程和每一步代码作用的朋友可以看我写的这篇文章,这里就不赘述了。

使用MNIST数据集训练手写数字识别模型——附完整代码训练好的模型文件——直接用

链接:/weixin_45954454/article/details/114455209?spm=1001..3001.5501

四、代码实现——直接用

本人使用的是Tensorflow2.2.0—gpu版本,就目前已更新的版本来看,2.0.0以上版本都可以直接使用。

如果你的GPU没有配置好,代码会在指定GPU那里报错的,如果是这种报错还不知道如何解决的话,就选择用CPU跑程序,即注释掉这两行代码:

gpus = tf.config.experimental.list_physical_devices('GPU')tf.config.experimental.set_memory_growth(gpus[0],True)

注释掉后,基本就能跑通啦。

强调:其中model.save( )里的路径根据自己需要自行修改,若省去路径,默认保存到当前的工作路径。

########cifar10数据集#####################保存模型####################卷积神经网络###########train_x:(50000, 32, 32, 3), train_y:(50000, 1), test_x:(10000, 32, 32, 3), test_y:(10000, 1)#60000条训练数据和10000条测试数据,32x32像素的RGB图像#第一层两个卷积层16个3*3卷积核,一个池化层:最大池化法2*2卷积核,激活函数:ReLU#第二层两个卷积层32个3*3卷积核,一个池化层:最大池化法2*2卷积核,激活函数:ReLU#隐含层激活函数:ReLU函数#输出层激活函数:softmax函数(实现多分类)#损失函数:稀疏交叉熵损失函数#隐含层有128个神经元,输出层有10个节点import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as npimport timeprint('--------------')nowtime = time.strftime('%Y-%m-%d %H:%M:%S')print(nowtime)#指定GPU#import os#os.environ["CUDA_VISIBLE_DEVICES"] = "0"gpus = tf.config.experimental.list_physical_devices('GPU')tf.config.experimental.set_memory_growth(gpus[0],True)#初始化plt.rcParams['font.sans-serif'] = ['SimHei']#加载数据cifar10 = tf.keras.datasets.cifar10(train_x,train_y),(test_x,test_y) = cifar10.load_data()print('\n train_x:%s, train_y:%s, test_x:%s, test_y:%s'%(train_x.shape,train_y.shape,test_x.shape,test_y.shape)) #数据预处理X_train,X_test = tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)#归一化y_train,y_test = tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)#建立模型model = tf.keras.Sequential()##特征提取阶段#第一层model.add(tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding='same',activation=tf.nn.relu,data_format='channels_last',input_shape=X_train.shape[1:])) #卷积层,16个卷积核,大小(3,3),保持原图像大小,relu激活函数,输入形状(28,28,1)model.add(tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding='same',activation=tf.nn.relu))model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2))) #池化层,最大值池化,卷积核(2,2)#第二层model.add(tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding='same',activation=tf.nn.relu))model.add(tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding='same',activation=tf.nn.relu))model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))##分类识别阶段#第三层model.add(tf.keras.layers.Flatten()) #改变输入形状#第四层model.add(tf.keras.layers.Dense(128,activation='relu'))#全连接网络层,128个神经元,relu激活函数model.add(tf.keras.layers.Dense(10,activation='softmax')) #输出层,10个节点print(model.summary())#查看网络结构和参数信息#配置模型训练方法#adam算法参数采用keras默认的公开参数,损失函数采用稀疏交叉熵损失函数,准确率采用稀疏分类准确率函数pile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy']) #训练模型#批量训练大小为64,迭代5次,测试集比例0.2(48000条训练集数据,12000条测试集数据)print('--------------')nowtime = time.strftime('%Y-%m-%d %H:%M:%S')print('训练前时刻:'+str(nowtime))history = model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)print('--------------')nowtime = time.strftime('%Y-%m-%d %H:%M:%S')print('训练后时刻:'+str(nowtime))#评估模型model.evaluate(X_test,y_test,verbose=2)#每次迭代输出一条记录,来评价该模型是否有比较好的泛化能力#保存整个模型model.save('CIFAR10_CNN_weights.h5')#结果可视化print(history.history)loss = history.history['loss']#训练集损失val_loss = history.history['val_loss'] #测试集损失acc = history.history['sparse_categorical_accuracy'] #训练集准确率val_acc = history.history['val_sparse_categorical_accuracy'] #测试集准确率plt.figure(figsize=(10,3))plt.subplot(121)plt.plot(loss,color='b',label='train')plt.plot(val_loss,color='r',label='test')plt.ylabel('loss')plt.legend()plt.subplot(122)plt.plot(acc,color='b',label='train')plt.plot(val_acc,color='r',label='test')plt.ylabel('Accuracy')plt.legend()#暂停5秒关闭画布,否则画布一直打开的同时,会持续占用GPU内存#根据需要自行选择#plt.ion() #打开交互式操作模式#plt.show()#plt.pause(5)#plt.close()#使用模型plt.figure()for i in range(10):num = np.random.randint(1,10000)plt.subplot(2,5,i+1)plt.axis('off')plt.imshow(test_x[num],cmap='gray')demo = tf.reshape(X_test[num],(1,32,32,3))y_pred = np.argmax(model.predict(demo))plt.title('标签值:'+str(test_y[num])+'\n预测值:'+str(y_pred))#y_pred = np.argmax(model.predict(X_test[0:5]),axis=1)#print('X_test[0:5]: %s'%(X_test[0:5].shape))#print('y_pred: %s'%(y_pred))#plt.ion() #打开交互式操作模式plt.show()#plt.pause(5)#plt.close()

运行结果

从红色框选的内容分别是训练样本的损失函数值和准确率、测试样本的损失函数值和准确率,可以看到它每次训练迭代时损失函数和准确率的变化,从最后一次迭代结果上看,测试样本的损失函数值达到0.9423,准确率仅达到0.6761。这个结果并不是很好,我尝试过增加迭代次数,发现训练样本的损失函数值可以达到0.04,准确率达到0.98;但实际上训练模型却产生了越来越大的泛化误差,这就是训练过度的现象,从图中可以看出泛化能力最好时是在迭代第5次的状态,故只能选择迭代5次。

但为了可以达到更高的准确率,和泛化能力,可以通过修改小批量梯度下降的数量、训练模型的方法、修改网络层的参数等等办法……。

五、训练好的模型文件——直接用

csdn资源下载链接:【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——附完整代码训练好的模型文件——直接用。:/download/weixin_45954454/15648644?spm=1001..3001.5501

<本文内容主要参考于《神经网络与深度学习-Tensorflow实践》>

出现问题可私信我解决,不定期查看。

————————————————

<整理不易,留个赞或评论支持一下我吧^^>

如有疑问,欢迎批评指正^^

【神经网络与深度学习】CIFAR10数据集介绍 并使用卷积神经网络训练图像分类模型——[附完整训练代码]

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。