Python从0到100(八十四):神经网络-卷积神经网络练习CIFAR-10数据集 ...

打印 上一主题 下一主题

主题 1729|帖子 1729|积分 5187


   前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,资助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 盘算机视觉、呆板学习、神经网络以及人工智能相干知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!
  1.数据集先容

CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像构成,每类 6000 张图像。有 50000 张练习图像和 10000 张测试图像。
数据集分为5个练习批次和1个测试批次,每个批次有10000张图像。测试批次正好包罗从每个类中随机选择的 1000 张图像。练习批次以随机次序包罗剩余的图像,但某些练习批次可能包罗来自一个类的图像多于另一个类的图像。在它们之间,练习批次正好包罗来自每个类的 5000 张图像。
总结:

Size(大小): 32×32 RGB图像 ,数据集自己是 BGR 通道
Num(数量): 练习集 50000 和 测试集 10000,一共60000张图片
Classes(十种类别): plane(飞机), car(汽车),bird(鸟),cat(猫),deer(鹿),dog(狗),frog(蛙类),horse(马),ship(船),truck(卡车)

下载链接

来自博主(Dream是个帅哥)的分享:
链接: https://pan.baidu.com/s/1gKazlkk108V_1nrc68VoSQ 提取码: 0213
数据集文件夹


CIFAR-100数据集(拓展)

这个数据集与CIFAR-10雷同,只不外它有100个类,每个类包罗600个图像。每个类有500个练习图像和100个测试图像。CIFAR-100中的100个子类被分为20个大类。每个图像都有一个“fine”标签(它所属的子类)和一个“coarse”标签(它所属的大类)。
CIFAR-10数据集与MNIST数据集对比



  • 维度不同:CIFAR-10数据集有4个维度,MNIST数据集有3个维度(CIRAR-10的四维: 一次的样本数量, 图片高, 图片宽, 图通道数 -> N H W C;MNIST的三维: 一次的样本数量, 图片高, 图片宽 -> N H W)
  • 图像范例不同:CIFAR-10数据集是RGB图像(有三个通道),MNIST数据集是灰度图像,这也是为什么CIFAR-10数据集比MNIST数据集多出一个维度的原因。
  • 图像内容不同:CIFAR-10数据集展示的是各种不同的物体(猫、狗、飞机、汽车…),MNIST数据集展示的是不同人的手写0~9数字。
2.数据集读取

读取数据集

选取data_batch_1可视化此中一张图:
  1. def unpickle(file):
  2.     import pickle
  3.     with open(file, 'rb') as fo:
  4.         dict = pickle.load(fo, encoding='bytes')
  5.     return dict
  6. dict = unpickle('D:\PycharmProjects\model-fuxian\CIFAR\cifar-10-batches-py\data_batch_1')
  7. print(dict)
复制代码
输出效果:
一批次的数据会集有4个字典键,我们需要用到的就是 数据标签 和 数据内容(10000×32×32×3,10000张32×32大小为rgb三通道的图片)

输出的是一个字典:
   {
b’batch_label’: b’training batch 1 of 5’,
b’labels’: [6, 9 … 1,5],
b’data’: array([[ 59, 43, …, 84, 72],…[ 62, 61, 60, …, 130, 130, 131]], dtype=uint8),
b’filenames’: [b’leptodactylus_pentadactylus_s_000004.png’,…b’cur_s_000170.png’]

}
  此中,各个代表的意思如下:
b’batch_label’ : 所属文件集
b’labels’ : 图片标签
b’data’ :图片数据
b’filename’ :图片名称
读取范例

  1. print(type(dict[b'batch_label']))
  2. print(type(dict[b'labels']))
  3. print(type(dict[b'data']))
  4. print(type(dict[b'filenames']))
复制代码
输出效果:
   <class ‘bytes’>
<class ‘list’>
<class ‘numpy.ndarray’>
<class ‘list’>
  读取图片

  1. img = dict[b'data']
  2. print(img.shape)
复制代码
输出效果:(10000, 3072),此中 3072 = 32 * 32 * 3 (图片 size)
3.数据集调用

TensorFlow 调用

  1. from tensorflow.keras.datasets import cifar10
  2. (x_train,y_train), (x_test, y_test) = cifar10.load_data()
复制代码
当地调用

  1. def unpickle(file):
  2.     import pickle
  3.     with open(file, 'rb') as fo:
  4.         dict = pickle.load(fo, encoding='bytes')
  5.     return dict
  6. dict = unpickle('D:\PycharmProjects\model-fuxian\CIFAR\cifar-10-batches-py\data_batch_1')
复制代码
4.卷积神经网络练习

此处参考:传送门
1.指定GPU

  1. gpus = tf.config.experimental.list_physical_devices('GPU')
  2. tf.config.experimental.set_memory_growth(gpus[0],True)
  3. #初始化
  4. plt.rcParams['font.sans-serif'] = ['SimHei']
复制代码
2.加载数据

  1. cifar10 = tf.keras.datasets.cifar10
  2. (train_x,train_y),(test_x,test_y) = cifar10.load_data()
  3. 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))
复制代码
3.数据预处理

  1. X_train,X_test = tf.cast(train_x/255.0,tf.float32),tf.cast(test_x/255.0,tf.float32)     #归一化
  2. y_train,y_test = tf.cast(train_y,tf.int16),tf.cast(test_y,tf.int16)
复制代码
4.创建模子

adam算法参数采取keras默认的公开参数,丧失函数采取希罕交叉熵丧失函数,准确率采取希罕分类准确率函数
  1. model = tf.keras.Sequential()
  2. ##特征提取阶段
  3. #第一层
  4. 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)
  5. model.add(tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding='same',activation=tf.nn.relu))
  6. model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))   #池化层,最大值池化,卷积核(2,2)
  7. #第二层
  8. model.add(tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding='same',activation=tf.nn.relu))
  9. model.add(tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding='same',activation=tf.nn.relu))
  10. model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))
  11. ##分类识别阶段
  12. #第三层
  13. model.add(tf.keras.layers.Flatten())    #改变输入形状
  14. #第四层
  15. model.add(tf.keras.layers.Dense(128,activation='relu'))     #全连接网络层,128个神经元,relu激活函数
  16. model.add(tf.keras.layers.Dense(10,activation='softmax'))   #输出层,10个节点
  17. print(model.summary())      #查看网络结构和参数信息
  18. #配置模型训练方法
  19. model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])
复制代码
5.练习模子

批量练习大小为64,迭代5次,测试集比例0.2(48000条练习集数据,12000条测试集数据)
  1. history = model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)
复制代码
6.评估模子

  1. model.evaluate(X_test,y_test,verbose=2)     #每次迭代输出一条记录,来评价该模型是否有比较好的泛化能力
  2. #保存整个模型
  3. model.save('CIFAR10_CNN_weights.h5')
复制代码
7.效果可视化

  1. print(history.history)
  2. loss = history.history['loss']          #训练集损失
  3. val_loss = history.history['val_loss']  #测试集损失
  4. acc = history.history['sparse_categorical_accuracy']            #训练集准确率
  5. val_acc = history.history['val_sparse_categorical_accuracy']    #测试集准确率
  6. plt.figure(figsize=(10,3))
  7. plt.subplot(121)
  8. plt.plot(loss,color='b',label='train')
  9. plt.plot(val_loss,color='r',label='test')
  10. plt.ylabel('loss')
  11. plt.legend()
  12. plt.subplot(122)
  13. plt.plot(acc,color='b',label='train')
  14. plt.plot(val_acc,color='r',label='test')
  15. plt.ylabel('Accuracy')
  16. plt.legend()
复制代码
8.使用模子

  1. plt.figure()
  2. for i in range(10):
  3.     num = np.random.randint(1,10000)
  4.     plt.subplot(2,5,i+1)
  5.     plt.axis('off')
  6.     plt.imshow(test_x[num],cmap='gray')
  7.     demo = tf.reshape(X_test[num],(1,32,32,3))
  8.     y_pred = np.argmax(model.predict(demo))
  9.     plt.title('标签值:'+str(test_y[num])+'\n预测值:'+str(y_pred))
  10. plt.show()
复制代码
输出效果:


上面的内容分别是练习样本的丧失函数值和准确率、测试样本的丧失函数值和准确率,可以看到它每次练习迭代时丧失函数和准确率的变化,从最后一次迭代效果上看,测试样本的丧失函数值达到0.9123,准确率仅达到0.6839。
这个效果并不是很好,我尝试过增加迭代次数,发现练习样本的丧失函数值可以达到0.04,准确率达到0.98;但现实上练习模子却产生了越来越大的泛化误差,这就是练习过度的现象,颠末尝试泛化能力最好时是在迭代第5次的状态,故只能选择迭代5次。

练习好的模子文件——直接用

CIFAR10数据集先容,并使用卷积神经网络练习图像分类模子——附完备代码练习好的模子文件——直接用:https://download.csdn.net/download/weixin_51390582/88788820
文末送书

   本期推荐1:

  《MATLAB数学建模从入门到精通》
从理论框架到实战案例,跨平台通用性强,从模子构建到应用实践,由浅入深掌握数学建模之道,灵活应对复杂题目挑战。

  京东:https://item.jd.com/14827364.html
   源于现实:本书全面归纳和整理笔者多年的数学建模讲授实践履历,体现了泉源于现实服务于现实的原则。
由浅入深:从基础知识开始逐步先容数学建模的相干知识,学习门槛很低。
普通易懂:本书力争让晦涩的知识变得普通易懂。
内容实用:结合大量实例进行讲授,能够有效指导数学建模新手入门。
内容简介
本书结合案例,系统先容了使用 MATLAB 进行数学建模的相干知识和方法论。
本书分为 11 章,重要包括走进数学建模的世界、函数极值与规划模子、微分方程与差分模子、数据处理的根本策略、权重天生与评价模子、复杂网络与图论模子、时间序列与投资模子、呆板学习与统计模子、进化盘算与群体智能、其他数学建模知识、数学建模竞赛中的一些根本能力。
    本期推荐2:

  《ChatGPT时代:GPTs开发详解》
解锁将来科技,GPTs开发应用一本通:从智能对话到无穷创意,您的AI创新之旅,由此启程!

  京东:https://item.jd.com/14899622.html
   案例详解GPTs技能,助你实现创新。
零基础搭建GPTs,打造个性化助手。
学会快速定制助手,轻松为己所用。
详解学习辅助类GPTs、个人成长类GPTs、办公助手类GPTs、电商和交际媒体类GPTs、短视频制作类GPTs五大类GPTs。
掌握各类助手的搭建和发布,全面提升工作和学习服从,并获得平台收益。
内容简介
定制化GPTs(Custom GPTs)是由OpenAI推出的一种创新技能,它允许用户根据自己的特定需求和应用场景来创建定制版本的GPTs。定制化GPTs结合了用户自界说的指令、额外的专业知识以及多样化的技能,旨在为用户提供一样平常生活、工作或特定任务中的更多资助和支持。
本书详细先容了GPTs的概念、功能特点、创建第一个GPTs、指令使用本领、知识库使用本领,以及怎样根据个人需求和应用场景创建定制化GPTs,如学习辅助类GPTs、个人成长类GPTs、办公助手类GPTs、电商和交际媒体类GPTs、短视频制作类GPTs等。
本书内容充实,语言普通易懂,案例丰富,具有很强的可读性。它既适合初次打仗AI技能的普通读者阅读,也适合有一定履历的AI从业者鉴戒。此外,本书也适合那些需要了解最新ChatGPT技能动态的开发人员阅读。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表