【神经网络】tensorflow实验10 -- 人工神经网络(1)

news2024/11/13 9:32:17

1. 实验目的

①理解并掌握误差反向传播算法;
②能够使用单层和多层神经网络,完成多分类任务;
③了解常用的激活函数。

2. 实验内容

①设计单层和多层神经网络结构,并使用TensorFlow建立模型,完成多分类任务;
②调试程序,通过调整超参数和训练模型参数,使模型在测试集上达到最优性能;
③测试模型,使用Matplotlib对结果进行可视化呈现。

3.实验过程

题目一:

分别使用单层神经网络和多层神经网络,对Iris数据集中的三种鸢尾花分类,并测试模型性能,以恰当的形式展现训练过程和结果。
要求:
⑴编写代码实现上述功能;
⑵记录实验过程和结果:
改变隐含层层数、隐含层中节点数等超参数,综合考虑准确率、交叉熵损失、和训练时间等,使模型在测试集达到最优的性能,并以恰当的方式记录和展示实验结果;
⑶分析和总结:
这个模型中的超参数有哪些?简要说明你寻找最佳超参数的过程,请分析它们对结果准确性和训练时间的影响,以表格或其他合适的图表形式展示。通过以上结果,可以得到什么结论,或对你有什么启发。
① 代码
单层神经网络

#导入库
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#加载数据
TRAIN_URL="http://download.tensorflow.org/data/iris_training.csv"
train_path=tf.keras.utils.get_file(TRAIN_URL.split('/')[-1],TRAIN_URL)
TEST_URL="http://download.tensorflow.org/data/iris_test.csv"
test_path=tf.keras.utils.get_file(TEST_URL.split('/')[-1],TEST_URL)

df_iris_train=pd.read_csv(train_path,header=0)#读取文件
df_iris_test=pd.read_csv(test_path,header=0)
iris_train=np.array(df_iris_train)#转化为numpy数组
iris_test=np.array(df_iris_test)

#数据预处理
x_train=iris_train[:,0:4]#取训练集的全部属性
y_train=iris_train[:,4]#取最后一列标签值
x_test=iris_test[:,0:4]
y_test=iris_test[:,4]
x_train=x_train-np.mean(x_train,axis=0)#对属性值进行标准化处理,使它均值为0
x_test=x_test-np.mean(x_test,axis=0)
X_train=tf.cast(x_train,tf.float32)#将属性值X转为32位浮点数
Y_train=tf.one_hot(tf.constant(y_train,dtype=tf.int32),3)#将标签值Y转化为独热编码
X_test=tf.cast(x_test,tf.float32)
Y_test=tf.one_hot(tf.constant(y_test,dtype=tf.int32),3)

#设置超参数,迭代次数和显示间隔
learn_rate=1.2
iter=50
display_step=10
#设置模型参数初始值
np.random.seed(612)
W=tf.Variable(np.random.randn(4,3),dtype=tf.float32)
B=tf.Variable(np.zeros([3]),dtype=tf.float32)
#训练模型
acc_train=[]
acc_test=[]
cce_train=[]
cce_test=[]
for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        PRED_train=tf.nn.softmax(tf.matmul(X_train,W)+B)
        Loss_train=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_train,y_pred=PRED_train))

    PRED_test=tf.nn.softmax(tf.matmul(X_test,W)+B)
    Loss_test=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_test,y_pred=PRED_test))

    accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(),axis=1),y_train),tf.float32))
    accuracy_test=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_test.numpy(),axis=1),y_test),tf.float32))
    acc_train.append(accuracy_train)
    acc_test.append(accuracy_test)
    cce_train.append(Loss_train)
    cce_test.append(Loss_test)
    grads=tape.gradient(Loss_train,[W,B])
    W.assign_sub(learn_rate*grads[0])
    B.assign_sub(learn_rate*grads[1])
    if i % display_step==0:
        print("i:%i,TrainAcc:%f,TrainLoss:%f,TestAcc:%f,TestLoss:%f"%(i,accuracy_train,Loss_train,accuracy_test,Loss_test))
#结果可视化
plt.figure(figsize=(10,3))#创建画布

plt.subplot(121)
plt.plot(cce_train,color="blue",label="train")
plt.plot(cce_test,color="red",label="test")
plt.xlabel("Iteration")
plt.ylabel("Loss")
plt.legend()

plt.subplot(122)
plt.plot(acc_train,color="blue",label="train")
plt.plot(acc_test,color="red",label="test")
plt.xlabel("Iteration")
plt.ylabel("Accuracy")
plt.legend()

plt.show()

多层神经网络

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#加载数据
TRAIN_URL="http://download.tensorflow.org/data/iris_training.csv"
train_path=tf.keras.utils.get_file(TRAIN_URL.split('/')[-1],TRAIN_URL)#导入鸢尾花训练数据集
TEST_URL="http://download.tensorflow.org/data/iris_test.csv"
test_path=tf.keras.utils.get_file(TEST_URL.split('/')[-1],TEST_URL)#导入鸢尾花测试数据集

df_iris_train=pd.read_csv(train_path,header=0)#读取文件
df_iris_test=pd.read_csv(test_path,header=0)
#数据预处理
iris_train=np.array(df_iris_train)#转化为numpy数组
iris_test=np.array(df_iris_test)

x_train=iris_train[:,0:4]#取训练集的全部属性
y_train=iris_train[:,4]#取最后一列标签值
x_test=iris_test[:,0:4]
y_test=iris_test[:,4]

x_train=x_train-np.mean(x_train,axis=0)#对属性值进行标准化处理,使它均值为0
x_test=x_test-np.mean(x_test,axis=0)

X_train=tf.cast(x_train,tf.float32)#将属性值X转为32位浮点数
Y_train=tf.one_hot(tf.constant(y_train,dtype=tf.int32),3)#标签值Y转化为独热编码
X_test=tf.cast(x_test,tf.float32)
Y_test=tf.one_hot(tf.constant(y_test,dtype=tf.int32),3)
#设置超参数、迭代次数、显示间隔
learn_rate=0.5
iter=50
display_step=10
#设置模型参数初始值
np.random.seed(612)
W1=tf.Variable(np.random.randn(4,16),dtype=tf.float32)#隐含层
B1=tf.Variable(np.zeros([16]),dtype=tf.float32)
W2=tf.Variable(np.random.randn(16,3),dtype=tf.float32)#输出层
B2=tf.Variable(np.zeros([3]),dtype=tf.float32)
#训练模型
acc_train=[]
acc_test=[]
cce_train=[]
cce_test=[]
for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        Hidden_train=tf.nn.relu(tf.matmul(X_train,W1)+B1)
        PRED_train=tf.nn.softmax(tf.matmul(Hidden_train,W2)+B2)
        Loss_train=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_train,y_pred=PRED_train))

        Hidden_test=tf.nn.relu(tf.matmul(X_test,W1)+B1)
        PRED_test=tf.nn.softmax(tf.matmul(Hidden_test,W2)+B2)
        Loss_test=tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_test,y_pred=PRED_test))

    accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(),axis=1),y_train),tf.float32))
    accuracy_test=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_test.numpy(),axis=1),y_test),tf.float32))

    acc_train.append(accuracy_train)
    acc_test.append(accuracy_test)
    cce_train.append(Loss_train)
    cce_test.append(Loss_test)

    grads=tape.gradient(Loss_train,[W1,B1,W2,B2])
    W1.assign_sub(learn_rate*grads[0])
    B1.assign_sub(learn_rate*grads[1])
    W2.assign_sub(learn_rate*grads[2])
    B2.assign_sub(learn_rate*grads[3])
    if i % display_step==0:
        print("i:%i,TrainAcc:%f,TrainLoss:%f,TestAcc:%f,TestLoss:%f"%(i,accuracy_train,Loss_train,accuracy_test,Loss_test))
#结果可视化
plt.figure(figsize=(10,3))

plt.subplot(121)
plt.plot(cce_train,color="blue",label="train")
plt.plot(cce_test,color="red",label="test")
plt.xlabel("Iteration")
plt.ylabel("Loss")
plt.legend()
plt.subplot(122)

plt.plot(acc_train,color="blue",label="train")
plt.plot(acc_test,color="red",label="test")
plt.xlabel("Iteration")
plt.ylabel("Accuracy")
plt.legend()

plt.show()

② 结果记录
单层神经网络
在这里插入图片描述

多层神经网络
在这里插入图片描述

③ 实验总结
#参learn_rate = 0.5,iter = 100,display_step = 5其中神经网络的学习速度主要根据训练集上代价函数下降的快慢有关,而最后的分类的结果主要跟在验证集上的分类正确率有关。因此可以根据该参数主要影响代价函数还是影响分类正确率进行分类。超参数调节可以使用贝叶斯优化。

题目二:

使用低阶API实现Softmax函数和交叉熵损失函数,并使用它们修改题目一,看下结果是否相同。
① 代码

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = "SimHei"
gpus = tf.config.experimental.list_physical_devices('GPU')
#
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
#
TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
train_path = tf.keras.utils.get_file(TRAIN_URL.split('/')[-1], TRAIN_URL)
TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"
test_path = tf.keras.utils.get_file(TEST_URL.split('/')[-1], TEST_URL)
#
df_iris_train = pd.read_csv(train_path, header=0)
df_iris_test = pd.read_csv(test_path, header=0)
#
iris_train = np.array(df_iris_train)  # (120.5)
iris_test = np.array(df_iris_test)  # (30.5)
#
x_train = iris_train[:, 0:4]  # (129,4)
y_train = iris_train[:, 4]  # 〔120,)
x_test = iris_test[:, 0:4]  # (38.4)
y_test = iris_test[:, 4]  # (38.)
#
x_train = x_train - np.mean(x_train, axis=0)  # (dtype(float64))
x_test = x_test - np.mean(x_test, axis=0)  # 〔dtype(float64))
#
X_train = tf.cast(x_train, tf.float32)
Y_train = tf.one_hot(tf.constant(y_train, dtype=tf.int32), 3)
X_test = tf.cast(x_test, tf.float32)
Y_test = tf.one_hot(tf.constant(y_test, dtype=tf.int32), 3)
#
learn_rate = 0.5
iter = 100
display_step = 5
#
np.random.seed(612)
W = tf.Variable(np.random.randn(4, 3), dtype=tf.float32)
B = tf.Variable(np.zeros([3]), dtype=tf.float32)
acc_train = []
acc_test = []
cce_train = []
cce_test = []

for i in range(0, iter + 1):
    with tf.GradientTape() as tape:
        PRED_train = tf.exp(tf.matmul(X_train, W) + B)
        Loss_train = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_train, y_pred=PRED_train))
    PRED_test = tf.exp(tf.matmul(X_test, W) + B)
    Loss_test = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=Y_test, y_pred=PRED_test))

    accuracy_train = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(), axis=1), y_train), tf.float32))
    accuracy_test = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_test.numpy(), axis=1), y_test), tf.float32))

    acc_train.append(accuracy_train)
    acc_test.append(accuracy_test)
    cce_train.append(Loss_train)
    cce_test.append(Loss_test)

    grads = tape.gradient(Loss_train, [W, B])
    W.assign_sub(learn_rate * grads[0])  # dLdm_(4.5)
    B.assign_sub(learn_rate * grads[1])  # gdL_db_(3.2
    if i % display_step == 0:
        print("i: %i. TrainAcc:%f. TrainLoss: %f , TestAcc:%f. TestLoss: %f" % (
        i, accuracy_train, Loss_train, accuracy_test, Loss_test))
#
plt.figure(figsize=(10, 3))
plt.suptitle("训练集和测试集的损失曲线和迭代率曲线", fontsize=20)
plt.subplot(121)
plt.plot(cce_train, color="blue", label="train")
plt.plot(cce_test, color="red", label="test")
plt.xlabel("Iteration")
plt.ylabel("Loss")
# plt.title(“训练集和测过集的杨先曲线”,fontsize=18)
plt.legend()

plt.subplot(122)
plt.plot(acc_train, color="blue", label="train")
plt.plot(acc_test, color="red", label="test")
plt.xlabel("Iteration")
plt.ylabel("Accuracy")
# plt.titLe(“清练集和测试寨的选代率曲线”,fonts1ze=1日)
plt.legend()
plt.show()

② 实验结果
在这里插入图片描述

选做题:
题目一:
选择两种鸢尾花的属性,采用神经网络模型,对变色鸢尾和维吉尼亚鸢尾进行分类,并参考MOOC中的PPT11.4.2,绘制分类图。
要求:
⑴编写代码实现上述要求;
⑵两种类型的决策边界是直线还是曲线?为什么?观察实验结果,和你的想法是否一致。
① 代码
② 结果记录
③ 实验总结
题目二:
使用第11讲拓展题数据集,设计多层神经网络,实现对良/恶性乳腺癌肿瘤的预测,并以恰当的形式展现训练过程和结果。
要求:
⑴尝试改变超参数和使用的属性,使网络达到最佳性能;
⑵对实验过程和结果进行对比和分析,并给出简要总结。
① 代码
② 结果记录
③ 实验总结

4.实验小结&讨论题

①在神经网络中,激活函数的作用是什么?常用的激活函数有哪些?在多分类问题中,在输出层一般使用使用什么激活函数?隐含层一般使用使用什么激活函数?为什么?
答:激活函数的作用是去线性化;常用到激活函数:tanh,ReL,Sigmoid;Sigmoid函数用于输出层,tanh函数用于隐含层。

②什么是损失函数?在多分类问题中,一般使用什么损失函数?为什么?
答:损失函数是用来评估模型的预测值与真实值不一致的程度
(1)L1范数损失L1Loss
(2)均方误差损失MSELoss
(3)交叉熵损失CrossEntropyLoss

③神经网络的深度和宽度对网络性能有什么影响?
答:如果一个深层结构能够刚刚好解决问题,那么就不可能用一个更浅的同样紧凑的结构来解决,因此要解决复杂的问题,要么增加深度,要么增加宽度。但是神经网络一般来说不是越深越好,也不是越宽越好,并且由于计算量的限制或对于速度的需求,如何用更少的参数获得更好的准确率无疑是一个永恒的追求。

④训练数据和测试数据对神经网络的性能有何影响?在选择、使用和划分数据集时,应注意什么?
答:注意使用的范围和整体效果。

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

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

相关文章

Packet Tracer - 第 2 层安全

Packet Tracer - 第 2 层安全 目标 将 Central 交换机指定为根网桥。 保护生成树参数的安全,以防止 STP 恶意操纵 攻击。 启用端口安全以防御 CAM 表泛洪攻击。 拓扑图 背景/ 场景 最近网络遭到了一些 攻击。出于此原因,网络管…

2022年平均工资揭晓!2022年IT行业平均工资超高!最赚钱的行业是......IT! 看看最赚钱的职位是什么?

2022年平均工资发布!最赚钱的行业是…IT 文章目录 2022年平均工资发布!最赚钱的行业是......IT2022年城镇非私营单位就业人员年平均工资按区域、行业门类、登记注册类型分组的城镇非私营单位就业人员年平均工资: 附注:2022年城镇私…

为AIGC敲响警钟!千亿级赛道为何成了作恶温床?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 随着人工智能通用大模型的问世,全球对AIGC技术的强大潜力有了更加深刻的认识。然而,这也引发了诸多关于AIGC技术可信度、隐私保护以及知识产权等问题的争议,引起了广泛关注。 5月9日&…

Windows安装两个MySQL【5.7 + 8.0】

目录 1、下载MySQL82、解压、放置3、配置3-1 添加环境变量3-2 配置文件 my.ini3-3 配置 MySQL 服务3-4 root 通过IP访问 4、连接 ✨ 已安装 MySQL5,再加装MySQL8 1、下载MySQL8 https://dev.mysql.com/downloads/mysql/ MySQL :: Download MySQL Community Server…

VScode 中运行C++,并用g++命令、CMake、配置launch.josn和tasks.json来运行和调试可执行文件

前期安装准备 安装VScode、cmake、mingw32 (具体版本如下) VSCodeUserSetup-x64-1.78.0.exe cmake-3.26.3-windows-x86_64.msi x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 将这几个的bin目录加入系统环境变量(右击此电脑&#xff0c…

Java基础之ConcurrentHashMap答非所问

ConcurrentHashMap的数据结构是什么? ConcurrentHashMap仅仅是HashMap的线程安全版本,针对HashMap的线程安全优化,所以HashMap有的特点ConcurrentHashMap同意具有, ConcurrentHashMap的数据结构跟HashMap是一样的。 在JDK7版本使用…

中学理化生实验室建设及配置要求

中学理化生实验室是中学阶段进行物理、化学、生物教学和研究的场所。其可以满足实验教学要求,实验室提供必要的仪器、设备、工具、材料等课程资源,方便学生熟悉并接触一些实验仪器设备,学习掌握基本实验技能。同时,实验室科学合理的方案配置&…

MySQL原理(十):主从架构

前言 上一篇介绍了 MySQL 的表分区和分库分表,这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种: 一主多从架构:适用于读大于写的场景,采用多个从库来分担数据库系统的读压力。多主架构:适用于…

康希诺生物:新冠疫苗影响当期业绩,毛利润减少89.92%

来源;猛兽财经 作者:猛兽财经 猛兽财经获悉,由于4月28日,康希诺生物(06185)发布2023年一季度报告,收入同比下滑及利润端亏损,主要由于新冠疫苗需求量同比大幅下降,以及产品价格调整…

在 IDEA 中创建 Java Web 项目的方式(详细步骤教程)

开发环境 以下是我的开发环境 JDK 1.8Maven 3.6.3Tomcat 9.0IDEA 2019(2019 无所畏惧,即使现在已经 2023 年了哈哈哈) 最原始的 Java Web 项目 下面的内容可能会因 IDEA 版本不同,而有些选项不同,但是大同小异。 …

【上进小菜猪】使用Ambari提高Hadoop集群管理和开发效率:提高大数据应用部署和管理效率的利器

📬📬我是上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货,欢迎关注。 介绍 Hadoop是一种开源的分布式处理框架,用于在一组低成本硬件的集群上存储和处理大规模数据集。Ambari是一种基…

python 获取cookie的方法

在 Web应用程序中,用户访问网站时,通常会请求访问服务器上保存的一些用户信息(例如: Cookie),这些信息包含了用户的一些个人信息,比如:姓名、地址、密码等。对于用户来说&#xff0c…

目标检测YOLO实战应用案例100讲-基于YOLOv3的目标检测研究及改进(论文篇)

知识拓展 多尺度特征学习 目前深度学习用于目标检测已经习以为常。从SSD到Yolo系列,其中: 深层网络的感受野比较大,语义信息表征能力强,但是特征图的分辨率低,几何信息的表征能力弱(空间几何特征细节缺乏); 低层网络的感受野比较小,几何细节信息表征能力强,虽然分辨…

国漫画江湖之不良人6真的封神!

国漫画江湖之不良人6真的封神! 今天不良人第六季大结局,真的超好看,不仅剧情完整,而且还非常甜,看的非常爽,时长直接拉到40分钟,打斗场面刺激,简直是语言形容不出来的爽&#xff01…

[PyTorch]Onnx模型格式的转换与应用

相较于PyTorch默认的模型存储格式pth而言,onnx具有多端通用,方便部署的优点(据称能加快推理速度,但是未验证),本文将介绍如何使用onnx并将原有的pth权重转换为onnx。 一、配置环境 在控制台中使用如下指令 …

【wordpress】管理员忘记密码? 三种方法找回

随着近年来网络攻击日趋频繁,我们在网站中所设置的各种密码也变得越来越复杂,wordpress现在也可以生成非常复杂的密码,以防止被暴力破解。 但这些复杂的密码一般是无法记住的,我们会将此存放在我们的记事本中 如果我们的记事本遗…

Linux--install and uninstall app

1. deb系列(Ubuntu为例) 1.2 mysql 参考链接 1.2.1 Install 1.2.1.1 方法一 #1.更新仓库 sudo apt update #2.安装库中mysql版本 sudo apt install mysql-server -y1.2.1.2 方法二 mysql官网下载 #1.下载指定版本 #2.装载该版本至系统仓库 sudo …

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程1.实验环境2.RAR加密压缩包 (一)john软件1.使用CMD命令: run\rar2john.exe &am…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(二)(共识网络分析-第二步-构建网络与模块-一步法)

1写在前面 最近遇到了非常不讲理的病人和家属,真是忍不住想要吐槽两句。😤 为了让病人做上手术,求了输血科半天才给备了血,家属也答应去献血。😒 万万没想到,术后都2天了还是没去献血,无论是问病…

达索系统助力中车制造运营管理(MOM)平台建设

案例背景: 中国中车股份有限公司(中文简称“中国中车”,英文简称缩写“CRRC”)承继了中国北车股份有限公司、中国南车股份有限公司的全部业务和资产,是全球规模领先、品种齐全、技术一流的轨道交通装备供应商。 中国…