Как сгенерировать динамическое число выборок из набора данных tenorflow - PullRequest
0 голосов
/ 07 сентября 2018

Моя цель - разрешить моему конвейеру Tensorflow Dataset разрешать входные данные почти произвольного размера, которые будут преобразованы в сэмплы одинакового (известного во время «компиляции») размера, число которых больше исходного. Таким образом, у меня есть py_func (похожий на 1 в идее сопоставления одного со многими), целью которого является возвращение набора данных для использования в flat_map

def split_fn(x, y):
    """ Splits X into a number of subsamples, each labeled y"""
    full_width = x.shape[1]
    full_height = x.shape[0]
    print(full_width)
    print(full_height)

    slice_width = SLICE_WIDTH
    slice_height = SLICE_HEIGHT

    # The splits created by these offset cover the complete input image
    offsets1 = [[x,0] for x in range(0, full_width-slice_width, slice_width)]
    if full_width % slice_width != 0:
        offsets1.append([full_width-slice_width, 0])

    # The splits from these offsets are random, intended for data augmentation
    offsets2 = [[x,0] for x in random.sample(range(0,full_width-slice_width), 5)]

    #Combine the two lists of offsets
    offsets = offsets1 + offsets2


    image = x.reshape(1, full_height, full_width, 1)

    #This creates a list of the slices corresponding to the offsets
    ts = list(map(lambda offset: tf.image.crop_to_bounding_box(image,
                                                               offset[1],
                                                               offset[0],
                                                               slice_height,
                                                               slice_width),
                  offsets))
    #Create and concatenate a dataset for each of the samples
    datasets = map(lambda d: tf.data.Dataset.from_tensors((d, y)), ts)
    ds = reduce((lambda x, y: x.concatenate(y)), datasets)
    return ds

Однако, где я определяю смещения1,

TypeError: __index__ вернул не-int (тип NoneType)

. Я попытался исправить это, поместив его в py_func, который возвращает набор данных

dataset = dataset.flat_map(
lambda image, label:  tuple(tf.py_func(
split_fn, [image, label], [tf.data.Dataset])))

однако я не могу заставить это работать правильно:

TypeError: Ожидаемый тип данных для аргумента 'Tout' не <класс 'tenorflow.python.data.ops.dataset_ops.Dataset'>.

Что я могу сделать, чтобы заставить это работать?

Спасибо

...