Tensorflow2 中模型训练标签顺序和预测结果标签顺序不一致问题解决办法

    本篇文章将详细介绍Tensorflow2.x中模型训练标签顺序和预测结果标签顺序不一致问题,这个问题如果考虑不周,或者标签顺序没有控制好的情况下会出现预测结果精度极其不准确的情况。

    训练数据集的结构:数据集有超过10的类别数,这里包含16类数据,每个类别放置到一个文件夹中,文件夹名称按照其类别命名为1,2,3……16。文件夹结构如下图所示:

    这组数据在系统中的排序是1,2,3,4,……顺序排序的。

一、Tensorflow2.数据读取的顺序

    使用Tensorflow读取数据,代码如下:

data_all = tf.keras.preprocessing.image_dataset_from_directory(data_dir,labels='inferred',batch_size=batch_size,image_size=(img_height, img_width),shuffle=False  # 关闭洗牌以保持与文件夹中图像的顺序一致)

    按照有的说明,tf.keras.preprocessing.image_dataset_from_directory()函数是按照文件夹中的排序读取的数据,但实际上并不是。我们来查看一下这个函数读取的数据是什么顺序,这里直接使用一下一行代码:

class_names = data_all.class_namesprint("类别标签:", class_names)

    看看输出结果是什么:

类别标签: ['1', '10', '11', '12', '13', '14', '15', '16', '2', '3', '4', '5', '6', '7', '8', '9']

    这里我们可以看到,以上函数读取的数据顺序和文件夹中的顺序并不一致,因此,我们在进行精度评的时候一定要保持这个标签的顺序一致。

二、Tensorflow2.数据预测结果的顺序

    Tensorflow2.训练的模型预测出来的结果是按照0,1,2,……编码顺序编码的,也就是说,训练数据集中第1类预测出来的标签代码实0,第2类是1,第3类是2.

    在这里我们进行评估时,如果是使用以下代码进行训练和评估时,训练集和测试集数据顺序一致,所以不会出现什么问题。

train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.7,subset='training',seed=123,image_size=(img_height, img_width),batch_size=batch_size)
test_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.7,subset='validation',seed=123,image_size=(img_height, img_width),batch_size=batch_size)

    不过预测出来的标签和我们的类别不一致,这时候我们需要将两者变换为一致,我们可以通过建立一个类别对应关系的字典来进行变换,使预测的标签值变换为实际类别代码如下:

label_dict={'0': 1, '1': 10, '2': 11, '3': 12, '4': 13, '5': 14, '6': 15,'7': 16, '8': 2, '9': 3, '10': 4, '11': 5, '12': 6,'13': 7, '14': 8,'15': 9}print(label_dict)# 将原始标签映射到调整后的标签adjusted_labels = [label_dict[str(label)] for label in original_labels]df[adjusted_name] = adjusted_labels

通过以上代码,可以将预测的标签值变换为实际类别ID.

三、如何按指定顺序读取数据?

    对于这个问题,我们可以通过修改文件夹名称来控制数据读取的顺序,比如将文件夹名称改为01,02,03,……16.或者按照字母a,b,c,d……的顺序来控制顺序。不过这样对后面评价计算的时候也有不好的影响,评价函数通常是使用数值类别来进行评价计算的,所以用字母的话后面也还需要再进行类别代码的转换。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

私有云:【3】NFS存储服务器的安装

私有云:【3】NFS存储服务器的安装 1、使用vmwork创建虚拟机2、配置NFS服务器3、安装NFS存储服务4、配置NFS服务及创建存储共享 1、使用vmwork创建虚拟机 新建虚拟机NFS 分配400G硬盘,可以更高【用作存储】 自定义硬件 选择win2012的iso文件 设置登录密码…

python爬虫request和BeautifulSoup使用

request使用 1.安装request pip install request2.引入库 import requests3.编写代码 发送请求 我们通过以下代码可以打开豆瓣top250的网站 response requests.get(f"https://movie.douban.com/top250")但因为该网站加入了反爬机制,所以…

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示:在设置代理之前,请确保您已经安装了 浏览器。 🔧 设置代理的详细步骤如下: 打开 浏览器,输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

C++----模板进阶

文章目录 非类型模板参数STL知识补充 类模板的特化函数模板特化类模板特化偏特化 模板的分离编译模板总结 非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参…

Seata入门系列【15】@GlobalLock注解使用场景及源码分析

1 前言 在Seata 中提供了一个全局锁注解GlobalLock,字面意思是全局锁,搜索相关文档,发现资料很少,所以分析下它的应用场景和基本原理,首先看下源码中对该注解的说明: // 声明事务仅在单个本地RM中执行 //…

Docker Harbor概述及构建

Docker Harbor概述及构建 一、Docker Harbor 概述1.1、harbor 简介1.2、Harbor的优势1.3、Harbor 的核心组件1.4、Docker私有仓库 架构 二、Harbor构建Docker私有仓库2.1 环境配置2.2、部署Harbor服务2.2.1、上传dock-compose,并设置权限2.2.2、安装harbor-offline-…

软考系列(系统架构师)- 2011年系统架构师软考案例分析考点

试题一 软件架构(质量属性效用树、架构风险、敏感点、权衡点) 【问题2】(13分) 在架构评估过程中,需要正确识别系统的架构风险、敏感点和权衡点,并进行合理的架构决策。请用300字以内的文字给出系统架构风险…

MySQL主从复制(基于binlog日志方式)

目录 一、什么是主从复制?二、主从复制原理、存在问题和解决方法2.1.主从复制原理2.2.主从复制存在的问题以及解决办法2.3.主从复制的同步模型2.4.拓展—Mysql并行复制 三、主从复制之基于binlog日志方式3.1.bin-log日志简介3.2.bin-log的使用3.2.1.开启binlog3.2.2…

windows 安装小乌龟

这是什么 这里简单描述一下在windows上如何安装GIT代码管理工具和使用小乌龟版本来调用GIT,并且配置一下git相关信息,可以使用小乌龟来操作代码。也有一些常规git使用方法。 需要的资源 Git-2.42.0-64-bit.exe(这个是git代码管理工具&…

[已解决]安装的明明是pytorch-gpu,但是condalist却显示cpu版本,而且torch.cuda.is_available 也是flase

问题; 安装了gpu版本的pytorch,但是显示的torch.cuda.is_available()却是flase。 conda list查看 版本显示只有cpuonly 在网上找了半天,也没有解决办法。 仔细看了一下,发现,有个单独的包叫cpuonly,不知道…

【Python爬虫三天从0到1】Day1:爬虫核心

目录 1.HTTP协议与WEB开发 (1)简介 (2)请求协议和响应协议 2. requests&反爬破解 (1)UA反爬 (2)referer反爬 (3)cookie反爬 3.请求参数 &#x…

SpringBoot内置工具类之断言Assert的使用与部分解析

先例举一个service的demo中用来验证参数对象的封装方法,使用了Assert工具类后是不是比普通的 if(xxx) { throw new RuntimeException(msg) } 看上去要简洁多了? 断言Assert工具类简介 断言是一个判断逻辑,用来检查不该发生的情况&#xff…