【神经网络】tensorflow实验9--分类问题

1. 实验目的

①掌握逻辑回归的基本原理,实现分类器,完成多分类任务;

②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。

2. 实验内容

①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等,并在此基础上建立逻辑回归模型,完成分类任务;

②能够使用MatPlotlib绘制分类图。

  1. 实验过程

题目一:

观察6.5.3小节中给出的鸢尾花数据集可视化结果(如图1所示),编写代码实现下述功能:(15分)

 

图1 鸢尾花数据集

要求:

⑴选择恰当的属性或属性组合,训练逻辑回归模型,区分山鸢尾和维吉尼亚鸢尾,并测试模型性能,以可视化的形式展现训练和测试的过程及结果。

⑵比较选择不同属性或属性组合时的学习率、迭代次数,以及在训练集和测试集上的交叉熵损失和准确率,以表格或合适的图表形式展示。

⑶分析和总结:

区分山鸢尾和维吉尼亚鸢尾,至少需要几种属性?说明选择某种属性或属性组合的依据;通过以上结果,可以得到什么结论,或对你有什么启发。

 代码

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib as mpl
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)
df_iris=pd.read_csv(train_path,header=0)
iris=np.array(df_iris)#把二维数据表转化成二维numpy数组
train_x=iris[:,0:2]#取花萼的长度和宽度
train_y=iris[:,4]#取最后一列作为标签值
x_train=train_x[train_y!=1]  #提取山鸢尾与维吉尼亚鸢尾
y_train=train_y[train_y!=1]


#使用花萼长度和花萼宽度作为样本画散点图
num=len(x_train)
cm_pt=mpl.colors.ListedColormap(['b','r'])
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)  #色彩方案
# plt.show()
#使用花萼长度和花萼宽度作为样本画散点图 中心化后的图
x_train=x_train-np.mean(x_train,axis=0)   #属性中心化  按列
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)
# plt.show()

#生成多元模型的属性矩阵和标签列向量X,Y
x0_train=np.ones(num).reshape(-1,1)
X=tf.cast(tf.concat((x0_train,x_train),axis=1),tf.float32)
Y=tf.cast(y_train.reshape(-1,1),tf.float32)

#设置超参数
learn_rate=0.03
iter=50
display_step=10

#设置模型变量初始值
np.random.seed(612)
W=tf.Variable(np.random.randn(3,1),dtype=tf.float32)

#训练模型
ce=[]#保存每次交叉熵损失
acc=[]#保存准确率
for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        PRED=1/(1+tf.exp(-tf.matmul(X,W)))
        Loss=-tf.reduce_mean(Y*tf.math.log(PRED)+(1-Y)*tf.math.log(1-PRED))
        accuracy=tf.reduce_mean(tf.cast(tf.equal(tf.where(PRED.numpy()<0.5,0.,1.),Y),tf.float32))
        ce.append(Loss)
        acc.append(accuracy)#加入数据
        dL_dW=tape.gradient(Loss,W)
        W.assign_sub(learn_rate*dL_dW)
        if i % display_step ==0:
            print('i:%i,Acc:%f,Loss:%f'%(i,accuracy,Loss))
#可视化
plt.figure(figsize=(5,3))
plt.plot(ce,color='b',label='Loss')
plt.plot(acc,color='r',label='acc')
plt.legend()
# plt.show()

#绘制决策边界
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)
x_=[-1.5,1.5]
y_=-(W[1]*x_+W[0]/W[2])
plt.plot(x_,y_,color='g')
# plt.show()

np.random.seed(612)
W=tf.Variable(np.random.randn(3,1),dtype=tf.float32)
cm_pt=mpl.colors.ListedColormap(['b','r'])
x_=[-1.5,1.5]
y_=-(W[0]+W[1]*x_)/W[2]


#绘制训练集的散点图
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)
plt.plot(x_,y_,color='r',lw=3)
plt.xlim([-1.5,1.5])
plt.ylim([-1.5,1.5])


#在训练过程中显示训练结果
ce=[]
acc=[]
for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        PRED=1/(1+tf.exp(-tf.matmul(X,W)))
        Loss=-tf.reduce_mean(Y*tf.math.log(PRED)+(1-Y)*tf.math.log(1-PRED))
        accuracy=tf.reduce_mean(tf.cast(tf.equal(tf.where(PRED.numpy()<0.5,0.,1.),Y),tf.float32))
        ce.append(Loss)
        acc.append(accuracy)
        dL_dW=tape.gradient(Loss,W)
        W.assign_sub(learn_rate*dL_dW)
        if i % display_step ==0:
            print('i:%i,Acc:%f,Loss:%f'%(i,accuracy,Loss))
            y_=-(W[0]+W[1]*x_)/W[2]
            plt.plot(x_,y_)
plt.show()

 结果记录

 

③ 实验总结

在训练集上训练的模型在测试集上也有比较好的效果,超参数需要不断调试才能达到一个比较好的效果.

题目二:

在Iris数据集中,分别选择2种、3种和4种属性,编写程序,区分三种鸢尾花。记录和分析实验结果,并给出总结。(20分)

⑴确定属性选择方案。

⑵编写代码建立、训练并测试模型。

⑶参考11.6小节例程,对分类结果进行可视化。

⑷分析结果: 

比较选择不同属性组合时的学习率、迭代次数、以及在训练集和测试集上的交叉熵损失和准确率,以表格或合适的图表形式展示。

(3)总结:

通过以上分析和实验结果,对你有什么启发。

  代码

import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Droid Sans Fallback']
# 下载鸢尾花数据集
TRAIN_URL = 'http://download.tensorflow.org/data/iris_training.csv'
TEST_URL = 'http://download.tensorflow.org/data/iris_test.csv'
# 获取文件名
train_path = tf.keras.utils.get_file(TRAIN_URL.split('/')[-1], TRAIN_URL)
test_path = tf.keras.utils.get_file(TEST_URL.split('/')[-1], TEST_URL)
COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']

df_iris_train = pd.read_csv(train_path, header=0)
iris_train = np.array(df_iris_train)

# 提取长度,宽度
# x_train = iris_train[:, 2:4]
# y_train = iris_train[:, 4]

#花萼宽度、花瓣长度、花瓣宽度
x_train = iris_train[:, 1:3]
y_train = iris_train[:, 4]
x_train=x_train[y_train>0]
y_train=y_train[y_train>0]
num_train = len(x_train)
#处理数据
x0_train = np.ones(num_train).reshape(-1, 1)
X_train = tf.cast(tf.concat([x0_train, x_train], axis=1), tf.float32)
Y_train = tf.one_hot(tf.constant(y_train, dtype=tf.int32), 3)

#设置超参数 设置模型参数初始值
learn_rate = 0.2
iter = 500
display_step = 50
np.random.seed(612)
W = tf.Variable(np.random.randn(3,3), dtype=tf.float32)

#训练模型
acc = []
cce = []
for i in range(0, iter + 1):
    with tf.GradientTape() as tape:
        PRED_train = tf.nn.softmax(tf.matmul(X_train, W))
        Loss_train = -tf.reduce_sum(Y_train * tf.math.log(PRED_train)) / num_train
    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(), axis=1), y_train), tf.float32))
    acc.append(accuracy)
    cce.append(Loss_train)
    dL_dW = tape.gradient(Loss_train, W)
    W.assign_sub(learn_rate * dL_dW)
    if i % display_step == 0:
        print('i:%i,Acc: %f,Loss: %f' % (i, accuracy, Loss_train))

#绘制分类图
M = 500
x1_min, x2_min = x_train.min(axis=0)
x1_max, x2_max = x_train.max(axis=0)
t1 = np.linspace(x1_min, x1_max, M)
t2 = np.linspace(x2_min, x2_max, M)
m1, m2 = np.meshgrid(t1, t2)
m0 = np.ones(M * M)
X_ = tf.cast(np.stack((m0, m1.reshape(-1), m2.reshape(-1)), axis=1), tf.float32)
Y_ = tf.nn.softmax(tf.matmul(X_, W))
Y_ = tf.argmax(Y_.numpy(), axis=1)  #转化为自然顺序码,决定网格颜色
n = tf.reshape(Y_, m1.shape)

#绘制分类图
plt.figure(figsize=(8, 6))
cm_bg = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
plt.pcolormesh(m1, m2, n, cmap=cm_bg)
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap='brg')
plt.show()

 结果记录

 

③ 实验总结

在训练集上训练的模型在测试集上也有比较好的效果,超参数需要不断调试才能达到一个比较好的效果.

学习率

训练轮数

测试损失值

测试集准确率

所花时间

1

1e-3

1000

0.483739

87.2%

1.73s

2

1e-4

10000

0.483747

87.2%

16.68s

3

5e-2

1000

0.211227

93.6%

1.73s

拓展题(选做):

乳腺癌肿瘤数据集,由威斯康辛大学麦迪逊医院的William博士提供,可在UCI数据库(加州大学欧文分校提出的用于机器学习的数据库)里下载。

下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data

该数据集中有699个乳腺癌肿瘤样本,每个样本包含10个属性和1个肿瘤标签,其结构如图1所示。第1列为id号,第2-10列为肿瘤特征,第11列为肿瘤的标签。每个属性的属性值均为0-9之间的整数,标签值取2或4,2表示良性、4表示恶性。

 

1 乳腺癌肿瘤数据集(前5行数据)

要求:

⑴下载并划分数据集:

下载数据集,合理划分为训练集和测试集;

⑵数据预处理:

数据集中有16处缺失值,用“?”表示,在将数据输入模型之前,需要对这些缺失值进行处理。首先将“?”替换为NaN,再丢弃缺失值所在的样本,最后对已经丢弃缺失值的数组索引进行重置;

相关函数:

序号

函数

函数功能

函数相关库

(1)

对象名.replace(to_replace=’?’,value=np.nan)

将问号替换为NaN

Python内置函数

(2)

对象名.dropna()

丢弃缺失值

Pandas库

(3)

对象名.reset_index()

索引重置

Pandas库

(3)建立逻辑回归模型,使用属性“肿块密度”和“细胞大小的均匀性”训练模型,综合考虑准确率、交叉熵损失、和训练时间等,使模型在测试集达到最优的性能,并以合适的形式展现训练过程和结果;

(4)选择其他属性或属性组合训练模型:

尝试选择数据集中的其他属性或者属性组合,训练和测试逻辑回归模型,并展现训练过程和结果;

(5)分析和总结:

比较采用不同的属性或属性组合训练模型时,学习率、迭代次数,以及交叉熵损失、准确率和模型训练时间等,以表格或其他合适的图表形式展示。通过以上结果,可以得到什么结论,或对你有什么启发。

 代码

 结果记录

③ 实验总结

3. 实验小结&讨论题

实现分类问题的一般步骤是什么?实现二分类和多分类问题时有什么不同之处?哪些因素会对分类结果产生影响?

答:1.问题的提出2.神经网络模型的搭建和训3.结果展示

多分类:

每个样本只能有一个标签,比如ImageNet图像分类任务,或者MNIST手写数字识别数据集,每张图片只能有一个固定的标签。

对单个样本,假设真实分布为,网络输出分布为,总的类别数为,则在这种情况下,交叉熵损失函数的计算方法如下所示,我们可以看出,实际上也就是计算了标签类别为1的交叉熵的值,使得对应的信息量越来越小,相应的概率也就越来越大了。

二分类:

对于二分类,既可以选择多分类的方式,也可以选择多标签分类的方式进行计算,结果差别也不会太大

将数据集划分为训练集和测试集时,应该注意哪些问题?改变训练集和测试集所占比例,对分类结果会有什么影响?

答:同样的迭代次数,和学习率下,随着训练集的比例逐渐变大,训练集交叉熵损失大致变小准确率变高的趋势,测试集交叉熵损失大致变大准确率变高的趋势。

③当数据集中存在缺失值时,有哪些处理的方法?查阅资料并结合自己的思考,说明不同处理方法的特点和对分类结果的影响。

答:(1)删除,直接去除含有缺失值的记录,适用于数据量较大(记录较多)且缺失比较较小的情形,去掉后对总体影响不大。

   (2)常量填充,变量的含义、获取方式、计算逻辑,以便知道该变量为什么会出现缺失值、缺失值代表什么含义。

   (3)插值填充,采用某种插入模式进行填充,比如取缺失值前后值的均值进行填充。

   (4)KNN填充

   (5)随机森林填充,随机森林算法填充的思想和knn填充是类似的,即利用已有数据拟合模型,对缺失变量进行预测。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tomcat集群下的session共享和负载均衡

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

人工智能洗稿-免费自媒体洗稿工具

文字洗稿 文字洗稿是指通过修改、重组、删除、替换等手段对文本进行优化、清理和调整&#xff0c;以达到改善文章质量、增加独特性和提高可读性的目的。文字洗稿是自媒体行业的一个重要需求&#xff0c;尤其是在批量撰写文章或需要大量修改文本的情况下。文字洗稿分为自动洗稿…

如何用ChatGPT搭建品牌文本体系?(品牌名+slogan+品牌故事)

该场景对应的关键词库&#xff08;26个&#xff09;&#xff1a; 品牌名、奶茶、中文名、情感联想度、饮料、价值观/理念、发音、slogan、产品功能导向、行业性质导向、经营理念导向、消费者观念导向、口语化、修辞手法、品牌故事、创始人初心品牌故事、里程碑事件故事、产品初…

Intellij中使用Spotless 格式化代码

Spotless简介 在一些大型项目或开源项目&#xff0c;由于开发人员太多&#xff0c;导致各个代码格式不统一。会让整体项目的代码可读性变差。统一代码格式使用maven中的Spotless插件就是不错的选择。 Spotless 是一个代码格式化工具&#xff0c;它有以下功能&#xff1a; 支…

第6章 静态代理

第6章 静态代理 把所有静态资源的访问改为访问nginx&#xff0c;而不是访问tomcat&#xff0c;这种方式叫静态代理。因为nginx更擅长于静态资源的处理&#xff0c;性能更好&#xff0c;效率更高。 ​ 所以在实际应用中&#xff0c;我们将静态资源比如图片、css、html、js等交…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…

第二章——进程与线程(上)

上船不思岸上人&#xff0c;下船不提船上事 文章目录 2.1.1 进程的概念&#xff0c;组成&#xff0c;特征知识总览进程的概念进程的组成——PCB程序是如何运行的进程的组成进程的特征知识回顾 2.1.2 进程的状态与转换&#xff0c;进程的组织知识总览创建态&#xff0c;就绪态运…

yolov5 8系列 labelme数据标注 并生成训练数据集

yolov5 8系列 labelme数据标注 数据集生成终极教程 一.数据集准备二.转换为yolo 数据集 一.数据集准备 创建一个data 文件夹在data文件夹下创建一个images 文件夹将所有图片数据放入images文件夹下 使用labelme标注数据 python环境下使用 pip install labelme 安装labelme在c…

缓存击穿,穿透,雪崩

一、缓存击穿 单个热点key&#xff0c;在不停的扛着大并发&#xff0c;在这个key失效的瞬间&#xff0c;持续的大并发请求就会击破缓存&#xff0c;直接请求到数据库 解决方案 使用互斥锁&#xff08;Mutex Key&#xff09;&#xff0c;只让一个线程构建缓存&#xff0c;其他…

Golang中的运算符

目录 运算符 算术运算符 代码案例&#xff1a; 关系运算符 代码案例&#xff1a; 逻辑运算符 代码案例&#xff1a; 位运算符 代码案例&#xff1a; 赋值运算符 代码案例&#xff1a; 其他运算符 运算符 算术运算符 Go语言中的算术运算符包括加、减、乘、除和取模…

4.2和4.3、MAC地址、IP地址、端口

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 4.2和4.3、MAC地址、IP地址、端口 1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码 3.端口①简介②端口类型 1.MAC地址的简介 …

Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

文章目录 第一步 M1芯片安装Pytorch环境安装Miniforge创建虚拟环境安装Pytorch 第二步 下载李沐Jupyter文件第三步 配置vscode参考 第一步 M1芯片安装Pytorch环境 安装Miniforge Mac打开终端&#xff08;Mac电脑如何启动终端&#xff1f;打开启动台&#xff0c;搜索终端即可&…

Python 中 随机数 random库 学习与使用

python中的随机数应用大体包含&#xff0c;随机整数、随机浮点数 和 获取随机数序列三类。 一. 随机整数 1.1 随机整数&#xff0c;包含上下限&#xff08;闭区间&#xff09; randint(a, b)&#xff1a;随机选取 [a, b] 之间的一个整数&#xff0c;随机整数包含a 和 b&#…

Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源

Windows资源是一种二进制数据&#xff0c;由链接器链接进程序成为程序的一部分&#xff0c;通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的&#xff0c;也可以是用户自定义的。在本篇文章中为大家讲解菜单资源&#xff0c;上下文菜单&#…

PMP证书“扫盲”时间2023年考证人快看过来

二&#xff0c;PMP报考指南 学历与工作经验要求&#xff1a; 本科及以上学历&#xff0c;三年或以上的项目管理工作经验&#xff1b; 专科及以上学历&#xff0c;五年或以上的项目管理工作经验。 项目管理培训&#xff1a;35小时以上的项目管理教育/培训。 备注&#xff1…

Unity Audio -- (3)创建3D音效

本节会添加场景中小瀑布的音效。小瀑布的音效会有一个作用范围&#xff0c;也会根据角色所处的位置不同&#xff0c;产生不同的效果。 添加小瀑布的声音 1. 在Hierarchy中&#xff0c;点击右键&#xff0c;选择Audio -> Create Audio Source&#xff0c;将这个新的Audio So…

NOA上车「清一色」自主品牌,哪些供应商正在突围前线

随着入门级L2进入普及周期&#xff0c;以NOA&#xff08;高速、城区&#xff09;为代表的L2/L2赛道&#xff0c;正在成为主机厂、硬件供应商、算法及软件方案商的下一波市场制高点的争夺阵地。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-3月中国市场&#xff08;不含…

MySQL基础(十一)数据处理之增删改

1. 插入数据 1.1 实际问题 解决方式&#xff1a;使用 INSERT 语句向表中插入数据。 1.2 方式1&#xff1a;VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 情况1&#xff1a;为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....)…

第十五届吉林省赛个人题解【中档题(不过可能对你来说是简单题)】(H、G、C)

文章目录 H. Visit the Park(STL)G. Matrix Repair(思维题)C.Random Number Generator(BSGS算法) H. Visit the Park(STL) 题意&#xff1a;给你一个无向图&#xff0c;每条边上都有一个数码&#xff0c;然后给你一个路径&#xff0c;每次你必须从Ai走到Ai1&#xff08;直接走…
最新文章