Возвращение набора данных из tf.data.Dataset.map () приводит к тому, что у объекта 'TensorSliceDataset' нет атрибута 'get_shape' error - PullRequest
0 голосов
/ 12 июня 2018

Я использую API набора данных для создания входного конвейера.Я использую метод tf.data.Dataset.map () в схеме, подобной следующей:

def mapped_fn(_):
    X = tf.random_uniform([3,3])
    y = tf.random_uniform([3,1])
    dataset = tf.data.Dataset.from_tensor_slices((X,y))
    return dataset

with tf.Session() as sess:
    first = tf.random_uniform([1,2])         
    unimportant_dataset = tf.data.Dataset.from_tensors(first)
    dataset = unimportant_dataset.map(mapped_fn)
    sess.run(dataset)

Я получаю следующую ошибку: AttributeError: 'TensorSliceDataset' object has no attribute 'get_shape'

Общий контекст состоит в том, что mapped_fn десериализует примерный protobuf (в данном случае представленный unimportant_dataset) из файла .tfrecords, изменяет форму вектора объектов (X) и должен возвратить набор данных с элементами, определенными срезами изновый вектор признаков (в данном случае формы (3,)).Я получил похожую ошибку при возврате ZipDataset.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Ответ DomJack абсолютно верен в отношении подписи Dataset.map(): он ожидает, что возвращаемое значение переданного mapped_fn будет одним или несколькими тензорами (или разреженными тензорами).

Если у вас есть функция, которая возвращает Dataset, вы можете использовать Dataset.flat_map(), чтобы сгладить и объединить все возвращенные наборы данных в один набор данных следующим образом:

def mapped_fn(_):
    X = tf.random_uniform([3,3])
    y = tf.random_uniform([3,1])
    dataset = tf.data.Dataset.from_tensor_slices((X,y))
    return dataset

# Generate 100 dummy elements.
unimportant_dataset = tf.data.Dataset.range(100)

# Convert each dummy element into a dataset of 3 nested elements, and concatenate them.
dataset = unimportant_dataset.flat_map(mapped_fn)
0 голосов
/ 12 июня 2018

map_fn, переданное tf.data.Dataset.map, должно взять тензоры одного примера из вызывающего набора данных и вернуть тензоры возвращенного набора данных.

например,

def map_fn(example_proto):
  features, labels = parse_example_proto(example_proto)
  # do data augmentation here
  return features, labels

dataset = tf.data.TfRecordsDataset(filenames)
dataset = dataset.repeat().shuffle().map(
  map_fn, num_parallel_calls=8).prefetch(1)
features, labels = dataset.make_one_shot_iterator().get_next()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...