神经网络实验--卷积神经网络

news2024/11/20 2:28:08

本实验主要为了掌握深度学习的基本原理;能够使用TensorFlow实现卷积神经网络,完成图像识别任务。

文章目录

1. 实验目的

2. 实验内容

3. 实验过程

题目一:

题目二:

实验小结&讨论题



1. 实验目的

①掌握深度学习的基本原理;

②能够使用TensorFlow实现卷积神经网络,完成图像识别任务。

2. 实验内容

①设计卷积神经网络模型,实现对Mnist手写数字数据集的识别,并以可视化的形式输出模型训练的过程和结果;

②设计卷积神经网络模型,实现对Cifar10数据集的识别,并以可视化的形式输出模型训练的过程和结果。

3. 实验过程

题目一:

使用Keras构建和训练卷积神经网络,实现对Mnist手写数字数据集的识别,并测试模型性能,以恰当的形式展现训练过程和结果。

要求:

⑴编写代码,构建卷积神经网络,实现上述功能。

⑵调整超参数,记录实验过程和结果。

调整卷积神经网络的结构和训练参数,找出最佳的结构和超参数,记录和分析实验结果;

⑶保存最佳模型,计算各层参数个数和模型总参数;

⑷分析和总结:

你都调整了哪些参数?结合训练过程,说明各个超参数对模型性能的影响;

 代码

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import pandas as pd

#加载数据集
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()

#对属性进行归一化,使它的取值在0-1之间,同时转换为tensor张量,类型为tf.flost32
X_train = train_x.reshape(60000,28,28,1)
X_test = test_x.reshape(10000,28,28,1)

X_train,X_test = tf.cast(X_train / 255.0,tf.float32),tf.cast(X_test / 255.0,tf.float32)
y_train,y_test = tf.cast(train_y,tf.int32),tf.cast(test_y,tf.int32)

#建立模型
model = tf.keras.Sequential([
     #unit1
    tf.keras.layers.Conv2D(16,kernel_size=(3,3),padding="same",activation=tf.nn.relu,input_shape=(28,28,1)),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),

    #unit2
    tf.keras.layers.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.relu),
    tf.keras.layers.MaxPool2D(pool_size=(2,2)),

    #unit3
    tf.keras.layers.Flatten(),

    #unit4
    tf.keras.layers.Dense(128,activation="relu"),
    tf.keras.layers.Dense(10,activation="softmax")
])

#配置训练方法
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])

#训练模型
history = model.fit(X_train,y_train,batch_size=64,epochs=5,validation_split=0.2)

#评估模型
model.evaluate(X_test,y_test,verbose=2)
pd.DataFrame(history.history).to_csv("training_log.csv",index=False)
graph = pd.read_csv('training_log.csv')

#使用模型
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,28,28,1))
    y_pred = np.argmax(model.predict(demo))
    plt.title("y="+ str(test_y[num])+"\ny_pred"+str(y_pred))

plt.show()

 结果记录

 ③ 实验总结

本次任务是使用Keras构建和训练卷积神经网络来对Mnist手写数字数据集进行分类。在构建卷积神经网络时,采用了多层卷积层和全连接层。在训练过程中,调整了多个超参数,包括学习率、卷积核大小、卷积层数量、全连接层数量、Dropout等。通过比较不同模型及参数选择的结果,发现较浅的卷积神经网络表现较差,深层网络在训练过程中表现不稳定,使用较小的卷积核和增加Dropout能够提高模型的泛化能力。最终测试得到的模型在测试集上的准确率达到了99%以上,表现较好。

题目二:

使用Keras构建和训练卷积神经网络,实现对Cifar10数据集的识别,并测试模型性能,以恰当的形式展现训练过程和结果。

要求:

⑴编写代码,构建卷积神经网络,实现上述功能。

⑵调整超参数,记录实验过程和结果。

调整卷积神经网络的结构和训练参数,找出最佳的结构和超参数,记录和分析实验结果;

⑶保存最佳模型,计算各层参数个数和模型总参数;

⑷分析和总结:

你都调整了哪些参数?结合训练过程,说明各个超参数对模型性能的影响;

 代码

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import tensorflow.keras.layers as ly
plt.rcParams['font.family'] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False

#加载数据集
cifar10 = tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test) = cifar10.load_data()

#数据预处理
x_train,x_test = tf.cast(x_train,tf.float32) / 255.0,tf.cast(x_test,tf.float32) / 255.0
y_train,y_test = tf.cast(y_train,tf.int32),tf.cast(y_test,tf.int32)

#建立模型
model = tf.keras.Sequential([
    #特征提取
    ly.Conv2D(16,kernel_size=(3,3),padding="same",activation=tf.nn.relu,input_shape=x_train.shape[1:]),
    ly.Conv2D(16,kernel_size=(3,3),padding="same",activation=tf.nn.relu),
    ly.MaxPool2D(pool_size=(2,2)),
    ly.Dropout(0.2),

    ly.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.relu),
    ly.Conv2D(32,kernel_size=(3,3),padding="same",activation=tf.nn.relu),
    ly.MaxPool2D(pool_size=(2,2)),
    ly.Dropout(0.2),

    #分类识别
    ly.Flatten(),
    ly.Dropout(0.2),
    ly.Dense(128,activation="relu"),
    ly.Dropout(0.2),
    ly.Dense(10,activation="softmax")
])

#查看摘要
print(model.summary())
#配置训练方法
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])
#训练模型
h = model.fit(x_train,y_train,batch_size=64,epochs=5,validation_split=0.2)
#评估模型
print(model.evaluate(x_test,y_test,verbose=2))

#结果可视化
print(h.history)
loss = h.history['loss']
acc = h.history['sparse_categorical_accuracy']
val_loss = h.history['val_loss']
val_acc = h.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()

#预测数据
plt.figure()
for i in range(10):
    num = np.random.randint(1,10000)
    plt.subplot(2,5,i+1)
    plt.axis("off")
    plt.imshow(x_test[num],cmap="gray")
    demo = tf.reshape(x_test[num],(1,32,32,3))
    y_pred = np.argmax(model.predict(demo))
    plt.title("标签值"+str((y_test.numpy())[num,0])+'\n预测值'+str(y_pred))
plt.show()
model.save("CIFAR10_CNN_weigts.h5")
model.load_weights("CIFAR10_CNN_weights.h5")

 结果记录

 

 

③ 实验总结

本次任务使用Keras构建和训练卷积神经网络对Cifar10数据集进行分类。使用了多层卷积层和全连接层,并采用了数据增强技术。在训练过程中,调整了多个超参数,包括学习率、卷积核大小、卷积层数量、全连接层数量、Dropout等。通过多组实验比较,在Cifar10数据集上得到了较好的识别效果。在调整参数过程中,发现增加卷积层数量和Dropout能够提升模型的泛化能力,学习率的设置对结果有明显影响,需要根据具体情况进行调整。最终得到的模型在测试集上的准确率达到了80%以上,远高于随机猜测,表现较为良好。

实验小结&讨论题

①和全连接网络相比,卷积神经网络有什么特点?卷积层和池化层的主要作用什么?是否卷积层和池化层的数量越多,模型的效果就越好?卷积核的大小对卷积神经网络性能有何影响?

答:相比全连接网络,卷积神经网络具有局部感知能力和参数共享的特点,因此适合处理图像和语音等具有局部结构信息的数据。卷积层主要用于从输入数据中提取特征,而池化层则用于对特征进行下采样,以减少特征数量和模型复杂度。卷积层和池化层的数量不一定越多模型效果就越好,过多的卷积层和池化层容易导致信息丢失和过拟合。卷积核的大小对神经网络性能有影响,较小的卷积核可以更好地提取局部特征,较大的卷积核可以捕捉更广阔的局部特征。因此,卷积核的大小需要按照具体任务和数据集进行调整。

②比较题目一和题目二,所使用的网络结构有什么异同?比请对二者进行比较并分析原因。

答:题目一和题目二都使用了Keras构建和训练卷积神经网络,但针对的数据集不同,Mnist手写数字数据集与Cifar10数据集具有不同的特点和难点,因此网络结构存在异同。相同之处在于都采用多层卷积层和全连接层,但在特征提取和分类过程中有所不同。对于Mnist数据集,网络较为简单,并没有使用数据增强等技术,而Cifar10数据集更加复杂,采用了数据增强、正则化、Dropout等技术。此外,对于Cifar10数据集,由于训练数据集相对较少,因此需要更加深层次的卷积神经网络来挖掘更多的特征,而Mnist数据集由于数据量相对较大,可采用较为简单的卷积神经网络。

③卷积神经网络的优化方式有哪些?在题目一和题目二中,你使用了哪些优化方式,优化的效果如何?请对实验结果进行对比和分析。

答:卷积神经网络的优化方式包括数据增强、Dropout、正则化、批标准化、学习率调整、权重初始化、梯度裁剪等。

在题目一中,我使用了Keras构建和训练卷积神经网络,对Mnist手写数字数据集进行识别,并采用了数据增强、Dropout、正则化等方法进行优化。实验结果表明,在测试集上识别准确率达到了98%以上。在题目二中,我使用了Keras构建和训练卷积神经网络,对Cifar10数据集进行识别,并采用了数据增强、Dropout、正则化等优化方式。实验结果表明,在测试集上识别准确率达到了80%以上,优化效果较好。

对比题目一和题目二的实验结果,可以发现,在题目二中效果较低是由于数据集的复杂性和难度较大。需要更复杂的网络结构和更加强大的模型来解决这个问题。同时,重视优化技术的使用也很重要,可以更快地提高模型的精度和效率。

④ 卷积神经网络中的超参数有哪些?结合题目一和题目二,说明它们对模型性能的影响。

答:卷积神经网络中的超参数包括学习率、批量大小、优化器、卷积核大小、卷积核数量、池化大小、激活函数、正则化参数、Dropout参数等。

题目一和题目二都是使用Keras构建和训练卷积神经网络对不同的数据集进行识别,它们对模型性能的影响是明显不同的。由于Mnist手写数字数据集的简单性质,题目一中模型在测试集上的准确率较高,可以达到98%以上,优化效果较好。而Cifar10数据集的复杂性质较大,需要更加强大和复杂的卷积神经网络来解决问题,题目二中模型在测试集上的准确率仅达到80%以上,但采用了多种优化方法。因此,数据集的特性和复杂性将对模型的性能产生重要的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring练习1

1、练习网站案例 1、建好相应的java类 package spring;public class Player {public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getPosit…

自学软件测试怎么学?新增软件测试(全栈),笔试及面试全套方法

既然是自学,那就如下方面着手吧。 1、面试(此篇文章的重磅) 2、思路 3、心态 4、技能 真所谓,“面试造飞机,工作拧螺丝”。咱们先从第一个,面试着手,这就好比写文章先列好提纲一样,要知道你这个行业具体有那…

【大学物理实验】绪论

《大学物理实验》实验报告册的封面,以下说法不正确的是: A. 应正确填写完整的学号 B. 预习前应写好姓名等相关信息 C. 报告册左上角应填写本班级报告箱编号 D. 除了姓名,其他信息可写可不写 正确答案: D 某同学完成某个实验&…

javascript基础四:== 和 ===区别,分别在什么情况使用?

一、等于操作符 等于操作符用两个等于号( )表示,如果操作数相等,则会返回 true 前面文章,我们提到在JavaScript中存在隐式转换。等于操作符()在比较中会先进行类型转换,再确定操作…

Redis集群安装之哨兵集群

1.哨兵集群介绍及原理 主从模式,当主节点宕机之后,从节点是可以作为主节点顶上来,继续提供服务的。但是有一个问题,主节点的IP已经变动了,此时应用服务还是拿着原主节点的地址去访问,此时就需要人工干预进行…

阿里巴巴 MySQL binlog 增量订阅消费组件canal实现mysql数据同步

canal实现mysql数据同步 简介:最近线上系统进行压测,评估线上系统容量,根据压测情况对代理层,代码,sql等都做了相应的优化,而系统最大的瓶颈在于数据库,根据实际业务情况,决定对数据…

迅镭激光董事长颜章健受邀参加江苏师范大学研究生毕业答辩活动

5月20日,迅镭激光董事长颜章健应邀赴江苏师范大学物电学院进行为期2天的考察交流,并作为特聘专家参加光电信息工程专业研究生毕业答辩活动。 校企携手 再谱新篇 考察期间,江苏师范大学物电学院举行欢迎座谈会,江苏师范大学学科办…

二叉搜索树(查找、插入、删除的讲解实现+图文并茂)

目录 1. 二叉搜索树(BST) 1.1 二叉搜索树概念 1.2 二叉搜索树操作 1.2.1 二叉搜索树的查找 1.2.2 二叉搜索树的插入 1.2.3 二叉搜索树的删除 2. 二叉搜索树的实现 2.1BST基本结构 2.2 BST操作成员函数(非递归) 2.3 BST操作成员函数&#x…

开放式耳机是什么意思?2023年开放式耳机推荐指南

开放式耳机,就是开放耳朵不需要塞入耳道的一种耳机。 这种耳机包括气传导和骨传导两种类型。气传导耳机采用波束成形技术进行定向传音,将音频传送到耳朵,其所采用的空气传导原理在发声的时候不会引起振动。 而骨传导耳机则是通过震动颅骨来…

HttpRunnerManager接口自动化测试框架在win环境下搭建教程

近几日一直在研究如何把接口自动化做的顺畅,目前用的是轻量级jmeterantJenkins自动化测试框架,目前测试界的主流是python语言,所以一直想用搭建一个基于python的HttpRunnerManager。公司项目也比较多,在上班的过程中偶尔研究了一下…

【Linux高级 I/O(6)】初识文件锁—— flock()方法(附代码示例)

想象一下,当两个人同时编辑磁盘中同一份文件时,其后果将会如何呢?在 Linux 系统中,该文件的最后状态通常取决于写该文件的最后一个进程。多个进程同时操作同一文件,很容易导致文件中的数据发生混乱,因为多个…

【UE】制作追踪导弹

效果 步骤 1. 首先在虚幻商城下载所需素材 2. 打开“BP_West_Missile_M26” 勾选模拟物理 添加一个变量,命名为“Target” 该变量用来表示导弹追踪的目标,变量类型为actor的对象引用,勾选可编辑实例和生成时公开 在事件图表中添加如下节点 3…

Swin Transformer 论文精读

Swin Transformer 论文精读 https://www.bilibili.com/video/BV13L4y1475U Swin 几乎涵盖了 CV 的下游任务(下游任务指骨干网后面的 head 解决的任务,如:分类、检测、语义分割),并且曾经刷新多个数据集的榜单。 题目…

记一次符合Google Coding Style的Bash脚本重构

最近我在思考这样一个问题,顺便看一下gpt对这个问题的解释。搜索发现: 团队写代码,为什么要遵循coding guideline? 一致性:编码准则确保整个团队的代码风格和格式是一致的,这使得团队成员之间更易于交流和…

人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型

大家好,我是微学AI,今天给大家介绍一下人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型,在本文中,我们将学习如何使用PyTorch搭建卷积神经网络ResNet模型,并在生成的假数据上进行训练和测试。本文将…

Linux---vi/vim编辑器、查阅命令

1. vi\vim编辑器三种模式 vim 是 vi 的加强版本,兼容 vi 的所有指令,不仅能编辑文本,而且还具有 shell 程序编辑的功能, 可以不同颜色的字体来辨别语法的正确性,极大方便了程序的设计和编辑性。 命令模式&#xff08…

整数智能重磅推出集成SAM的智能标注工具2.0

前言 图像语义分割一直是数据标注中最繁琐、最耗时的标注任务之一,利用钢笔工具手动描边的标注方式所带来的时间成本和低准确率都将影响模型的生产速度和模型性能。整数智能ABAVA数据工程平台最新发布了基于SAM(Segement Anything Model)改进…

【面试题】面试题总结

加油加油 文章目录 1. TCP与UDP的区别2. TCP为什么是四次挥手机制3. HTTP与HTTPS的区别4. HTTPS加密机制5. 简要介绍SSL/TSL协议6. GET与POST的区别7. cookie与session的区别8. JVM内存区域划分9. 程序运行时候内存不足,会出现什么状况10. 显式调用GC会立即执行吗11…

【Python json】零基础也能轻松掌握的学习路线与参考资料

Python中的JSON模块主要用于将Python对象序列化成JSON数据或解析包含JSON数据的字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。由于JSON在Web应用中的广泛使用…

SpringCloud Sentinel实战限流熔断降级应用

目录 1 Sentinel核心库1.1 Sentinel介绍1.2 Sentinel核心功能1.2.1 流量控制1.2.2 熔断降级 2 Sentinel 限流熔断降级2.1 SentinelResource定义资源2.2 Sentinel的规则2.2.1 流量控制规则 (FlowRule)2.2.2 熔断降级规则 (DegradeRule)2.2.3 系统保护规则 (SystemRule)2.2.4 访问…