tensorflow学习笔记8——图像数据的预处理(cifar10的例子)

2024-03-01 09:30

本文主要是介绍tensorflow学习笔记8——图像数据的预处理(cifar10的例子),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、从文件读取数据到dataset从文件读取数据
2、把数据分成2部分:train和valid。其中train是取前45000条,然后用batch分成一批批(每批100条),一共要做300个epoch(repeat(300))。
在这里插入图片描述

我们来计算一下:
每个 Epoch 要训练的图片数量:45000(训练集上的所有图像)
训练集具有的 Batch 个数: 45000/100=450
每个 Epoch 需要完成的 Batch 个数: 450
每个 Epoch 具有的 Iteration 个数: 450(完成一个Batch训练,相当于参数迭代一次)
每个 Epoch 中发生模型权重更新的次数:450
训练 300 个Epoch后,模型权重更新的次数: 450*300=135000
不同Epoch的训练,其实用的是同一个训练集的数据。第1个Epoch和第10个Epoch虽然用的都是训练集的45000图片,但是对模型的权重更新值却是完全不同的。因为不同Epoch的模型处于代价函数空间上的不同位置,模型的训练代越靠后,越接近谷底,其代价越小。
3、make_initializable_iterator()迭代器

iterator = train_dataset.make_initializable_iterator()
# Decode the train records from the iterator
record = iterator.get_next()  #取一个batch的数据

4、tf.decode_raw()
将原来编码为字符串类型的变量重新变回来,这个方法在数据集dataset中很常用,因为制作图片源数据一般写进tfrecord里用to_bytes的形式,也就是字符串。这里将原始数据取出来 必须制定原始数据的格式,原始数据是什么格式这里解析必须是什么格式.

record_decoded_bytes = tf.decode_raw(record, tf.uint8)

与tf.cast区别:
这个函数主要用于数据类型的转变,不会改变原始数据的值还有形状的。tf.cast还可以用于将numpy数组转化为tensor。

5、tf.slice()切片
参考:https://www.jianshu.com/p/71e6ef6c121b
def slice(input_, begin, size, name=None):
其中“input_”是你输入的tensor,就是被切的那个。“begin”是每一个维度的起始位置,这个下面详细说。“size”相当于问每个维度拿几个元素出来。

#Get the labels from the records
record_labels = tf.slice(record_decoded_bytes, [0, 0], [batch_size, 1])
record_labels = tf.cast(record_labels, tf.int32)
# Get the images from the records
record_images = tf.slice(record_decoded_bytes, [0, 1], [batch_size, image_bytes])
record_images = tf.reshape(record_images, [batch_size, imageDepth, imageHeight, imageWidth])   #NCHW
#在CPU运行的,只接受NHWC这种数据格式,即Channel是在最后一个维度
record_images = tf.transpose(record_images, [0, 2, 3, 1])
record_images = tf.cast(record_images, tf.float32)
#

record_labels的shape就是(batch_size, 1)
record_images的shape就是(batch_size, image_bytes),然后再通过reshape转成(batch_size, imageDepth, imageHeight, imageWidth),通过transpose和cast转换成NHWC格式,每个数字是float32型

6、tf.image.resize_image_with_crop_or_pad()图像尺寸调整
tf.random_crop()随意裁剪
写了很多结果网页出问题,没保存,好伤心
现在就简略写吧

 Random crop the images after pad each side with 4 pixels,???
distorted_images = tf.image.resize_image_with_crop_or_pad(record_images,imageHeight + 8, imageWidth + 8)
distorted_images = tf.random_crop(distorted_images, size=[batch_size, imageHeight, imageHeight, 3])

图像尺寸调整属于基础的图像几何变换,TensorFlow提供了几种尺寸调整的函数:
tf.image.resize_images:将原始图像缩放成指定的图像大小,其中的参数method(默认值为ResizeMethod.BILINEAR)提供了四种插值算法,具体解释可以参考图像几何变换(缩放、旋转)中的常用的插值算法
tf.image.resize_image_with_crop_or_pad:剪裁或填充处理,会根据原图像的尺寸和指定的目标图像的尺寸选择剪裁还是填充,如果原图像尺寸大于目标图像尺寸,则在中心位置剪裁,反之则用黑色像素填充。
tf.image.central_crop:比例调整,central_fraction决定了要指定的比例,取值范围为(0,1],该函数会以中心点作为基准,选择整幅图中的指定比例的图像作为新的图像。
————————————————
原文链接:https://blog.csdn.net/chaipp0607/article/details/73029923

tf.random_crop() 随机地将张量裁剪为给定的大小.
以一致选择的偏移量将一个形状 size 部分从 value 中切出.需要的条件:value.shape >= size.
如果大小不能裁剪,请传递该维度的完整大小.例如,可以使用 size = [crop_height, crop_width, 3] 裁剪 RGB 图像.

7、tf.unstack()和tf.stack()
tf.unstack()这是一个对矩阵进行分解的函数,以下为关键参数解释:
value:代表需要分解的矩阵变量(其实就是一个多维数组,一般为二维);
axis:指明对矩阵的哪个维度进行分解。

# Unstack the images as the follow up operation are on single train image
distorted_images = tf.unstack(distorted_images)
for i in range(len(distorted_images)):
#省略对每条数据的处理部分
# Stack the images
distorted_images = tf.stack(distorted_images)

8、tf.image.random_flip_left_right()按水平 (从左向右) 随机翻转图像.以1比2的概率,输出image沿着第二维翻转的内容,即,width.否则按原样输出图像.
tf.image.random_brightness()在某范围随机调整图片亮度
tf.image.random_contrast()在某范围随机调整图片对比度
前3个函数都是在训练图像时,用于对图像进行预处理以增加训练数据

tf.image.per_image_standardization()归一化,三维矩阵中的数字均值变为0,方差变为1。

distorted_images[i] = tf.image.random_flip_left_right(distorted_images[i])
distorted_images[i] = tf.image.random_brightness(distorted_images[i], max_delta=63)
distorted_images[i] = tf.image.random_contrast(distorted_images[i], lower=0.2, upper=1.8)
distorted_images[i] = tf.image.per_image_standardization(distorted_images[i])

这篇关于tensorflow学习笔记8——图像数据的预处理(cifar10的例子)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761978

相关文章

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模