Tensorflow:TypeError:预期的二进制或 unicode 字符串,得到 <tf.Tensor 'Placeholder:0' shape=<unknown> dtyp

Posted

技术标签:

【中文标题】Tensorflow:TypeError:预期的二进制或 unicode 字符串,得到 <tf.Tensor \'Placeholder:0\' shape=<unknown> dtype=string>【英文标题】:Tensorflow: TypeError: Expected binary or unicode string, got <tf.Tensor 'Placeholder:0' shape=<unknown> dtype=string>Tensorflow:TypeError:预期的二进制或 unicode 字符串,得到 <tf.Tensor 'Placeholder:0' shape=<unknown> dtype=string> 【发布时间】:2018-11-29 03:32:05 【问题描述】:

代码如下:

filename = tf.placeholder(tf.string)
image_raw_data = tf.gfile.FastGFile(filename, "rb").read()
image = tf.image.decode_jpeg(image_raw_data)

with tf.Session() as sess:
    sess.run(image, feed_dict=filename: "4.jpg")

这是错误:

Traceback (most recent call last):
  File "C:/Users/fanpw.fnst/Desktop/ip8/test.py", line 26, in <module>
    image_raw_data = tf.gfile.FastGFile(filename, "rb").read()
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\lib\io\file_io.py", line 120, in read
    self._preread_check()
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\lib\io\file_io.py", line 80, in _preread_check
    compat.as_bytes(self.__name), 1024 * 512, status)
  File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\util\compat.py", line 67, in as_bytes
    (bytes_or_text,))
TypeError: Expected binary or unicode string, got <tf.Tensor 'Placeholder:0' shape=<unknown> dtype=string>

我想知道如何将变量 filename 从类型 tf.string 转换为 unicode string。或者有其他方法可以解决这个问题。

任何建议将不胜感激。

【问题讨论】:

你有没有发现这个问题?我也有类似的情况。见***.com/questions/51297195/… 【参考方案1】:

该函数需要一个字符串或字节字符串,而不是张量或占位符。 您正在寻找的是 tf.io.readfile()... 这是一个带有数据集的示例,但它可以用作代码中 tf.gfile 的替换

#placeholder for list of filenames
filenames = tf.placeholder(tf.string)

# Using tf.data.Dataset to iterate through list filenames
dataset = tf.data.Dataset.from_tensor_slices(filenames)
# for each filename, open it.
dataset = dataset.map(
    lambda filename: (
        tf.io.read_file(filename)))

# make iterator (standard practice)
itr = dataset.make_initializable_iterator()

#used to feed new filenames into dataset
init = itr.initializer

# get the item from iterator
image_raw_data = itr.get_next()

# same as your code
image = tf.image.decode_jpeg(image_raw_data)

with tf.Session() as sess:
    # initialize the dataset
    sess.run(init,filenames:['test_images/demo_images/image1.jpg',
                              'test_images/demo_images/image2.jpg'])

    img1 = sess.run(image)
    img2 = sess.run(image)

# lets display the images
from PIL import Image

image = Image.fromarray(img1,'RGB')
image.show()
image = Image.fromarray(img2,'RGB')
image.show()

【讨论】:

以上是关于Tensorflow:TypeError:预期的二进制或 unicode 字符串,得到 <tf.Tensor 'Placeholder:0' shape=<unknown> dtyp的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow:TypeError:预期的二进制或 unicode 字符串,得到 <tf.Tensor 'Placeholder:0' shape=<unknown> dtyp

TypeError:预期的 float32,得到的列表包含类型为“_Message”的张量

构建神经网络 [TensorFlow 2.0] 模型子类化 - ValueError/TypeError

tensorflow代码TypeError:*:'int'和'Flag'不支持的操作数类型

TensorFlow:TypeError:不允许使用 `tf.Tensor` 作为 Python `bool`

Tensorflow 2.5.0 - TypeError:函数构建代码之外的操作正在传递“图形”张量