神经网络实验---人工神经网络(2)

news2024/12/22 23:21:17

本实验目的主要是掌握梯度下降法的优化算法;能够使用tf.keras构建Sequential模型,完成多分类任务。


1. 实验目的

①掌握梯度下降法的优化算法;
②能够使用tf.keras构建Sequential模型,完成多分类任务。

2. 实验内容

①下载MNIST数据集,建立神经网络模型,实现对MNIST手写数字数据集的识别,调整超参数和训练参数,并以可视化的形式输出模型训练的过程和结果;
②下载Fashion MNIST数据集,建立神经网络模型,实现对Fashion MNIST数据集的分类,调整超参数和训练参数,并以可视化的形式输出模型训练的过程和结果。

3. 实验过程

题目一:

 使用神经网络模型,实现对MNIST手写数字数据集的识别,并测试模型性能,记录和分析结果。
要求:
  (1)编写代码实现上述功能;
  (2)记录实验过程和结果:
  调整超参数和训练参数,使模型在测试集达到最优的性能,并以恰当的方式记录和展示实验过程和结果。
  (3)分析和总结:
  这个模型中的超参数有哪些?训练参数有哪些?结合训练过程,说明它们对模型性能的影响。
  (4)保存上述训练好的模型,并使用它对自制的手写数字图像的识别(自制的手写数字图像见期中试题题目二)。
① 代码

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

plt.rcParams['font.family'] = "SimHei"

#导入mnist的训练集和测试集
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
img_testx = test_x
img_testy = test_y

#对属性进行归一化,使取值范围在0-1之间,同时转换为tensor张量,标签值转换为张量,0-9的整数
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)
X_img = X_test
#建立Sequential模型,使用add方法添加层
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #Flatten不进行计算,将输入的二维数组转换为一维数组,进行形状转换
model.add(tf.keras.layers.Dense(128,activation="relu")) #添加隐含层,隐含层是全连接层,128个结点,激活函数使用relu函数
model.add(tf.keras.layers.Dense(10,activation="softmax"))#添加输出层,输出层是全连接层,激活函数是softmax函数

#配置训练方法
#优化器使用adam,损失函数使用稀疏交叉熵损失函数,准确率使用稀疏分类准确率函数
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])

## 训练模型
## 使用训练集中的数据训练,从中划分20%作为测试数据,用在每轮训练后评估模型的性能,每个小批量使用64条数据,训练5轮
model.fit(X_train,Y_train,batch_size=64,epochs=5,validation_split=0.2)
model.save_weights("result.h5")

#使用测试集评估模型
model.evaluate(X_test,Y_test,verbose=2)


#使用模型预测随机5个数据
for i in range(5):
    num = np.random.randint(1,10000)
    plt.subplot(1,5,i+1)
    plt.axis("off")
    plt.imshow(test_x[num],cmap="gray")
    # argmax取出值最大的索引,predict中参数的数据范围和维数与训练集一致
    y_pred = np.argmax(model.predict(tf.convert_to_tensor(X_test[num].numpy().reshape(1,28,28))))#使用argmax函数得到预测值
    plt.title("原值="+str(test_y[num])+"\n预测值:"+str(y_pred))

plt.show()


#使用模型预测自己的手写数据集
img_arr = []
for i in range(10):
    img = Image.open(r"D:\WorkSpace\pythonProject\qizhong\picture\%d.png" % i)
    img_temp = np.array(img)
    img_arr.append(img_temp)

for i in range(5):
    num = np.random.randint(1,10000)
    plt.subplot(1,5,i+1)
    plt.axis("off")
    plt.imshow(img_testx[num],cmap = "gray")
    #argmax取出值最大的索引,predict中参数的数据范围和维数与训练集一致
    #y_pred = np.argmax(model.predict([[X_test[num]]]))
    #tensor = tf.convert_to_tensor(X_test[num].numpy().reshape(1,28*28))
    y_pred = np.argmax(model.predict(tf.convert_to_tensor(X_img[num].numpy().reshape(1,28,28))))
    plt.title("原值=" + str(img_testy[num]) + "\n预测值:" + str(y_pred))

plt.show()

② 结果记录

 

③ 实验总结

卷积神经网络模型中的超参数和训练参数包括超参数,卷积层的数量和参数,池化层的参数,全连接层的参数,学习率、优化器和损失函数等超参数。训练参数包括权重和偏置,训练批次大小,训练迭代次数。这些超参数和训练参数对模型的性能有着重要的影响。例如,调整卷积核大小和数量可以影响模型在不同图像尺寸上的能力;池化层的使用可以降低模型复杂度并加快训练速度,而学习率、优化器等超参数也会影响模型的训练收敛速度和稳定性。另外,训练批次大小和迭代次数也会影响模型的训练速度和精度。

题目二:

        使用神经网络模型,实现对Fashion MNIST数据集的分类,并测试模型性能,记录和分析结果。
要求:
  (1)编写代码实现上述功能;
  (2)记录实验过程和结果:
  调整超参数,综合考虑准确率、交叉熵损失、和训练时间等,使模型在测试集达到最优的性能,并以恰当的方式记录和展示实验结果。
  (3)分析和总结:
  这个模型中的超参数有哪些?简要说明你寻找最佳超参数的过程,并对结果进行分析和总结。
① 代码

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

plt.rcParams['font.family'] = "SimHei"

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_x,train_y),(test_x,test_y) = fashion_mnist.load_data()
names = ['T-shirt/top','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle book']

#对属性进行归一化,使取值范围在0-1之间,同时转换为tensor张量,标签值转换为张量,0-9之间的整数
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)

#建立Sequential模型,使用add方法添加层
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #Flatten不进行计算,将输入的二维数组转换为一维数组
model.add(tf.keras.layers.Dense(128,activation="relu")) #添加隐含层,隐含层是全连接层,128个结点,激活函数使用relu函数
model.add(tf.keras.layers.Dense(10,activation="softmax")) #添加输出层,输出层是全连接层,激活函数是softmax函数

#配置训练方法
#优化器使用adam,损失函数使用稀疏交叉熵损失函数,准确率使用稀疏分类准确率函数
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])


#训练模型
#使用训练集中的数据训练,从中划分20%作为测试数据,用在每轮训练后评价模型的性能,每个小批量使用64条数据,训练5轮
model.fit(X_train,Y_train,batch_size=64,epochs=5,validation_split=0.2)

#使用测试集评估模型,verbose = 2表示每一轮输出一行记录
model.evaluate(X_test,Y_test,verbose=2)

#使用模型
for i in range(4):
    num = np.random.randint(1,10000)

    plt.subplot(1,4,i + 1)
    plt.axis("off")
    plt.imshow(test_x[num],cmap="gray")
    y_pred = np.argmax(model.predict(test_x[num].reshape(1,28,28)))
    plt.title("原值:"+names[test_y[num]]+"\n预测值"+ names[y_pred])

plt.show()

② 结果记录

 

 ③ 实验总结

Fashion MNIST数据集的CNN模型的超参数包括卷积核数、大小和步长,池化区域大小和步长,全连接层神经元数、dropout率和学习率等。为了寻找最佳超参数,通常需要进行参数组合试验,对不同超参数进行组合和训练,通过比较模型的表现来选择最优组合。调整超参数可以影响训练速度和模型精度,需要权衡二者。最终模型的性能不仅与超参数有关,还受到网络结构、训练轮数、优化器等训练参数的影响。

题目三:

  使用低阶API实现Softmax函数和交叉熵损失函数,并使用它们修改题目二。

在此使用低阶API
① 代码

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

plt.rcParams['font.family'] = "SimHei"

def softmax(logits):
    exp_logits = np.exp(logits)
    return exp_logits / np.sum(exp_logits, axis=1, keepdims=True)

def sparse_categorical_crossentropy(y_true, logits):
    num_samples = y_true.shape[0]
    y_pred = softmax(logits)
    loss = -np.log(y_pred[range(num_samples), y_true])
    return loss.mean()

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_x,train_y),(test_x,test_y) = fashion_mnist.load_data()
names = ['T-shirt/top','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle book']

#对属性进行归一化,使取值范围在0-1之间,同时转换为tensor张量,标签值转换为张量,0-9之间的整数
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)

#建立Sequential模型,使用add方法添加层
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #Flatten不进行计算,将输入的二维数组转换为一维数组
model.add(tf.keras.layers.Dense(128,activation="relu")) #添加隐含层,隐含层是全连接层,128个结点,激活函数使用relu函数
model.add(tf.keras.layers.Dense(10,activation="softmax")) #添加输出层,输出层是全连接层,激活函数是softmax函数

#配置训练方法
#优化器使用adam,损失函数使用稀疏交叉熵损失函数,准确率使用稀疏分类准确率函数
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['sparse_categorical_accuracy'])


#训练模型
#使用训练集中的数据训练,从中划分20%作为测试数据,用在每轮训练后评价模型的性能,每个小批量使用64条数据,训练5轮
model.fit(X_train,Y_train,batch_size=64,epochs=5,validation_split=0.2)

#使用测试集评估模型,verbose = 2表示每一轮输出一行记录
model.evaluate(X_test,Y_test,verbose=2)

#使用模型
for i in range(4):
    num = np.random.randint(1,10000)

    plt.subplot(1,4,i + 1)
    plt.axis("off")
    plt.imshow(test_x[num],cmap="gray")
    y_pred = np.argmax(model.predict(test_x[num].reshape(1,28,28)))
    plt.title("原值:"+names[test_y[num]]+"\n预测值"+ names[y_pred])

plt.show()

② 实验结果


4. 实验小结&讨论题

 请结合题目1-3回答下述问题:

①什么是小批量梯度下降法?每个小批量中的样本数对迭代次数有何影响?

答:小批量梯度下降法是梯度下降法的一个变种,它将所有样本一次性输入模型进行训练的过程,改为将样本划分为若干小批量进行迭代训练。每次迭代,使用一个小批量样本集计算损失函数并根据其梯度更新模型参数。这种方法可以加速模型收敛,并减少计算负载和内存使用量。

每个小批量中的样本数会影响迭代次数和每个迭代的计算量。较小的小批量样本数量有助于收敛速度的加快,保留了样本的随机性,但增加了每个迭代的计算量;相反,较大的小批量样本数量可以减少计算量,但可能会导致模型陷入局部最优,并减缓收敛速度。因此,我们需要考虑数据集的大小和复杂度,并进行超参数调整以达到最佳的训练结果。

②可以从哪些方面对梯度下降法进行优化?典型的优化方法有哪些?它们对模型训练过程有何影响?

答:梯度下降算法是深度学习中的核心优化算法。我们可以从调整学习率、优化参数初始化、使用正则化和dropout等方面进行优化,以提高模型训练的速度和精度。典型的优化方法有随机梯度下降(SGD)、动量法、Adagrad、Adam等。这些优化方法可以通过调整超参数、监测训练集和验证集上的损失函数、调整网络结构等方式,对模型的收敛速度和稳定性产生影响。

在设计神经网络时,为MNIST设计的神经网络是否可以直接应用到Fashion-MNIST上?请从数据集的图片大小,样本数以及分类数等角度解释这个现象。

答:MNIST和Fashion-MNIST都是手写数字和服装的灰度图像数据集,但它们的数据集的图片大小、样本数和分类数不同。MNIST是28x28的灰度图像,有6万个训练样本和1万个测试样本,其中包含10个类别的手写数字。而Fashion-MNIST是28x28的灰度图像,有6万个训练样本和1万个测试样本,其中包含10个类别的服装。因此,为MNIST设计的神经网络不能直接应用于Fashion-MNIST数据集上,因为数据集之间的差异会影响模型性能。新的模型应该经过适当的调整和训练,以适应数据集的特征和规模。

Fashion-MNIST创建之初希望替代MNIST数据集,比较相同的神经网络在这两个数据集上的准确率,并思考在模型评估方面,使用Fashion-MNIST数据集有什么优势?

答:MNIST数据集过于简单,可以在MNIST数据集成功的模型在别的数据集未必可以成功,不具有准确性。Fashion-MNIST是为了替代MNIST数据集而创建的,然而,相同的神经网络在这两个数据集上的准确率可能会有很大的差异。这是因为它们的图像特征和特定维度上类别的区别不同。对于模型评估方面,使用Fashion-MNIST数据集有以下优势,更具挑战性。相较于MNIST数据集,Fashion-MNIST数据集有更多的类别、更多的样本和更多的复杂度,更具有挑战性,能更好地评估模型的鲁棒性和泛化能力。更加真实。Fashion-MNIST数据集包含真实的服装图像,更符合真实生活中的场景,能更好地应用到实际场景中。

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

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

相关文章

架构设计之复用性概谈

作为开发人员,你对复用这个概念一定不陌生。在开发过程中,我们把系统中通用的代码逻辑抽取出来,变成公共方法或公共类,然后在多个地方调用,这就是最简单的技术上的复用。 但一开始,我们不会过多地考虑复用&…

迭代后首波实测!360智脑一键联网,代码超强,AI诈骗一眼看穿

360大模型(又)交卷了!作为国内首个能联网的大模型,360智脑给了我们怎样的惊喜?话不多说,新鲜出炉的第一手实测来了。 不得不说,自从GPT大模型混战开赛之后,教主周鸿祎可谓是存在感十…

易观分析:消费金融机构以APP为触点,创新消费场景,激发消费活力

易观:随着“用好消费金融、释放消费潜力”等金融支持扩内需的持续深入,消费金融APP活跃用户规模将保持稳健增长的态势,进而在拉动内需、促进消费升级、服务实体经济中扮演更重要的角色。 一、疫情防控较快平稳转段,激发消费市场活…

总结button,input type=“button“,input type=“text“中:[在value添加值] 和 [标签内添加值]的区别

1.如果是需要一个 普通文本框 <input></input>和<input type"text"></input>外观相同 都是 2.对比button,input type"button",input type"text"中&#xff1a;在value添加值 和 标签内 添加值 html中&#xff1a; &l…

第十三章 常用类(Math 类、Arrays 类、System类、Biglnteger 和BigDecimal 类、日期类)

一、Math 类&#xff08;P481&#xff09; Math类包含&#xff0c;用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数 &#xff08;1&#xff09;abs&#xff1a;绝对值 &#xff08;2&#xff09;pow&#xff1a;求幂 double pow Math.pow(2, 4); /…

520 | ChatGPT会是一个完美情人吗?

A GENERATIVE AI EXPERIMENT 机器人能感受到爱吗&#xff1f;这个困扰了科学家们多年的未解之谜&#xff0c;如今随着ChatGPT的爆火再次回到人们的视线中。虽然我们尚未准备好为机器赋予情感&#xff0c;但机器已经可以借助生成式AI来帮助人类表达自己的情感。 自然情感表达 …

网络原理(七):http 协议(下)

上一章只是谈到了http 中的几个header属性&#xff1a; Host &#xff1a; 域名端口号Content-Length &#xff1a;表示 body 中的数据长度Content-type &#xff1a;表示 body 中的数据格式。User-Agent &#xff1a;表示浏览器/操作系统的属性。Referer &#xff1a; 表示这…

三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;18年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

Spring之DI(依赖注入)

依赖注入&#xff08;DI&#xff09;是一个过程&#xff0c;在这个过程中&#xff0c;对象仅通过构造函数参数、工厂方法的参数或在对象被实例化后通过属性设置来定义它们的依赖项&#xff08;即与该对象一起工作的其他对象&#xff09;。然后&#xff0c;容器在创建 bean 时注…

【网络】无线路由器和路由器的配置方法

目录 &#x1f352;常见的接入互联网方式 &#x1f353;WAN配置 &#x1f353;LAN口配置 &#x1f353;WLAN配置 &#x1f353;WLAN安全 &#x1f352;路由设备管理 &#x1f353;路由器内部组件 &#x1f353;Cisco路由器的启动过程 &#x1f353;基础命令 &#x1f34e;show …

【中间件漏洞】apache未知扩展名解析漏洞、addhandler导致的解析漏洞、换行解析漏洞(CVE-2017-15715)

目录 apache未知扩展名解析漏洞 漏洞复现 防范建议 AddHandler导致的解析漏洞 防范建议 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞复现 防范建议 apache未知扩展名解析漏洞 Apache默认一个文件可以有多个以点分割的后缀&#xff0c;当最右边的后缀…

C#入门:编写运行第一个C#程序Helloworld

参考链接&#xff1a; C#入门学习-希里安 下载安装Visual Studio&#xff0c;创建项目 在官网下载安装Professional 2022即可. https://visualstudio.microsoft.com/zh-hans/ 下载时选择C#、.Net框架等支持&#xff0c;安装后运行&#xff0c;新建模板选择 Visual C#、Windo…

es集群配置与实际演示

es集群配置与实际演示 1》单服务器多节点部署一、准备环境二、安装jdk三、ElasticSearch部署四、实际演示 2》多台服务器集群部署一、准备环境二、安装jdk三、ElasticSearch部署四、实际演示五、密码及集群认证六、其他 集群分类&#xff1a; ES多节点集群分为两种&#xff0c;…

档案馆中温湿度要求的数据 资料分享

5.1 温度和湿度要求 5.1.1 档案馆各区域温度和湿度(本文件所指湿度为相对湿度,下同)设计应符合JGJ25—2010的规定。 5.1.2 档案库房温度和湿度应符合表1的要求。档案库房应维持温度和湿度相对稳定&#xff0c;温度日较差≤2 ℃,湿度日较差≤5%。温度和湿度取值应充分考虑设备…

Android 之MPAndroidChart图表案例

一 简介 1.1 图表用于直观的分析数据的分布情况&#xff0c;用于对比数据的大小和趋势。 1.2 图表的类型也非常多&#xff0c;常见的有折线&#xff0c;柱状&#xff0c;饼状&#xff0c;其它的有面积&#xff0c;散点&#xff0c;股价&#xff0c;雷达&#xff0c;仪表盘&am…

企业该如何自主构建信息化管理系统?

实践证明&#xff0c;企业自己搭建的信息化系统灵活性更高&#xff0c;更能契合企业的需求。 我们可以借助零代码平台自主搭建&#xff0c;既提供了各个应用系统的标准化功能&#xff0c;又支持自定义搭建&#xff0c;可根据企业自身需求修改。 全球领先的信息技术研究和顾问公…

【Servlet API详解】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. HttpServlet类 2. HttpServletRequest 2.…

【JUC基础】10. Atomic原子类

1、什么是Atomic Atomic英译为原子的。原子结构通常称为不可分割的最小单位。而在JUC中&#xff0c;java.util.concurrent.atomic 包是 Java 并发库中的一个包&#xff0c;提供了原子操作的支持。它包含了一些原子类&#xff0c;用于在多线程环境下进行线程安全的原子操作。使…

Apache Doris

Apache Doris教程 1.Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c; 更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;…

一次简单的问题排查背后蕴含的巨大的知识量

现象 所有的请求都卡住。堆dump正常。有一段时间内存占用高&#xff0c;GC频繁且耗时长&#xff0c;过了那段时间后监控上恢复正常。日志有OutOfMemory的异常 结论 在这段代码OOM之前&#xff0c;它会导致JVM不停 fullGC 与 stopWorld&#xff0c;从而导致了程序卡死。&#…