Python 使用tensorflow.data生成图像和多个标签的数据集

Python 使用tensorflow.data生成图像和多个标签的数据集,python,tensorflow,keras,regression,tf.data.dataset,Python,Tensorflow,Keras,Regression,Tf.data.dataset,我试图训练一个神经网络来画一个物体周围的边界框。我自己生成了数据,256x256 rgb图像和每个图像的五个标签(边界框的两个角+一个旋转组件)。为了在使用python 3.7.6训练网络时不耗尽内存,tensorflow 2.0和keras I一次只加载了少量图像。然后网络对这些图像进行训练,然后加载一组新的图像。这一切都是按顺序发生的(我不是一个很好的程序员,可能不是一个高效的程序员),这给我留下了一个非常严重的瓶颈,因为我加载图像和标签的方式。图像名称以数值形式给出,当前保存为.jpg,我

我试图训练一个神经网络来画一个物体周围的边界框。我自己生成了数据,256x256 rgb图像和每个图像的五个标签(边界框的两个角+一个旋转组件)。为了在使用python 3.7.6训练网络时不耗尽内存,tensorflow 2.0和keras I一次只加载了少量图像。然后网络对这些图像进行训练,然后加载一组新的图像。这一切都是按顺序发生的(我不是一个很好的程序员,可能不是一个高效的程序员),这给我留下了一个非常严重的瓶颈,因为我加载图像和标签的方式。图像名称以数值形式给出,当前保存为.jpg,我的标签存储在一个文本文件中,其中每行对应一个图像名称

为了减少/消除瓶颈,我阅读了关于tf.data的文章,并尝试按照中的示例进行操作。但是,这些示例涉及分类,因此标签是以不同的方式生成的。我试着像这样修改代码

import numpy as np
import tensorflow as tf
import os

height=256
width=256

AUTOTUNE = tf.data.experimental.AUTOTUNE
image_count=len(os.listdir('images_train'))

list_ds = tf.data.Dataset.list_files(str('images_train/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)

print('\n')
for f in list_ds.take(5):
    
    print(f.numpy())
   
def decode_img(img):
    # convert the compressed string to a 3D uint8 tensor
    img = tf.image.decode_jpeg(img, channels=3)
    # resize the image to the desired size
    return tf.image.resize(img, [height, width])  

#This is the function I cannot figure out how to write
def get_label(file_path):
    labels=np.loadtxt('labels_train.txt', delimiter=',')
    # convert the path to a list of path components
    parts = tf.strings.split(file_path, os.path.sep)
    
    #somehow I would like to extract the name of the image file and then take the numerical part and 
    #return the corresponding row
    return labels[0,:]
   
def process_path(file_path):
    label = get_label(file_path)
    # load the raw data from the file as a string
    img = tf.io.read_file(file_path)
    img = decode_img(img)
    return img, label

train_ds = list_ds.map(process_path, num_parallel_calls=AUTOTUNE)
当我刚从文件返回一行时,脚本的其余部分似乎运行良好,但我不知道如何使其与每个图像对应的标签配对。为了在
get\u label()
函数中提取图像名称,我尝试使用
parts.numpy()
,它只会产生这个
AttributeError:“Tensor”对象没有属性“numpy”

几天来,我一直在试图弄清楚这一点,但一直未能找到一篇完全描述同一问题的帖子

一个人如何以一种高效的方式解决这个问题,而不是成为一个熟练的程序员?任何能为我指明正确方向的东西都将不胜感激

编辑:我最终选择了一个不同的解决方案,这个解决方案的灵感来源于这里的示例。我发现在这里给出的示例中更容易理解。

您可以将get_label()函数重写为
def get_label(file_path):labels=np。genfromtxt('labels_train.txt',dtype='str',delimiter=',')labels_list=[i.split('.')[0]表示标签中的i]
labels_list包含对应于每行的数字部分。感谢您可以将get_label()函数重写为
def get_label(文件路径):labels=np。genfromtxt('labels_train.txt',dtype='str',delimiter=',')labels_list=[i.split('.')[0]表示标签中的i]
labels_list包含对应于每行的数字部分。谢谢