尝试使用 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】:我不确定imgPath1
和imgPath2
有什么样的数据。无论如何,它们必须是具有预定义数据类型的张量类型。这两个是实际数据。
如果是这种情况,则将方括号更改为圆括号,如下所示-
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 表。我正在尝试使用: