是否将tf.data作为数据集加载分段数据



我想加载并扩充一个用于分割的自定义数据集。为了进行分割,我准备了一个包含四个子集的npz文件:

with np.load(PATH) as data:
train_x = data['x_train']
valid_x = data['x_valid']
train_y = data['y_train']
valid_y = data['y_valid']

Train/valid具有相应的含义,x/y代表输入图像(x(和分割掩码(y(。在训练中,我的模型将采用输入x,并根据模型输出相对于y计算损失。

我现在的问题是如何获得tf.data数据集,我可以在训练中对其进行迭代。我尝试过以下几种:

train_dataset = tf.data.Dataset.from_tensor_slices((train_x, train_y))
>>> train_dataset
<TensorSliceDataset shapes: ((520, 696), (520, 696)), types: (tf.uint16, tf.uint8)>
def load(data_group):
image, mask = data_group
image = tf.cast(image, tf.float32)
mask = tf.cast(mask, tf.float32)
return image, mask
def normalize(image):
return (image / 65535/2) - 1
def load_image_train(data_group):
image, mask = load(data_group)
image = normalize(image)
# Perform augmentation (not shown)
return image, mask
train_dataset = train_dataset.map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = train_dataset.shuffle(BUFFER_SIZE)
train_dataset = train_dataset.batch(BATCH_SIZE)

然而,在尝试映射load_image_train列车功能时失败,返回错误tf__load_image_train() takes 1 positional argument but 2 were given。一般来说,这种方法感觉有点笨拙,希望了解改进这种数据导入的替代方案/可能性。

提前感谢

您应该这样写:

def load_image_train(image,mask):
image = tf.cast(image, tf.float32)
mask = tf.cast(mask, tf.float32)
image = normalize(image)
return image, mask

在您的情况下,tf.data.Dataset将返回这对张量。

还可以查看Tensorflow Guide