tf.data.Dataset介绍1-from_tensor_slices

本文详细介绍了`tf.data.Dataset.from_tensor_slices`的使用,包括它如何处理不同类型的数据,如list、tuple、dict和tensor。该方法对输入的类型敏感,将数据切片,用于小数据内存处理。当输入是list或tensor时,它会按维度切割;对于外层的tuple或dict则不会。所有特征的向量维度需一致且大于等于1。示例展示了不同数据类型的切片结果。

1、tf.data.Dataset.from_tensor_slices使用

a.对输入的类型异常敏感,遇到第一个为list或tensor类型作为维度作为切割维度。小数据内存处理时使用。
b.对于外层tuple或dict的跳过不作为切割维度(可以视为多个tensor的列表或类似表现形式)。

  c.tensor中每一个特征的向量维度要保持一致,且维度必须是大于等于1

例如,list数据格式slice

#list
list(tf.data.Dataset.from_tensor_slices([[1,3,4],[2,3,4]]).as_numpy_iterator())

Out[10]: [array([1, 3, 4]), array([2, 3, 4])]

#tuple
list(tf.data.Dataset.from_tensor_slices(([1,3,4],[2,3,4])).as_numpy_iterator())
Out[11]: [(1, 2), (3, 3), (4, 4)]


#dict
list(tf.data.Dataset.from_tensor_slices({"a":[1,2,3],"b":[5,6,7]}).as_numpy_iterator())
Out[12]: [{'a': 1, 'b': 5}, {'a': 2, 'b': 6}, {'a': 3, 'b': 7}]

#tensor
list(tf.data.Dataset.from_tensor_slices(tf.constant([[1,2,3],[4,5,6]])).as_numpy_iterator())
Out[13]: [array([1, 2, 3]), array([4, 5, 6])]




参考:tf.data.Dataset  |  TensorFlow Core v2.8.0 

<think>我们被要求介绍tf.data.Dataset.from_tensor_slices的使用方法和示例,并且有多个引用可供参考。 根据引用[1]和[2],我们知道这个函数可以创建一个由输入tensor的切片构成的Dataset,它会沿着输入tensor的第一个维度进行切片,并保留输入tensors的结构。所有输入tensor的第一个维度必须相同。 引用[3]提供了一个简单的示例:将一个一维张量(通过[:, None]变成二维,但每个元素是一个长度为1的向量)传入,然后创建Dataset,然后迭代输出每个切片。 我们将按照以下结构回答: 1. 函数的作用和原理 2. 使用方法的详细说明(参数、返回值等) 3. 示例(多个示例,展示不同输入情况) 注意:由于引用[3]的示例是TensorFlow 2.1的,我们同样使用TensorFlow 2.x版本的语法。 另外,根据系统指令,数学公式使用$...$,独立公式使用$$...$$,但这里可能公式不多,注意行内公式格式。同时,最后生成相关问题。 我们开始: 函数签名:tf.data.Dataset.from_tensor_slices(tensors) 作用:将输入的张量(或元组、字典等)沿第一个维度切片,返回一个Dataset对象,其中每个元素是对应位置的切片。 注意: - 输入可以是单个张量、元组、字典或嵌套结构。 - 所有输入张量的第一个维度大小必须相同。 示例1:单个张量(一维) 输入一个一维张量,例如[1,2,3,4,5],则数据集包含5个元素,分别是1,2,3,4,5。 示例2:单个张量(二维) 输入一个二维张量,例如[[1,2],[3,4],[5,6]],则数据集包含3个元素,每个元素是一维张量:[1,2]、[3,4]、[5,6]。 示例3:多个张量(元组) 输入两个一维张量(第一个维度相同),例如([1,2,3], [4,5,6]),则数据集包含3个元素,每个元素是一个元组:(1,4), (2,5), (3,6) 示例4:字典 输入一个字典,例如{'a': [1,2], 'b': [3,4]},则数据集包含2个元素,每个元素是字典:{'a':1, 'b':3} 和 {'a':2, 'b':4} 我们将编写代码示例,并说明输出。 注意:由于在文本中,我们使用代码块来展示代码,并注释输出。 另外,我们还可以结合其他方法如batch, repeat等,但用户只问from_tensor_slices,所以我们主要展示这个函数,其他方法可以简单提及。 最后,生成相关问题。 开始写回答: </think> ### `tf.data.Dataset.from_tensor_slices` 的使用方法与示例 `tf.data.Dataset.from_tensor_slices` 是 TensorFlow 中用于构建数据集的核心 API,它通过**沿输入张量的第一个维度切片**生成数据集。以下详细说明其原理和使用方法: --- #### **功能原理** 1. **切片机制**: 将输入张量(或嵌套结构)沿第 0 维(最外层维度)切片,生成多个子元素。 例如: - 输入张量形状 `(N, ...)` → 输出 `N` 个形状为 `(...)` 的元素 - 输入多个张量时,**所有张量的第 0 维大小必须相同**,系统自动对齐切片[^2]。 2. **支持数据类型**: 支持单个张量、元组、字典或嵌套结构(如 `{'feature': tensor1, 'label': tensor2}`)。 --- #### **基础用法** ##### 示例 1:单个张量输入 ```python import tensorflow as tf # 创建形状为 (4,) 的一维张量 data = tf.constant([10, 20, 30, 40]) dataset = tf.data.Dataset.from_tensor_slices(data) # 迭代输出 for item in dataset: print(item.numpy()) # 输出: 10, 20, 30, 40(4个标量元素) ``` ##### 示例 2:二维张量输入 ```python # 创建形状为 (3, 2) 的二维张量 matrix = tf.constant([[1, 2], [3, 4], [5, 6]]) dataset = tf.data.Dataset.from_tensor_slices(matrix) for item in dataset: print(item.numpy()) # 输出: [1 2], [3 4], [5 6](3个一维张量) ``` --- #### **高级用法** ##### 示例 3:元组输入(特征+标签) ```python features = tf.constant([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]]) # 形状 (3, 2) labels = tf.constant([0, 1, 0]) # 形状 (3,) # 传入元组 (features, labels) dataset = tf.data.Dataset.from_tensor_slices((features, labels)) for feat, label in dataset: print(f"Feature: {feat.numpy()}, Label: {label.numpy()}") # 输出: # Feature: [0.1 0.2], Label: 0 # Feature: [0.3 0.4], Label: 1 # Feature: [0.5 0.6], Label: 0 ``` ##### 示例 4:字典输入 ```python data_dict = { 'image': tf.ones(shape=(2, 28, 28)), # 2张28x28图片 'label': tf.constant([3, 7]) } dataset = tf.data.Dataset.from_tensor_slices(data_dict) for sample in dataset: print(sample['image'].shape, sample['label'].numpy()) # 输出: # (28, 28) 3 (第一组切片) # (28, 28) 7 (第二组切片) ``` --- #### **注意事项** 1. **内存限制**: 输入数据会**整体加载到内存**,适用于中小型数据集。大型数据集需使用 `tf.data.TFRecordDataset`[^1]。 2. **维度对齐**: 多输入时,所有张量的第 0 维大小必须一致,否则报错 `ValueError`[^2]。 3. **典型组合**: 常与以下方法链式调用: - `.batch(32)`:将数据分批次 - `.repeat(epochs)`:重复数据集 - `.shuffle(buffer_size)`:打乱顺序 ```python dataset = tf.data.Dataset.from_tensor_slices(data) .shuffle(100).batch(32).repeat(2) # 打乱→分批→重复2轮 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值