Как получить строковое значение элемента списка внутри tf.py_function ()? - PullRequest
0 голосов
/ 12 июля 2020

Я использую tf.data.Dataset.from_tensor_slices() для ввода данных в мою модель. Внутри моей функции .map я использую tf.py_function() для применения произвольного python logi c. В моей функции tf.py_function(get_k_imgs) я генерирую собственные имена файлов в соответствии с моими требованиями. Я генерирую общее количество имен файлов K, где K может быть от 1,2,3 до n. Все имена файлов хранятся в списке с именем rand_img_name[].

Затем я просматриваю этот список, чтобы прочитать имя отдельного файла и объединить их с путем к каталогу изображений (path_to_img_dir). Проблема в том, что отдельный элемент rin (имя файла) в моем списке rand_img_name имеет значение file_name.png, shape=(), dtype=string) (никогда не сталкивался с этим типом), который генерирует ошибку :

tensorflow.python.framework.errors_impl.NotFoundError: NewRandomAccessFile failed to Create/Open: path-to-img-dir\file_name.png', shape=(), dtype=string) : The system cannot find the file specified.

Как могу ли я преобразовать эти элементы списка в правильную строку, чтобы она работала? Мой Tf. версия 1.13 и режим ожидания отключен.

Ниже мой код.

def get_k_imgs(img_path, K):
    img_path = str(img_path)
    # Split names and labels
    name, typeis = os.path.splitext(os.path.basename(img_path))
    img_name = name + typeis
    label1 = name.split('_')[0]
    label2 = name.split('_')[1]

    # Get k samples
    random.shuffle(chars)
    k_chars = chars[:K]

    # Create a List that will hold label1 as img_path label1 but random label2 
    rand_img_name = []
    for char in k_chars:
        rand_img_name.append(replace_name(str(img_name), str(label2), str(char), 1))

    # Create paths of Images using ran_img_name list then convert decode into an image.
    # Then convert the datatype into tf.float32 and append into the style_imgs list   
    style_imgs=[]
    for rin in rand_img_name:
        filename = os.path.join(path_to_img_dir +'/'+ rin) # rin value is label1_label2.png', shape=(), dtype=string)
        read_sty_img = tf.read_file(filename)
        # decode image to png
        # change image dtype

    return style_imgs

def map_fn(path, label1, label2):
    input_path = tf.convert_to_tensor(path, dtype=tf.string)
    # read a path and convert it into a tf png image
    image = tf.image.decode_png(tf.read_file(input_path))
    # convert the image datatype
    image = tf.image.convert_image_dtype(image, dtype=tf.float32)

    # Converting labels type
    # Represent the labels as a one-hot vector.
    # code below

    # Adding arbitray python logic
    [K_image] = tf.py_function(get_k_imgs, [input_path, K], [tf.float32])

    return image, one_hot_label1, one_hot_label2, K_image
    # return image, one_hot_label1, one_hot_label2, style_image 

# get_imgs_labels() takes the path of the image directory and returns. 
# three lists containg all images full paths, their corresponding Label1's and label2's respectively in the directory. 
# All three have return type <class 'list'>.
img_paths, img_label1, img_label2 = get_imgs_labels(path_to_img_dir)

dataset = tf.data.Dataset.from_tensor_slices((img_paths, img_label1, img_label2))
if mode == 'train':
    dataset = dataset.repeat().shuffle(1000)

dataset = dataset.map(map_fn, num_parallel_calls=8)
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)

batch = dataset.make_one_shot_iterator().get_next()
...