Python keras模型中图像列表中的TensorFlow数据集

Python keras模型中图像列表中的TensorFlow数据集,python,tensorflow,keras,Python,Tensorflow,Keras,我试图理解如何读取局部图像,将它们用作TensorFlow,并使用TF数据集训练Keras模型。我正在跟踪Keras-MNIST TPU特遣部队。唯一不同的是,我想阅读我的一组图片并在上面进行训练 假设我有图像列表(文件名)和相应的标签列表 files = [...] # list of file names labels = [...] # list of labels (integers) images = tf.constant(files) # or tf.convert_to_tens

我试图理解如何读取局部图像,将它们用作TensorFlow,并使用TF数据集训练Keras模型。我正在跟踪Keras-MNIST TPU特遣部队。唯一不同的是,我想阅读我的一组图片并在上面进行训练

假设我有图像列表(文件名)和相应的标签列表

files = [...] # list of file names
labels = [...] # list of labels (integers)
images = tf.constant(files) # or tf.convert_to_tensor(files)
labels = tf.constant(labels) # or tf.convert_to_tensor(labels)
dataset = tf.data.Dataset.from_tensor_slices((images, labels))
dataset = dataset.shuffle(len(files))
dataset = dataset.repeat()
dataset = dataset.map(parse_function).batch(batch_size)
parse_函数
是一个简单的函数,它读取输入文件名并生成图像数据和相应的标签,例如

def parse_function(filename, label):
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_image(image_string)
    image = tf.cast(image_decoded, tf.float32)
    return image, label
此时,我有一个
数据集
,它是tf.data.dataset类型(更准确地说是tf.data.BatchDataset),我将它传递给keras模型
训练的_模型
,例如

但此时代码中断,出现以下错误:

AttributeError: 'BatchDataset' object has no attribute 'ndim'
错误来自keras,它对给定的输入执行类似的检查

from keras import backend as K
K.is_tensor(dataset) # which returns false
Keras试图确定输入的类型,因为它不是张量,所以它假设它是numpy数组,并试图得到它的维数。这就是错误发生的原因

我的问题如下:

  • 我读得对吗?我在网上查了很多例子,似乎我是按照人们的建议阅读的
  • 为什么我的数据集不是张量?可能我需要执行额外的转换,但TF的情况并非如此
  • 为什么在TF中,所有东西都与TF数据集一起工作,我真的看不出它们读取MNIST数据的方式(数据格式不同,但最终会得到图像)和我在这里所做的有什么不同
如有任何建议,将不胜感激


请注意,即使TF是关于TPU的,它的结构也使得它可以在TPU和CPU/GPU上工作。

结果表明,问题在于使用Keras模型。TF教程中的示例依赖于使用TF.Keras模块构建Keras模型(所有层、模型等都来自TF.Keras)。虽然我使用的模型(DenseNet)依赖于纯keras模块,即所有层都来自keras模块,而不是tf.keras。这将导致在keras模型的拟合方法中检查tf.data.Dataset的ndim。一旦我调整了我的DenseNet以使用tf.keras图层,一切都会恢复正常。

生成的标签是否与教程中给出的类似?它们是从单独的文件中读取的还是根据文件生成的?你对它们进行了热编码吗?我自己生成了标签。但正如我在回答我的帖子时所解释的,真正的问题在于使用keras vs tf.keras模型。后来的使用解决了这个问题
from keras import backend as K
K.is_tensor(dataset) # which returns false