Python 无法运行TensorFlow加载图像示例(进程路径错误)

Python 无法运行TensorFlow加载图像示例(进程路径错误),python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在尝试从TF运行以下教程: 我正在运行第二种方法(使用tf.data进行更精细的控制) 提供的教程可以使用Dataset.map创建图像、标签对的数据集。在这里,TF提供以下函数来利用Dataset.map: def get_标签(文件路径): #将路径转换为路径组件列表 parts=tf.strings.split(文件路径,os.path.sep) #倒数第二个是类目录 一个热=零件[-2]==类名称 #整数编码标签 返回tf.argmax(一个热) def解码img(img): #将

我正在尝试从TF运行以下教程:

我正在运行第二种方法(使用tf.data进行更精细的控制

提供的教程可以使用
Dataset.map
创建图像、标签对的数据集。在这里,TF提供以下函数来利用
Dataset.map


def get_标签(文件路径):
#将路径转换为路径组件列表
parts=tf.strings.split(文件路径,os.path.sep)
#倒数第二个是类目录
一个热=零件[-2]==类名称
#整数编码标签
返回tf.argmax(一个热)
def解码img(img):
#将压缩字符串转换为3D uint8张量
img=tf.image.decode\u jpeg(img,通道=3)
#将图像调整为所需大小
返回tf.image.resize(img,[img\u高度,img\u宽度])
def进程路径(文件路径):
标签=获取标签(文件路径)
#以字符串形式从文件加载原始数据
img=tf.io.read\u文件(文件路径)
img=解码\u img(img)
返回img,标签
运行该示例时,出现以下错误:

train\u ds=train\u ds.map(进程路径,num\u并行调用=AUTOTUNE)
TypeError:传递到参数“input”的值的数据类型“bool”不在允许值列表中:float32、float64。。。
由于它是直接从TF网站教程来的,我不确定我错在哪里。有什么想法吗?数据目录是逐字结构化的(来自教程):

花儿与照片/ 黛西/ 蒲公英/ 玫瑰/ 向日葵/ 郁金香/

更新1 @nicolas gervais回答尝试的输出:

对于图像,在序列中添加标签(5):
打印(“图像形状:”,Image.numpy().shape)
打印(“Label:,Label.numpy())
图像形状:(180、180、3)
标签:[[1.0]]
图像形状:(180、180、3)
标签:[[0.0.0.1.0.]]
图像形状:(180、180、3)
标签:[[1.0.0.0.0.]]
图像形状:(180、180、3)
标签:[[0.0.1.0.0.]]
图像形状:(180、180、3)
标签:[[0.0.1.0.0.]]
应该类似于:
图像形状:(180、180、3)

标签:4

更新2 似乎上述情况不符合要求,导致模型失败:


class_name=np.array(已排序([item.name用于数据_dir.glob('*'),如果item.name!=“LICENSE.txt”]))
打印(类名称)
[“雏菊”“蒲公英”“玫瑰”“向日葵”“郁金香”]
打印(列名(类别名称))
5.
...
模型拟合(训练数据、验证数据=val数据、历元=15)
InvalidArgumentError:Logits和labels必须具有相同的第一维度、Get Logits形状[5,5]和labels形状[25]

似乎不能在布尔张量上使用argmax。您可以改为手动执行一个热编码。只需确保定义
n_类

def get_label(file_path):
    parts = tf.strings.split(file_path, os.path.sep)
    bool_values = tf.equal(parts[-2], class_names)
    indices = tf.where(bool_values)
    one_hot = tf.one_hot(indices, depth=n_classes)
    return one_hot
看看这个,Tensorflow不支持布尔张量的argmax:

import tensorflow as tf

x = tf.convert_to_tensor([True, False, False])

tf.argmax(x)
更新3(最终版) 发现tensorflow有一个选项可以通过这里,特别是到


更改dtype=tf.dtypes.uint16后,没有问题。希望它对未来的任何人都有帮助。

我不知道他们使用的是什么版本。重要的是你要按自己的方式工作。如果你让它工作了,请不要犹豫,让我知道。嗯,它会输出一个热门的副产品标签。还有,现在导致模型失败。好的,还有两个问题。在tf.data.Dataset的末尾使用
.batch(4)
。请出示您的模型。我不确定是什么导致了其他错误在答案解决您的问题后,您不应该为完全无关的问题更新问题三次。本网站不是针对你所面临的任何问题的一对一辅导。它是为了解决特定的、最小的问题,这些问题在将来对其他人有用。
tf.python.framework.errors_impl.NotFoundError: Could not find valid device for node.
Node:{{node ArgMax}}
All kernels registered for op ArgMax :
  device='CPU'; T in [DT_INT64]; output_type in [DT_INT64]
  device='CPU'; T in [DT_INT64]; output_type in [DT_INT32]
  device='CPU'; T in [DT_INT32]; output_type in [DT_INT64]
tf.io.decode_png( contents, channels=0, dtype=tf.dtypes.uint8, name=None)