具有字符串输入的 Tensorflow 数据集不保留数据类型

2023-12-27

All 可重现的下面的代码在 Google Colab 上使用 TF 2.2.0-rc2 运行。

改编简单的例子文档 https://www.tensorflow.org/api_docs/python/tf/data/Dataset用于从简单的 Python 列表创建数据集:

import numpy as np
import tensorflow as tf
tf.__version__
# '2.2.0-rc2'
np.version.version
# '1.18.2'

dataset1 = tf.data.Dataset.from_tensor_slices([1, 2, 3]) 
for element in dataset1: 
  print(element) 
  print(type(element.numpy()))

我们得到结果

tf.Tensor(1, shape=(), dtype=int32)
<class 'numpy.int32'>
tf.Tensor(2, shape=(), dtype=int32)
<class 'numpy.int32'>
tf.Tensor(3, shape=(), dtype=int32)
<class 'numpy.int32'>

所有数据类型都在int32,正如预期的那样。

但是更改这个简单的示例以提供字符串列表而不是整数:

dataset2 = tf.data.Dataset.from_tensor_slices(['1', '2', '3']) 
for element in dataset2: 
  print(element) 
  print(type(element.numpy()))

给出结果

tf.Tensor(b'1', shape=(), dtype=string)
<class 'bytes'>
tf.Tensor(b'2', shape=(), dtype=string)
<class 'bytes'>
tf.Tensor(b'3', shape=(), dtype=string)
<class 'bytes'>

令人惊讶的是,尽管张量本身是dtype=string,他们的评价属于类型bytes.

这种行为不仅限于.from_tensor_slices方法;这是情况.list_files https://www.tensorflow.org/api_docs/python/tf/data/Dataset#list_files(以下代码片段在新的 Colab 笔记本中直接运行):

disc_data = tf.data.Dataset.list_files('sample_data/*.csv') # 4 csv files
for element in disc_data: 
  print(element) 
  print(type(element.numpy()))

结果是:

tf.Tensor(b'sample_data/california_housing_test.csv', shape=(), dtype=string)
<class 'bytes'>
tf.Tensor(b'sample_data/mnist_train_small.csv', shape=(), dtype=string)
<class 'bytes'>
tf.Tensor(b'sample_data/california_housing_train.csv', shape=(), dtype=string)
<class 'bytes'>
tf.Tensor(b'sample_data/mnist_test.csv', shape=(), dtype=string)
<class 'bytes'>

再次,评估张量中的文件名返回为bytes, 代替string,尽管张量本身是dtype=string.

类似的行为也观察到.from_generator方法(此处未显示)。

最后的演示:如图所示.as_numpy_iterator method 文档 https://www.tensorflow.org/api_docs/python/tf/data/Dataset#as_numpy_iterator,以下等式条件被评估为True:

dataset3 = tf.data.Dataset.from_tensor_slices({'a': ([1, 2], [3, 4]), 
                                               'b': [5, 6]}) 

list(dataset3.as_numpy_iterator()) == [{'a': (1, 3), 'b': 5}, 
                                       {'a': (2, 4), 'b': 6}] 
# True

但如果我们改变元素b为了成为字符串,相等条件现在令人惊讶地评估为False!

dataset4 = tf.data.Dataset.from_tensor_slices({'a': ([1, 2], [3, 4]), 
                                               'b': ['5', '6']})   # change elements of b to strings

list(dataset4.as_numpy_iterator()) == [{'a': (1, 3), 'b': '5'},   # here
                                       {'a': (2, 4), 'b': '6'}]   # also
# False

可能是由于数据类型不同,因为值本身显然是相同的。


我并不是通过学术实验偶然发现这种行为的。我正在尝试使用自定义函数将数据传递到 TF 数据集,该函数从表单磁盘读取文件对

f = ['filename1', 'filename2']

哪些自定义函数本身工作得很好,但通过 TF 数据集映射给出

RuntimeError: not a string

经过这次挖掘,如果返回的数据类型确实是,那么似乎至少不是无法解释的bytes并不是string.

那么,这是一个错误(看起来),还是我在这里遗漏了一些东西?


这是一个已知的行为:

From: https://github.com/tensorflow/tensorflow/issues/5552#issuecomment-260455136 https://github.com/tensorflow/tensorflow/issues/5552#issuecomment-260455136

TensorFlow 在大多数地方(包括 sess.run)将 str 转换为字节,并且这一点不太可能改变。用户可以自由地转换回来,但不幸的是,向核心添加 unicode 数据类型的更改太大。关闭暂时无法修复。

我想 TensorFlow 2.x 没有任何改变 - 仍然有一些地方字符串被转换为字节,你必须手动处理这个问题。

来自issue https://github.com/tensorflow/tensorflow/issues/38409你已经打开了自己,似乎他们将这个主题视为 Numpy 的问题,而不是 Tensorflow 本身的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有字符串输入的 Tensorflow 数据集不保留数据类型 的相关文章

  • numpy.sum 的内部结构

    为什么两个总和返回不同的值 事实上 如果 0 1 在 IEEE 算术中相加 10 次 结果不应该正好是 1 可能是 np sum 对总和进行了不同的分组 所以结果偶然恰好是 1 但是有没有有关于此的文档 除了研究源代码之外 当然 numpy
  • Python:使用索引数组在两个数组之间进行映射

    我有一个 numpy 数组 src np random rand 320 240 和另一个 numpy 数组idx尺寸 2 x 320 240 每一列idx索引结果数组中的条目dst e g idx 20 3 10 引用第 3 行 第 10
  • 张量流中检查点之间的间隔

    如何指定张量流中两个连续检查点之间的间隔 里面没有选项tf train Saver来指定这一点 每次 我使用不同数量的全局步骤运行模型时 我都会得到检查点之间的新间隔 The tf train Saver https www tensorf
  • 对 Python 列表元素进行分组

    我有一个 python 列表 如下所示 my list 25 1 0 65 25 3 0 63 25 2 0 62 50 3 0 65 50 2 0 63 50 1 0 62 我想根据以下规则对它们进行排序 1 gt 0 65 0 62 l
  • 通过 h5py 将 matlab v7.3 文件读入 python numpy 数组列表

    我知道以前已经有人问过这个问题 但在我看来 仍然没有答案可以解释正在发生的事情 并且不适用于我的情况 我有一个 matlab v7 3 文件 其结构如下 gt rank lt 1x454 cell gt gt each element is
  • 使用 TensorFlow 和 Keras 的卷积神经网络精度较低 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我计划创建一个 CNN 来预测蘑菇类型 并从互联网上收集了 2500 多张照片 数据集有 156 个类别 不同类型的蘑菇 我在 Tensorfl
  • UnimplementedError:图形执行错误:在张量流上运行 nn

    我一直遇到这个错误 我不知道为什么 特别是因为我完全遵循某人的代码并且该人在运行此错误时没有错误 img shape 128 128 3 load pretrained model base model tf keras applicati
  • Tensorflow 可变图像输入大小(自动编码器、放大......)

    Edit WARNING不建议使用不同图像大小的图像 因为张量需要具有相同的大小才能实现并行化 我一直在寻找解决方案 了解如何使用不同大小的图像作为神经网络的输入 Numpy 第一个想法是使用numpy 然而 由于每个图像的大小不同 我无法
  • Tensorflow 2.0 中的二阶导数

    我正在尝试计算标量变量的简单向量函数的二阶导数f x x x 2 x 3 使用 TF 2 3 与tf GradientTape def f ab x return x x 2 x 3 import tensorflow as tf in1
  • 如何使用文本和?

    我一直在关注this https github com tensorflow models tree master textsum使用 textsum 的链接 我已经使用提供的命令训练了模型 但我在 textsum log root 目录中
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • 复制张量流图

    复制 TensorFlow 图并保持更新的最佳方法是什么 理想情况下 我想将重复的图放在另一个设备上 例如从 GPU 到 CPU 然后不时更新副本 简短回答 你可能想要检查点文件 https www tensorflow org progr
  • Numpy:视图与切片复制

    当我进行切片时 发生了意想不到的事情 似乎第一个是视图 但第二个是复制 First 第一个行切片 然后是列切片 看来也是一种看法 gt gt gt a np arange 12 reshape 3 4 gt gt gt a 0 3 2 0
  • 为什么使用“self”定义的变量在继承自 tf.keras.Model 时会自动给出 ListWrapper() ?

    我不熟悉ListWrapper 但它被应用于使用创建的所有列表变量self当我的班级继承自tf keras Model https www tensorflow org api docs python tf keras models Mod
  • 在 Tensorflow 中学习新单词嵌入时进行地面预训练嵌入

    我尝试使用以下代码片段 为预训练的嵌入奠定基础 并仅针对新词汇学习嵌入 但预定义单词的嵌入也发生了变化 None
  • 如何以干净高效的方式在 pytorch 中获得小批量?

    我试图做一件简单的事情 即使用火炬通过随机梯度下降 SGD 训练线性模型 import numpy as np import torch from torch autograd import Variable import pdb def
  • Tensorflow 数据 API - 预取

    我正在尝试使用 TF 的新功能 即 Data API 但我不知道如何使用prefetch作品 在下面的代码中 def dataset input fn dataset tf data TFRecordDataset filenames co
  • 如何使用 TFlearn 中的 ImageAugmentation 训练 CNN 中的图像和数据混合

    我想使用图像 像素信息 和数据的混合在 Tflearn Tensorflow 中训练卷积神经网络 由于我的图像数量较少 因此我需要使用图像增强来增加传递到网络的图像样本数量 但这意味着我只能传递图像数据作为输入数据 必须在稍后阶段 大概在全
  • 在NN中指定连接(在keras中)

    我正在使用 keras 和tensorflow 1 4 我想明确指定哪些神经元在两层之间连接 因此 每当第一层中的神经元 i 连接到第二层中的神经元 j 且其他地方为零时 我就有一个矩阵 A 其中包含 1 我的第一次尝试是创建一个带有内核的
  • 如何将张量推送到 TensorFlow 队列并从另一个进程中提取它们?

    我有一个 TensorFlow 集群已启动并正在运行 我正在尝试使用一个客户端进程将数据入队 并将其从另一进程中出队 我无法让它工作 我做错了什么 这是我的推送数据的程序 queue push py import tensorflow as

随机推荐