Моя цель - разрешить моему конвейеру 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'>.
Что я могу сделать, чтобы заставить это работать?
Спасибо