我有一个名为 train_dataset 的 tf.data.Dataset -
a, b = next(iter(train_dataset))
print(a.shape, b.shape)
output - (100, 128, 128, 2) (100, 128, 128, 1)
也就是说,我的批量大小是 100,输入图像是 128*128 大小的复值图像,因此第一个通道代表输入图像的实部,第二个通道代表虚部。目标图像为灰度图像,即单通道图像。
为了预处理数据集,我需要找到批次的平均图像并将其从批次中的每个图像中减去(注意在我的输入图像中,每个图像都有两个通道并且形状为 (128,128,2))。
我尝试 tf.data.Dataset.reduce() 如下找到输入图像的平均值 -
train_mean = train_dataset.reduce(0., tf.math.add)/ tf.cast(train_dataset.cardinality(),tf.float32)
但它给出了以下错误 -
InvalidArgumentError: Shapes of all inputs must match: values[0].shape = [100,128,128,2] != values[1].shape = [100,128,128,1]
[[{{node add/y}}]] [Op:ReduceDataset]
任何帮助调试错误或计算数据集平均值的任何其他建议都将受到高度赞赏。
根据@HakanAkgun 在评论中的建议,我尝试在 py_function 中使用 np.mean() (后跟另一个 py_function 线性缩放到 (0,1) 范围),但 py_functions 似乎不会影响数据集值一点也不。我希望第二个打印语句给出不同的最小值,第三个打印语句打印一个 0 最小值,但最小值似乎根本没有改变。
def remove_mean(image, target):
image_mean = np.mean(image, axis=0)
target_mean = np.mean(target, axis=0)
image = image - image_mean
target = target - target_mean
return image, target
def linear_scaling(image, target):
image_min = np.ndarray.min(image, axis=(1,2), keepdims=True)
image_max = np.ndarray.max(image, axis=(1,2), keepdims=True)
image = (image-image_min)/(image_max-image_min)
target_min = np.ndarray.min(target, axis=(1,2), keepdims=True)
target_max = np.ndarray.max(target, axis=(1,2), keepdims=True)
target = (target-target_min)/(target_max-target_min)
return image, target
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(remove_mean, [item1, item2], [tf.float32, tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
train_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
test_dataset.map(lambda item1, item2: tuple(tf.py_function(linear_scaling, [item1, item2], [tf.float32])))
a, b = next(iter(train_dataset))
print(tf.math.reduce_min(a[0,:,:,:]))
Output -
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)
tf.Tensor(-0.00040511801, shape=(), dtype=float32)