отображение элементов списка в словарь наборов данных tenorflow - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь отобразить информацию об изображении в набор данных, состоящий из словаря изображений и меток.

parse_function() следует просто декодировать из 2 списков путей и меток имен файлов.

 def parse_function(filename, label):
    image_string = tf.io.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string)
    image_resized = tf.image.resize(image_decoded, [4, 4])

    return image_resized, label

def dataset_maker(list_sample_paths, list_labels):

    filenames = tf.constant(list_sample_paths)
    labels = tf.constant(list_labels)

    dataset = tf.data.Dataset.from_tensor_slices({"image": filenames, "label": labels})
    dataset = dataset.map(parse_function)

training_dataset = dataset_maker(list_training_sample_paths, list_training_sample_labels)

Но я получаю это сообщение об ошибке

TypeError: tf__parse_function() missing 1 required positional argument: 'label'

Нужно ли использовать диктет в этом случае? Любая помощь в решении этого очень ценится. Спасибо!

Добавление этой информации после ответа Срихари Хумбарвади, чтобы решить ее с помощью кортежей: Мне бы хотелось получить структуру словаря, потому что я пролил модель на Mnist.

Один случайный Пример Mnist имеет такую ​​структуру:

{'image': <tf.Tensor: id=140275, shape=(28, 28, 1), dtype=uint8, numpy=array([[[  0],[  0],[  0]],dtype=uint8)>, 'label': <tf.Tensor: id=140276, shape=(), dtype=int64, numpy=6>}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Аргументы, передаваемые в вашу функцию отображения, должны соответствовать типам элементов вашего набора данных. Итак, если ваши элементы dict, вы можете передать dict в ваш parse_function и вернуть dict.
Например:

def parse_function(data):

    data_out = data
    filename = data['image']
    image_string = tf.io.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string)
    image_resized = tf.image.resize(image_decoded, [4, 4])
    data_out['image'] = image_resized

    return data_out

def dataset_maker(list_sample_paths, list_labels):

    filenames = tf.constant(list_sample_paths)
    labels = tf.constant(list_labels)

    dataset = tf.data.Dataset.from_tensor_slices({"image": filenames, "label": labels})
    dataset = dataset.map(parse_function)
    return dataset

training_dataset = dataset_maker(list_training_sample_paths, list_training_sample_labels)

В качестве альтернативы, вы можете передать кортеж, как @Srihari Humbarwadi предложил и вернуть диктат. Как это:

def parse_function(filename, label):

    image_string = tf.io.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string)
    image_resized = tf.image.resize(image_decoded, [4, 4])
    data_out = {'image': image_resized, 'label': label}

    return data_out

def dataset_maker(list_sample_paths, list_labels):

    filenames = tf.constant(list_sample_paths)
    labels = tf.constant(list_labels)

    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
    dataset = dataset.map(parse_function)
    return dataset
0 голосов
/ 02 апреля 2020

Вам не нужно передавать список имен файлов и меток в виде словаря. Вы можете заставить его работать, передавая кортеж ie. (filenames, labels). Вот полный код, который я использовал:

from glob import glob
import numpy as np
import tensorflow as tf

print('TensorFlow:', tf.__version__)

list_training_sample_paths = sorted(glob('images/*'))
# random integer labels
list_training_sample_labels = np.random.randint(low=0, high=5, size=[len(list_training_sample_paths)])

def parse_function(filename, label):
    image_string = tf.io.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string)
    image_resized = tf.image.resize(image_decoded, [4, 4])

    return image_resized, label

def dataset_maker(list_sample_paths, list_labels):

    filenames = tf.constant(list_sample_paths)
    labels = tf.constant(list_labels)

    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
    dataset = dataset.map(parse_function)
    return dataset

training_dataset = dataset_maker(list_training_sample_paths, list_training_sample_labels)
tf.data.experimental.get_structure(training_dataset)

Вывод

TensorFlow: 2.2.0-rc2
(TensorSpec(shape=(4, 4, None), dtype=tf.float32, name=None), TensorSpec(shape=(),dtype=tf.int64, name=None))
...