Python深度学习基于Tensorflow(4)Tensorflow 数据处理和数据可视化

文章目录

      • 构建Tensorflow.data数据集
        • TFRecord数据底层
        • 生成TFRecord文件数据
        • 读取TFRecord文件数据
        • 图像增强
      • 数据可视化

构建Tensorflow.data数据集

tf.data.Dataset表示一串元素(element),其中每个元素包含一个或多个Tensor对象。例如:在一个图像流水线(pipeline)中,一个元素可以是单个训练样本,它们带有一个表示图像数据的张量和一个标签组成的数据对(pair)。有两种不同的方式构建一个数据集,具体如下。

  • 直接从 Tensor 创建数据集(例如 Dataset.from_tensor_slices());当然 NumPy 也是可以的,TensorFlow 会自动将其转换为 Tensor。
  • 通过对一个或多个 tf.data.Dataset 对象的变换(例如 Dataset.batch())来创建数据集。 这两类构建方法又可以进一步分为7种方法。如下所示:
数据格式读取方法备注
从NumPy数组读取tf.data.Dataset.from_tensor_slices当数据较小时
从Python Generator读取tf.data.Dataset.from_generator
从文本数据读取tf.data.TextLineDataset
从CSV数据读取tf.data.experimental.CsvDataset
从TFRecord data读取tf.data.TFRecordDatasetTFRecord 是TensorFlow中自带的,它是一种方便储存比较大的数据集的数据格式(二进制格式),当内存不足时,我们可以将数据集制作成TFRecord格式的再将其解压读取。
从二进制文件读取数据tf.data.FixedLengthRecordDataset
从文件集中读取数据tf.data.Dataset.list_files()
这里除了TFRecord以外的东西都很好理解,所以这里主要讲一下TFRecord数据集;

TFRecord 是 TensorFlow 自带的一种数据格式,是一种二进制文件。它是TensorFlow 官方推荐的数据保存格式,其数据的存储、读取操作更加高效。具体来说,TFRecord的优势可概括为:
1)支持多种数据格式;
2)更好的利用内存,方便复制和移动;
3)将二进制数据和标签(label)存储在同一个文件中。

TFRecord 格式文件的存储形式会很合理地帮我们存储数据。TFRecord 内部使用了 Protocol Buffer 二进制数据编码方案,它只占用一个内存块,只需要一次性加载一个二进制文件的方式即可,简单,快速,尤其对大型训练数据很友好。当我们的训练数据量比较大的时候,TFRecord可以将数据分成多个 TFRecord 文件,以提高处理效率。

假设有一万张图像, TFRecord 可以将其保存成 5 个.tfrecords 文件(具体保存成几个文件,要看文件大小),这样我们在读取数据时,只需要进行5 次数据读取。如果把这一万张图像保存为NumPy格式数据,则需要进行10000次数据读取。 我们可以使用tf.data.TFRecordDataset类读取TFRecord文件。

TFRecord数据底层

在数据转换过程中,Example是TFReocrd的核心,TFReocrd包含一系列Example,每个Example可以认为是一个样本。Example是Tensorflow的对象类型,可通过tf.train.example来使用。 特征指的是Example中输入向量的维度,有多少个维度就有多少个特征。

![[Pasted image 20240507123310.png]]

TFRecord,Example,features对应关系具体如下:

![[Pasted image 20240507124103.png]]

生成TFRecord文件数据

这里使用cat-dag数据集,数据下载连接如下:

链接:https://pan.baidu.com/s/1e9skHjPAzy9Bfd5Z7Xl70A?pwd=zynb 
提取码:zynb 

下载之后解压到当前目录的./data文件夹,然后读取文件位置和标签,最后依次写入TFRecord中

import tensorflow as tf
import os## 设置文件位置以及标签
data_dir = "./data/cat-dog"
train_cat_dir = data_dir + '/train/cats/'
train_dog_dir = data_dir + "/train/dogs/"test_cat_dir = data_dir + "/test/cats/"
test_dog_dir = data_dir + "/test/dogs/"train_cat_filenames = [train_cat_dir + filename for filename in os.listdir(train_cat_dir)]
train_dog_filenames = [train_dog_dir + filename for filename in os.listdir(train_dog_dir)]
train_filenames = train_cat_filenames + train_dog_filenames
train_labels = [0]*len(train_cat_filenames) + [1]*len(train_dog_filenames)test_cat_filenames = [test_cat_dir + filename for filename in os.listdir(test_cat_dir)]
test_dog_filenames = [test_dog_dir + filename for filename in os.listdir(test_dog_dir)]
test_filenames = test_cat_filenames + test_dog_filenames
test_labels = [0]*len(test_cat_filenames) + [1]*len(test_dog_filenames)## 创建生成TFRecord数据集函数
def encoder(filenames, labels, tfrecord_file):with tf.io.TFRecordWriter(tfrecord_file) as writer:for filename, label in zip(filenames, labels):with open(filename, 'rb') as f:image = f.read()## 将img,label转化为向量的形式  这里只能是普通的形式,不能np和tf,所以读取图片最好是直接读取字节,虽然np.array(Image.open(filename)) 很快,但是array.tolist() 很慢,这就导致效果很慢,所以这里还是读字节最后再在读取tfrecord数据的时候,使用tf.io.decode_jpeg对图片进行解码。image_feature = tf.train.Feature(bytes_list=tf.train.BytesList(value=[image]))label_feature = tf.train.Feature(int64_list=tf.train.Int64List(value=[label]))## 建立feature字典feature = {'image': image_feature,'label': label_feature}# 通过字典创建example,example对象对label和image数据进行封装example = tf.train.Example(features=tf.train.Features(feature=feature))# 将example序列化并写入字典writer.write(example.SerializeToString())## 创建TFRecord
encoder(train_filenames, train_labels, 'train.tfrecords')
encoder(test_filenames, test_labels, 'test.tfrecords')

这里要注意的是,一共有三种类型,int64floatbytes只能是最原始的类型,不能np和tf

tf.train.Feature(bytes_list=tf.train.BytesList(value=[*]))
tf.train.Feature(int64_list=tf.train.Int64List(value=[*]))
tf.train.Feature(float_list=tf.train.FloatList(value=[*]))

可以看到当前目录下面有两个tfrecords文件。

读取TFRecord文件数据
def decoder(tfrecord_file, is_train_dataset=None):#构建datasetdataset = tf.data.TFRecordDataset(tfrecord_file)#说明特征的描述属性,为解吗每个example使用feature_discription = {'image': tf.io.FixedLenFeature([], tf.string),'label': tf.io.FixedLenFeature([], tf.int64)}def _parse_example(example_string): # 解码每一个example#将文件读入到队列中feature_dic = tf.io.parse_single_example(example_string, feature_discription)feature_dic['image'] = tf.io.decode_jpeg(feature_dic['image'])#对图片进行resize,属于数据处理的操作feature_dic['image'] = tf.image.resize(feature_dic['image'], [256, 256])/255.0return feature_dic['image'], feature_dic['label']batch_size = 4if is_train_dataset is not None:#tf.data.experimental.AUTOTUNE#根据计算机性能进行运算速度的调整dataset = dataset.map(_parse_example).shuffle(buffer_size=2000).batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)else:dataset = dataset.map(_parse_example)dataset = dataset.batch(batch_size)return datasettrain_data = decoder('train.tfrecords', is_train_dataset=True)
test_data = decoder('test.tfrecords')

最后得到的train_data抽取四个进行展示一下:

import matplotlib.pyplot as pltdef plot_img_label(elemtents):imgs, labels = elemtentsnum_imgs = labels.shape[0]for i in range(num_imgs):plt.subplot(1,num_imgs,i+1)plt.axis('off')plt.title(labels[i].numpy())plt.imshow(imgs[i].numpy())plt.show()plot_img_label(train_data.take(1).get_single_element())

![[Pasted image 20240507134554.png]]

图像增强
# 解码图片 转换图片数据类型 调整图片尺寸
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
image = tf.image.resize(image, (156, 156))# 对图片进行上下左右随机的翻转,调整明亮度最后旋转90度
images = tf.image.random_flip_left_right(images)
images = tf.image.random_flip_up_down(images)
images = tf.image.random_brightness(images, 1)
images = tf.image.rot90(images, 1)

数据可视化

数据可视化一般来说的库有 matplotlibtensorboard

更多可视化操作可以看这一个专栏:数据可视化 Python_Bigcrab__的博客-CSDN博客

matplotlib 设置中文

# windows
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False # mac
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False 

tensorboard

logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)model.fit(x=x_train, y=y_train, epochs=5, validation_data=(x_test, y_test), callbacks=[tensorboard_callback])

在Windows的命令行启动Tensorboard 服务,指定日志读写路径,如果是linux环境,请根据实际情况,修改logdir的值。 tensorboard --logdir=“C:\Users\wumg\jupyter-ipynb\tensorflow2-book\char-05\logs”

jupyter 中运行下列代码:

%load_ext tensorboard%tensorboard --logdir logsfrom tensorboard import notebook
notebook.list() # View open TensorBoard instances

![[Pasted image 20240507140028.png]]

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

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

相关文章

XSS-Labs 靶场通过解析(上)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括:…

Transformer模型详解03-Self-Attention(自注意力机制)

文章目录 简介基础知识什么是AttentionSelf Attention原理通俗易懂理解矩阵计算Q,K,V计算Self-Attention 的输出 优势 Multi-head self-attention原理通俗易懂理解矩阵计算代码实现 简介 下图是论文中 Transformer 的内部结构图,左侧为 Enco…

哪里有视频素材可以用?全视频素材都在哪里找?

在这个数字化快速发展的世界中,高清和4K视频素材对于提升视觉故事的品质至关重要。以下是一系列全球知名的视频素材网站,它们提供的高质量素材能够满足您从商业广告到个人项目的所有需求。 1. 蛙学府 以其庞大的创意资源库著称,订阅者可以无…

【数据流图】用JointJs实现数据流图(一)

一、效果图 二、为什么选用JointJs? 节点是动态绘制的JointJs绘制流向线条时不会遮挡住下方的节点元素,方便绑定事件做拓展JointJs提供丰富的API,虽然比较底层但是拓展灵活连线不仅可以通过坐标点连接,还可直接根据节点连接 三、…

如何使用Vite快速构建vue项目

1、在自己定义的目录下打开cmd命令窗口:如文件夹目录上面输入cmd回车就可以打开 2、检查 node环境:通过node --version看版本号表示安装好了 3、 使用Vite 快速构建Vue项目 npm init vitelatest qiuqiu.admin 注意:如何你电脑没有装vite首…

PCIE协议-2-事务层规范---事务描述符

2.2.6.1 概览 事务描述符是请求者和完成器之间传输事务信息的机制。事务描述符由三个字段组成: 事务ID:标识未完成的事务属性字段:定义事务的特征流量类别(TC)字段:将事务与所需的服务类型关联起来 图2-…

EasyHPC - PyTorch入门教程【笔记】

内容来源:超算习堂 (easyhpc.net) 文章目录 01 Tensors环境要求1.1 Tensors1.1.1 直接创建tensor1.1.2 在现有tensor中创建tensor1.1.3 从NumPy中创建tensor 1.2 基本运算1.2.1 使用运算符1.2.2 调用方法 1.3 CUDA Tensors 02 Autograd2.1 Tensor2.2 Gradient 03 Ne…

实现流程化办公,可了解一下可视化报表开源

当前,实现流程化办公早已成为众多中小企业的发展目标和趋势。可以借助什么样的软件平台实现这一目标?低代码技术平台拥有可视化操作界面、够灵活、易维护等优势特点,在助力企业实现流程化办公、数字化转型方面具有重要的应用价值和推动作用。…

[华为OD] C卷 田忌赛马 DFS 200

题目: 给定两个只包含数字的数组a, b,调整数组a里面数字的顺序,使得尽可能多的a[i] >b[i]。 数组a和b中的数字各不相同。 输出所有可以达到最优结果的a数组的数量 输入描述 输入的第一行是数组a中的数字,其中只包含数字,每…

【0002day】HistCite的使用

HistCite是一个很好的软件,可以找出一个领域中具有代表性的几篇文章。同时使用也比较方便,因而我学习了一下它,并做一下记录。 分析过程 首先,需要选择核心数据库,然后依据关键字进行检索。 检索出来后,将…

Secure Transformer Inference Made Non-interactive

目录 1.概述2.Attention2.1 Matrix multiplication (ciphertext-plaintext).2.2 Matrix multiplication (ciphertext-ciphertext)2.3 Placement of bootstrapping3.SIMD密文压缩和解压缩4.SIMD槽折叠5.实验结果 1.概述 我们提出了NEXUS,这是第一个用于安全变压器推…

变老相机app

变老相机app 在手机上使用“变老相机”app,其中的时光穿梭功能可以生成10岁、20岁、50岁、70岁的照片 目的 得到未来自己的照片,能够更有效地督促我们为老年的自己存款。

记录minio的bug(Object name contains unsupported characters.)

场景是我将后端服务从121.xxx.xxx.xxx服务器上转移到了另一台服务器10.xxx.xxx.xxx 但图片都还在121.xxx.xxx.xxx服务器上,同样我10.xxx.xxx.xxx也安装了minio并且我的后端服务配置的minio地址也是10.xxx.xxx.xxx 此时有一个业务通过minio客户端获取图片&#xf…

矩阵和空间变换理解

矩阵和空间变换 把向量和矩阵相乘看作是空间变换,是其中一种看法 代数角度:向量的一行和矩阵的一列逐项相乘再相加等于新向量的一项 w代表原来坐标轴和新坐标轴之间的变换关系,而a和b体现的是原来向量的关系 矩阵代表的是旧坐标和新坐标之间…

Wireshark明文抓取

目录 原理 配置 1、配置环境变量 2、Wireshark配置 原理 SSLKEYLOGFILE是一个用于记录SSL/TLS会话中使用的密钥的文件。它主要用于调试和分析SSL/TLS协议。当启用了SSLKEYLOGFILE配置,系统会将所有SSL/TLS会话中使用的密钥记录到指定的文件中。这些密钥可以用来…

day04—java基础之方法详解

方法概述 方法是具有特定功能的代码集合,由于我们是把重复的代码写到方法当中,以后要用直接调用方法即可,不需要再写一遍了。代码相当于只写了一遍。所以可以提高代码的复用性。如果要修改代码,我们也只要修改一处即可&#xff0…

Qt常用基础控件总结

一、按钮部件 按钮部件共同特性 Qt 用于描述按钮部件的类、继承关系、各按钮的名称和样式,如下图: 助记符:使用字符"&“可在为按钮指定文本标签时设置快捷键,在&之后的字符将作为快捷键。比如 “A&BC” 则 Alt+B 将成为该按钮的快捷键,使用”&&qu…

springcloud整合网关(springcloud-gateway)

pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册 --><dependency><groupId>com.alibaba.cloud</groupId&…

Linux增加硬盘分区并挂载(各个云平台操作)

第一部分&#xff0c;增加硬盘 1.购买硬盘并选择云服务器 输入lsblk 命令后即可看到刚刚添加的硬盘了 vdb就是新添加的硬盘名称了 第二部分 对硬盘进行分区处理 然后对新建磁盘进行分区 输入命令fdisk /dev/vdb 输入lsblk -f 命令查看刚刚建好的分区(看到多余的sdc不用在意…