深度学习基础之《TensorFlow框架(13)—二进制数据》

news2024/12/20 18:33:31

一、CIFAR-10二进制数据集介绍

1、CIFAR-10数据集
CIFAR-10数据集由10个类别的60000个32x32彩色图像组成,每个类别有6000个图像。有50000个训练图像和10000个测试图像

2、数据集分为五个训练批次和一个测试批次,每个批次有10000个图像

3、data_batch_1.bin 到 data_batch_5.bin 训练集

4、test_batch.bin 测试集

5、这些类别完全相互互斥,汽车和卡车之间没有重叠。汽车包括轿车、SUV,卡车只包括大卡车

6、二进制数据文件内容格式
二进制数据文件包含data_batch_1.bin 到 data_batch_5.bin、test_batch.bin

这些文件中每一个格式如下,数据中每个样本包含了特征值和目标值:
<1x标签> <3072x像素>
...
<1x标签> <3072x像素>

每3073个字节是一个样本:
1个目标值+3072个像素

7、格式说明
第一个字节,是第一个图像的标签(目标值:飞机是0,汽车是2,鸟是3。。。),它是一个0-9范围内的数字。接下来的3072个字节是图像像素的值。前1024个字节是红色通道值,下1024个是绿色通道值,最后1024个是蓝色通道值
值以行优先顺序存储,因此前32个字节是图像第一行的红色通道值
每个文件都包含10000个这样的3073字节的“行”图像,但没有任何分隔行的限制。因此每个文件应该完全是30730000字节长

二、CIFAR-10二进制数据读取

1、分析
(1)构造文件名列表
(2)读取二进制数据并进行解码
(3)将数据的标签和图片进行分割
    对tensor对象进行切片
    label
    一个样本image(3072字节 = 1024r + 1024g + 1024b)
    [[1024r],
    [1024g],
    [1024b]]
    shape = (3, 32, 32) = (channels, height, width)
    因为tensorflow的图像表示习惯是(height, width, channel)
    所以需要转换
(4)处理图片数据形状以及数据类型
(5)运行

2、代码day02_binary_read.py

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf

class Cifar(object):

    def __init__(self):

        # 初始化操作
        self.height = 32
        self.width = 32
        self.channels = 3

        # 字节数
        self.image_bytes = self.height * self.width * self.channels
        self.label_bytes = 1
        self.all_bytes = self.label_bytes + self.image_bytes

    def read_and_decode(self):

        decoded_data = []

        # 1、构造文件名列表
        filenames = tf.data.Dataset.list_files("./cifar-10-batches-bin/data_batch_*.bin")
        for filename in filenames:
            print(filename)

        # 2、读取与解码
        for filename in filenames:
            raw = tf.io.read_file(filename)
            # 解码为一维的uint8数组
            data = tf.io.decode_raw(raw, out_type=tf.uint8)
            print(data)
            decoded_data.append(data)

        # 3、运行
        # 将文件按照样本切片切开
        for data in decoded_data:
            for i in range(10000):
                cut_data = tf.slice(data, [i*self.all_bytes], [self.all_bytes])
                #print(cut_data)
                label = tf.slice(cut_data, [0], [self.label_bytes])
                image = tf.slice(cut_data, [self.label_bytes], [self.image_bytes])
                #print("label: ", label)
                #print("image: ", image)
                # 调整图片形状
                image_reshaped = tf.reshape(image, shape=[self.channels, self.height, self.width])
                #print("image_reshaped: ", image_reshaped)
                # 转置,将图片顺序转为height, width, channels
                image_transposed = tf.transpose(image_reshaped, [1, 2, 0])
                #print("image_transposed: ", image_transposed)
                # 调整图像类型
                image_cast = tf.cast(image_transposed, tf.float32)
                print("image_cast: ", image_cast)

        return None


if __name__ == "__main__":

    # 实例化Cifar
    cifar = Cifar()
    cifar.read_and_decode()

filename打印例子:

tf.Tensor(b'./cifar-10-batches-bin/data_batch_4.bin', shape=(), dtype=string)
tf.Tensor(b'./cifar-10-batches-bin/data_batch_3.bin', shape=(), dtype=string)
tf.Tensor(b'./cifar-10-batches-bin/data_batch_1.bin', shape=(), dtype=string)
tf.Tensor(b'./cifar-10-batches-bin/data_batch_2.bin', shape=(), dtype=string)
tf.Tensor(b'./cifar-10-batches-bin/data_batch_5.bin', shape=(), dtype=string)

解码后打印例子:

tf.Tensor([  8  26  17 ... 127 124 116], shape=(30730000,), dtype=uint8)
tf.Tensor([  6  59  43 ... 130 130 131], shape=(30730000,), dtype=uint8)
tf.Tensor([  0 178 178 ... 182 175 174], shape=(30730000,), dtype=uint8)
tf.Tensor([  1  35  27 ... 119 127 136], shape=(30730000,), dtype=uint8)
tf.Tensor([  1 255 252 ... 173 162 161], shape=(30730000,), dtype=uint8)

切片后打印例子:

label:  tf.Tensor([6], shape=(1,), dtype=uint8)
image:  tf.Tensor([255 254 255 ...  79  81  76], shape=(3072,), dtype=uint8)

调整图片形状后打印例子:

image_reshaped:  tf.Tensor(
[[[229 236 234 ... 217 221 222]
  [222 239 233 ... 223 227 210]
  [213 234 231 ... 220 220 202]
  ...
  [150 140 132 ... 224 230 241]
  [137 130 125 ... 181 202 212]
  [122 118 120 ... 179 164 163]]

 [[229 237 236 ... 219 223 223]
  [221 239 234 ... 223 228 211]
  [206 232 233 ... 220 219 203]
  ...
  [143 135 127 ... 222 228 241]
  [132 127 121 ... 180 201 211]
  [119 116 116 ... 177 164 163]]

 [[239 247 247 ... 233 234 233]
  [229 249 246 ... 236 238 220]
  [211 239 244 ... 232 232 215]
  ...
  [135 127 120 ... 218 225 238]
  [126 120 115 ... 178 198 207]
  [114 110 111 ... 173 162 161]]], shape=(3, 32, 32), dtype=uint8)

转置后打印例子:

image_transposed:  tf.Tensor(
[[[235 252 252]
  [239 251 251]
  [239 251 251]
  ...
  [225 251 252]
  [228 251 252]
  [228 252 252]]

 [[249 255 255]
  [251 253 255]
  [252 254 255]
  ...
  [229 255 255]
  [231 255 255]
  [232 255 255]]

 [[241 250 254]
  [243 248 252]
  [245 248 252]
  ...
  [231 253 251]
  [232 253 252]
  [233 253 252]]

 ...

 [[ 81 118 176]
  [ 85 123 178]
  [ 83 123 175]
  ...
  [167 167 168]
  [168 168 170]
  [165 166 169]]

 [[ 79 119 176]
  [ 69 108 163]
  [ 67 105 158]
  ...
  [170 172 174]
  [163 164 167]
  [161 164 169]]

 [[ 46  87 142]
  [ 45  83 137]
  [ 52  88 141]
  ...
  [175 179 182]
  [168 172 175]
  [163 169 174]]], shape=(32, 32, 3), dtype=uint8)

调整图像类型后打印例子:

image_cast:  tf.Tensor(
[[[229. 229. 239.]
  [236. 237. 247.]
  [234. 236. 247.]
  ...
  [217. 219. 233.]
  [221. 223. 234.]
  [222. 223. 233.]]

 [[222. 221. 229.]
  [239. 239. 249.]
  [233. 234. 246.]
  ...
  [223. 223. 236.]
  [227. 228. 238.]
  [210. 211. 220.]]

 [[213. 206. 211.]
  [234. 232. 239.]
  [231. 233. 244.]
  ...
  [220. 220. 232.]
  [220. 219. 232.]
  [202. 203. 215.]]

 ...

 [[150. 143. 135.]
  [140. 135. 127.]
  [132. 127. 120.]
  ...
  [224. 222. 218.]
  [230. 228. 225.]
  [241. 241. 238.]]

 [[137. 132. 126.]
  [130. 127. 120.]
  [125. 121. 115.]
  ...
  [181. 180. 178.]
  [202. 201. 198.]
  [212. 211. 207.]]

 [[122. 119. 114.]
  [118. 116. 110.]
  [120. 116. 111.]
  ...
  [179. 177. 173.]
  [164. 164. 162.]
  [163. 163. 161.]]], shape=(32, 32, 3), dtype=float32)

3、切片函数
tf.slice(inputs, begin, size, name=None)
说明:
inputs:输入的数组
begin:表示从inputs的哪几个维度上的哪个元素开始抽取,元素的索引
size:表示在inputs的各个维度上抽取的元素个数,要切多长

In [1]: import tensorflow as tf

In [2]: a = tf.constant([0,1,2,3,4,5,6,7,8,9])

In [3]: a
Out[3]: <tf.Tensor: shape=(10,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)>

In [4]: tf.slice(a, [4], [3])
Out[4]: <tf.Tensor: shape=(3,), dtype=int32, numpy=array([4, 5, 6], dtype=int32)>

In [5]: b = tf.constant([[1,2,3],[4,5,6]])

In [6]: b
Out[6]: 
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
       [4, 5, 6]], dtype=int32)>

In [7]: tf.slice(b, [0,1], [2,1])
Out[7]: 
<tf.Tensor: shape=(2, 1), dtype=int32, numpy=
array([[2],
       [5]], dtype=int32)>

第一个例子,[0,1,2,3,4,5,6,7,8,9]从第4个索引位置,截取3个长度,所以是[4,5,6]
第二个例子,[[1,2,3],[4,5,6]]是从0行1列开始,就是[1,2,3]的2,对x的第一个维度(行)抽取2个元素,在对x的第二个维度(列)抽取1个元素,所以是[2,5]

4、NHWC和NCHW
这里的图片形状设置从1维的排列到3维数据的时候,涉及到NHWC与NCHW的概念

在读取设置图片形状的时候有两种格式:
设置为“NHWC”时,排列顺序为 [batch, height, width, channels]
设置为“NCHW”时,排列顺序为 [batch, channels, height, width]
其中N表示这批图像有几张,H表示图像在竖直方向有多少像素,W表示水平方向像素,C表示通道数

tensorflow默认的是[height, width, channels]

假设RGB三通道两种格式的区别如下图所示:

理解
假设1,2,3,4-红色,5,6,7,8-绿色,9,10,11,12-蓝色
(1)如果通道在最低维度0[channel, height, width],RGB三颜色分成三组,在第一维度上找到三个RGB颜色(NCHW)
(2)如果通道在最高维度2[height, width, channel],在第三维度上找到RGB三个颜色(NHWC)

5、tf.transpose(image_reshaped, [1, 2, 0])
[1, 2, 0]表示,原来在1号位置的现在在0号位置,原来在2号位置的在1号位置,原来在0号位置的在1号位置

参考资料:
https://blog.csdn.net/Aidam_Bo/article/details/91908637
https://blog.csdn.net/weixin_41845265/article/details/107067012
 

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

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

相关文章

强化SSH服务安全的最佳实践

SSH&#xff08;Secure Shell&#xff09;作为一种广泛应用于Linux和其他类Unix系统中的强大工具&#xff0c;为管理员提供了安全的远程登录和命令执行功能。在现今高度互联的网络环境中&#xff0c;确保SSH服务的安全性显得尤为重要。本文将详细阐述一系列SSH服务的最佳实践&a…

探索文本向量化的新高峰:合合信息acge_text_embedding 模型

前言 文本向量化是将文本数据转换为数值向量的过程。由于计算机只能处理数值数据&#xff0c;文本数据需要被转换成数值形式才能被算法和模型处理。这种向量化的过程使得文本数据能够被机器学习、深度学习等算法有效地处理。文本向量化的方法有多种&#xff0c;其中常见的有以…

输入influx但是无法进入influxdb

问题描述&#xff1a; 博主想通过DockerJmeterInfluxDBGrafana搭建性能测试可视化平台&#xff0c;但是按照别的教程输入influx却无法进入inluxdb&#xff0c;输入输出如下&#xff1a; NAME:influx - Influx ClientUSAGE:influx [command]HINT: If you are looking for the I…

多种方法论的融合,可以把FMEA做得更好——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff0c;即故障模式与影响分析&#xff0c;是一种预防性质量工具&#xff0c;用于识别产品或过程中潜在的故障模式&#xff0c;评估其对系统的影响&#xff0c;并优先处理那些可能导致严重后果的故障。在实际应用中&#xff0c;单一的…

HashMap常用的API

HashMap好用的API isEmpty()和clear() 例子 package com.example.springbootdemo;import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import java.util.HashMap;/*** Author yimeng* Date 2024/4/26 9:27* PackageName:com.…

2024年Q1季度平板电视行业线上市场销售数据分析

Q1季度平板电视线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;平板电视累计销量约360万件&#xff0c;环比下降12%&#xff0c;同比下降30%&#xff1b;累计销售额约99亿元&#xff0c;环比下降28%&a…

Mockaroo - 在线生成测试用例利器

简介&#xff1a;Mockaroo 是一个无需安装的在线工具&#xff0c;用于生成大量的自定义测试数据。它支持多种数据格式&#xff0c;如JSON、CSV、SQL和Excel&#xff0c;并能模拟复杂的数据结构。 历史攻略&#xff1a; 测试用例&#xff1a;多条件下编写&#xff0c;懒人妙用…

《苍穹外卖》Day08部分知识点记录

一、useGeneratedKeys和keyProperty useGeneratedKeys和keyProperty是<insert>标签中的两个属性&#xff0c;用于处理自动生成的主键值。 1. useGeneratedKeys userGeneratedKeys"true"表示启用自动生成主键功能&#xff1b;当useGeneratedKeys设置为true时…

Yolov5 export.py实现onnx模型的导出

查了很多资料&#xff0c;很多用python代码写的&#xff0c;只需要这个库那个库的&#xff0c;最后都没成功。 不如直接使用Yolov5里面的 export.py实现模型的转换。 一&#xff1a;安装依赖 因为yolov5里面的requirments.txt是将这些转换模型的都注释掉了 所以需要解除注释…

Redis网络相关的结构体 和 reactor模式

目录 1. epoll的封装 结构体aeApiStae 创建epoll fd的封装 epoll_ctl的封装 epoll_wait的封装 2. 结构体aeFileEvent、aeFiredEvent、aeTimeEvent 结构体aeFileEvent 结构体aeFiredEvent 结构体aeTimeEvent 3. struct aeEventLoop aeEventLoop相关的函数 1. 创建eve…

pycharm编辑器------快捷键

pycharm编辑器基础快捷键 上下文操作 01PyCharm 有数百个上下文相关操作&#xff0c;可以帮助您转换、改进和修正代码。按 AIt Enter 以调用“显示上下文操作"。 02我们来应用第一个快速修复:移除形参。 03您几乎可以在任何上下文中调用"显示上下文操作"。我们…

前端补充---15

一、新增表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

C++11 数据结构7 队列的链式存储,实现,测试

前期考虑 队列是两边都有开口&#xff0c;那么在链式情况下&#xff0c;线性表的链式那一边作为对头好呢&#xff1f; 从线性表的核心的插入和删除算法来看&#xff0c;如果在线性表链表的头部插入&#xff0c;每次循环都不会走&#xff0c;但是删除的时候&#xff0c;要删除线…

IDEA中配置使用maven和配置maven的中央仓库

1 以汉化后的IDEA为例配置maven 打开idea选择文件 选择 设置 点击>构建.执行.部署 点击>构建工具 点击>Maven 其中Maven主路径 就是我们maven下载解压后的路径 可以通过边上的三个点选择你解压后的绝对路径&#xff0c;也可以直接把解压后的绝对路劲复制过来 以下…

C++之通俗易懂学模版

目录 一、了解什么是泛性编程 二、模版 1.函数模版 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.5 模板参数的匹配原则 2.类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 非类型模板参数 4. 模板的特化 4.1 概念 4.2 …

半导体晶圆厂内外网数据单向导出,什么样的方案才安全又便捷?

半导体晶圆厂企业为了隔绝外部⽹络有害攻击、保护⽹络和数据安全&#xff0c;通常采⽤物理隔离的⽅式&#xff0c;将企业内⽹与互联⽹隔离。⽹络隔离后&#xff0c;基于业务开展需求&#xff0c;部分重要数据仍需由内⽹导⼊及导出⾄外部⽹络区域。为保障数据的安全合规性&#…

【Qt常用控件】—— 多元素控件

目录 1.1 List Widget 1.2 Table Widget 1.3 Tree Widget 1.4 小结 Qt 中提供的多元素控件有: QListWidget QListView QTableWidget QTableView QTreeWidget QTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例&#xff1a; QTableView 是基于…

Java:优先级队列(堆)

一、初识【堆】 1、什么是【优先级队列】&#xff1f; 前面的文章我们介绍过队列&#xff0c;队列是一种先进先出的数据结构&#xff0c;但是&#xff0c;在某些情况下&#xff0c;操作的数据可能需要有一个优先级来获取数据&#xff0c;例如优先获取队列中最大的元素&#xf…

这个合租室友真的没有一点公德心,还好他搬走了

这个合租室友真的没有一点公德心&#xff0c;还好他搬走了 这个出租屋有四个房间。 有三个卧室&#xff0c;和一个隔断。 我住三个卧室中的一个。下图中右边那个就是我住的。 2023年下半年&#xff0c;左边那个屋子来了一个新租户小白。 在住的过程中&#xff0c;隔断间的租…

致力于为企业提升媒体宣传的一种新策略-软文发稿和投放

随着新媒体时代的快速发展&#xff0c;媒体宣发的方式也在不断迭代&#xff0c;其中&#xff0c;“软文发稿”成为了许多企业非常看重的一种媒体宣发方式。那么&#xff0c;什么是“软文发稿”呢&#xff1f;这是一种通过撰写有新闻属性的广告文章&#xff0c;将企业的品牌、产…