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

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批