Объединение строки и tf.string для получения пути

Я обрабатываю CSV-файл с помощью tensorflow.Data API. Одной из особенностей CSV является имя изображения. Чтобы загрузить изображение, мне нужно создать путь, объединяющий базовую папку с именем изображения. Однако, поскольку имя изображения является тензором, а базовая папка — строкой, я не могу соединить их с помощью os.path.join. Я включаю код ниже.

def process_csv_data(folder_path, image_dimensions):
    width, height, channels = image_dimensions
    def map_function(raw_data):
        image_path = os.path.join(folder_path,raw_data['image_name'].numpy().decode('utf-8'))
        image = tf.io.read_file(image_path)
        image = tf.image.decode_jpeg(image, channels=channels)
        image = tf.image.resize(image, [width, height])
        image /= 255.0  # normalize to [0,1] range
        return image
    return map_function

Первая функция используется следующим образом:

    raw_csv_dataset = tf.data.experimental.make_csv_dataset(
        csv_path,
        batch_size=1,
        column_names=CSV_COLUMNS,
        shuffle=False)

    dataset = raw_csv_dataset.map(
         process_csv_data(folder_path, image_dimensions, mode),
         num_parallel_calls=tf.data.experimental.AUTOTUNE)

Приведенный выше код выдает эту ошибку:

AttributeError: объект «Тензор» не имеет атрибута «numpy»

Я безуспешно пробовал несколько подходов, таких как преобразование имени папки в тензор и использование tf.strings.join или преобразование tf.string в стандартный python string. Итак, каким будет правильный подход?

Я использую тензорный поток 2.0.


person magomar    schedule 26.07.2019    source источник


Ответы (1)


Просто объедините строки с помощью +:

image_path = folder_path + os.sep + raw_data['image_name']

Используйте os.sep, если вам нужен разделитель пути (в случае он не включен в folder_path) и не хочет явно использовать / или \.

person jdehesa    schedule 26.07.2019
comment
это приводит к другой ошибке: ValueError: Shape must be rank 0 but is rank 1 for 'ReadFile' (op: 'ReadFile') with input shapes: [1] в строке image = tf.io.read_file(image_path) - person magomar; 26.07.2019
comment
@magomar Это другая, не связанная с этим ошибка. raw_data['image_name'] должна быть скалярной строкой (а не массивом строк), иначе вы не сможете перейти к read_file. Это зависит от самих данных (что map_function получает в raw_data). Если это массив с одной строкой (например, ['my_file.csv']), вы можете исправить это с помощью image = tf.io.read_file(tf.squeeze(image_path)). - person jdehesa; 26.07.2019
comment
raw_data был упорядоченным словарем, где «image_name» — это функция (столбец в csv). Во всяком случае, я исправил ошибку с tf.reshape(image_path, []), что в данном случае эквивалентно tf.squeeze. Теперь это решено, спасибо. - person magomar; 26.07.2019