尝试使用 tensorflow.io.gfile.GFile 和 tensorflow.dataset.map,得到“预期的二进制或 unicode 字符串,得到 Tensor dtype=strin

Posted

技术标签:

【中文标题】尝试使用 tensorflow.io.gfile.GFile 和 tensorflow.dataset.map,得到“预期的二进制或 unicode 字符串,得到 Tensor dtype=string【英文标题】:Trying to use tensorflow.io.gfile.GFile and tensorflow.dataset.map, getting "Expected binary or unicode string, got Tensor dtype=string 【发布时间】:2020-01-25 04:12:50 【问题描述】:

我对使用 Tensorflow 很陌生,想象一下有人会很快告诉我我在做一些愚蠢的事情,所以就这样吧。

我正在使用 MSTAR 数据集并尝试将其读入。这些文件的格式非常奇怪,但可以说,如果在以下代码上进行急切执行,则会从数据集中读取并显示图像。

import tensorflow as tf
import matplotlib.pyplot as plt
tf.enable_eager_execution()

img1Path='HB15000.018'
img2Path='HB15001.018'

def pathToImgTF(path):
    with tf.io.gfile.GFile(path,'rb') as filePath:
        step1=filePath.readlines()
        step2=[x.strip(b'\n') for x in step1]
        for x in step2:
            if b'PhoenixHeaderLength' in x:
                line=x.strip().split(b'=')
                PhoenixHeaderLength=int(line[1])
            elif b'native_header_length' in x:
                line=x.strip().split(b'=')
                native_header_length=int(line[1])
            elif b'NumberOfColumns' in x:
                line=x.strip().split(b'=')
                NumberOfColumns=int(line[1])
            elif b'NumberOfRows' in x:
                line=x.strip().split(b'=')
                NumberOfRows=int(line[1])
        filePath.seek(PhoenixHeaderLength+native_header_length)
        step3=tf.decode_raw(filePath.read(),out_type=tf.float32,little_endian=False)
        depth_major=tf.reshape(step3,[2,NumberOfRows,NumberOfColumns])
        image=tf.transpose(depth_major,[1,2,0])[:,:,0] #Cut off phase for now
    return image

img=pathToImgTF(imgPath)
plt.imshow(img,cmap='gray')

我想使用 tf.dataset.from_tensor_slices,但似乎这不是一个选项,因为以下代码:

ds=tf.data.Dataset.from_tensor_slices([img1Path,img2Path])
ds=ds.map(pathToImgTF)

给出错误“TypeError: Expected binary or unicode string, got tf.Tensor 'args_0:0' shape=() dtype=string”

在我看来,追溯看起来像是专门针对“filePath.readlines()”而中断的,我们将不胜感激任何帮助。

完整的错误输出:

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后)模块中的 ipython-input-6-e12909fb73cd 1 ds=tf.data.Dataset.from_tensor_slices([img1Path,img2Path]) ----> 2 ds=ds.map(pathToImgTF)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py 在地图(自我,map_func,num_parallel_calls)1770如果 num_parallel_calls 为无:1771 返回 DatasetV1Adapter( -> 1772 MapDataset(self, map_func, preserve_cardinality=False)) 1773 else: 1774 返回 数据集V1Adapter(

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py 在 init(self, input_dataset, map_func, use_inter_op_parallelism, 保留基数,使用旧功能)3188 self._transformation_name(),3189 数据集=输入数据集, -> 3190 use_legacy_function=use_legacy_function)3191 variant_tensor = gen_dataset_ops.map_dataset(3192 input_dataset._variant_tensor, # pylint: disable=protected-access

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py 在 init(self, func, transformation_name, dataset, input_classes, input_shapes, input_types, input_structure, add_to_graph, use_legacy_function, defun_kwargs) 2553 resource_tracker = tracking.ResourceTracker() 2554 与 tracking.resource_tracker_scope(resource_tracker): -> 2555 self._function = wrapper_fn._get_concrete_function_internal() 2556 如果 add_to_graph:2557 self._function.add_to_graph(ops.get_default_graph())

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\eager\function.py 在 _get_concrete_function_internal(self, *args, **kwargs) 1353 """获取图形函数时绕过错误检查。""" 1354 图函数 = self._get_concrete_function_internal_garbage_collected( -> 1355 *args, **kwargs) 1356 # 我们将此具体函数返回给某人,他们可能会保留 1357 # 对 FuncGraph 的引用而不保留对 的引用

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\eager\function.py 在 _get_concrete_function_internal_garbage_collected(self, *args, **kwargs) 1347 if self.input_signature: 1348 args, kwargs = None, None -> 1349 graph_function,_,_ = self._maybe_define_function(args, kwargs) 1350 return graph_function 1351

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\eager\function.py 在 _maybe_define_function(self, args, kwargs) 1650 graph_function = self._function_cache.primary.get(cache_key, None) 1651 如果 graph_function 为无: -> 1652 graph_function = self._create_graph_function(args, kwargs) 1653 self._function_cache.primary[cache_key] = graph_function 1654 返回 graph_function, args, kwargs

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\eager\function.py 在 _create_graph_function(self, args, kwargs, override_flat_arg_shapes)1543 arg_names=arg_names, 第1544章 -> 1545 capture_by_value=self._capture_by_value), 1546 self._function_attributes) 1547

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\framework\func_graph.py 在 func_graph_from_py_func(名称,python_func,args,kwargs,签名, func_graph,签名,autograph_options,add_control_dependencies, arg_names、op_return_value、集合、capture_by_value、 override_flat_arg_shapes) 第713章 714 --> 715 func_outputs = python_func(*func_args, **func_kwargs) 716 717 # 不变量:func_outputs 只包含张量,复合张量,

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py 在 wrapper_fn(*args) 2547 属性=defun_kwargs) 第2548章 -> 2549 ret = _wrapper_helper(*args) 2550 ret = self._output_structure._to_tensor_list(ret) 2551 返回 [ops.convert_to_tensor(t) for t in ret]

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\data\ops\dataset_ops.py 在 _wrapper_helper(*args) 2487 嵌套_args = (nested_args,) 2488 -> 2489 ret = func(*nested_args) 2490 # 如果func 返回张量列表,nest.flatten() 和 2491 # ops.convert_to_tensor() 会合谋堆叠

在 pathToImgTF(path) 9 def pathToImgTF(路径): 10 以 tf.io.gfile.GFile(path,'rb') 作为文件路径: ---> 11 step1=filePath.readlines() 12 step2=[x.strip(b'\n') for x in step1] 第 2 步中的 x 为 13:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\lib\io\file_io.py 在 readlines(self) 中 181 def readlines(自我): 182 """返回列表中文件的所有行。""" --> 183 self._preread_check() 184 行 = [] 185而真:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\lib\io\file_io.py 在 _preread_check(self) 82“文件未打开以供阅读”) 83 self._read_buf = pywrap_tensorflow.CreateBufferedInputStream( ---> 84 compat.as_bytes(self.__name), 1024 * 512) 85 86 def_prewrite_check(自我):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\util\compat.py 在 as_bytes(bytes_or_text, 编码) 63 其他: 64 raise TypeError('预期的二进制或 unicode 字符串,得到 %r' % ---> 65 (bytes_or_text,)) 66 67

TypeError: Expected binary or unicode string, got tf.Tensor 'args_0:0' shape=() dtype=string

【问题讨论】:

【参考方案1】:

我不确定imgPath1imgPath2 有什么样的数据。无论如何,它们必须是具有预定义数据类型的张量类型。这两个是实际数据。

如果是这种情况,则将方括号更改为圆括号,如下所示- ds=tf.data.Dataset.from_tensor_slices((imgPath1,imgPath2))

如果这仍然抛出同样的错误,那么请提供确切的信息是在哪里抛出错误。

【讨论】:

这两个是同一数据集中的两个独立文件,都需要处理。我不能只用一个文件给出示例代码,因为程序会抛出“Unbatching a tensor is supported only for rank >= 1”。很抱歉造成混淆,我将编辑帖子,将它们改为“img1Path”和“img2Path”。

以上是关于尝试使用 tensorflow.io.gfile.GFile 和 tensorflow.dataset.map,得到“预期的二进制或 unicode 字符串,得到 Tensor dtype=strin的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试从 pyspark 访问 mysql 表。我正在尝试使用:

尝试使用堆叠小部件构建布局

尝试使用 Curl 登录网站

不安全的 JavaScript 尝试使用框架访问

当我尝试使用 ansible ping 我的 VM 时,它会尝试 ping 服务器 ID 而不是 IP

尝试使用 ConfigurationBuilder 但得到 FileLoadException