Я использую 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()