Tensorflow,Keras:按轴进行Tensor归一化

时间:2018-08-06 11:36:37

标签: python tensorflow keras

假设我们有形状为A的张量(None, 200, 200, 1)的图像。其中None是批处理大小,(200, 200, 1)是图像大小。

如何在每个图像上执行归一化(0到1)(不使用for迭代)?

也就是说:

A[0] = (A[0] - A[0].min()) / (A[0].max() - A[0].min())
A[1] = (A[1] - A[1].min()) / (A[1].max() - A[1].min())
...
A[n] = (A[n] - A[n].min()) / (A[n].max() - A[n].min())

如果我直接使用A = (A - A.min()) / (A.max() - A.min()),它将通过全局maxmin归一化所有图像。我希望使用自己的maxmin对每个图像进行标准化。

换句话说,如何实现maxmin运算,其结果是:(None, 1, 1, 1)的形状,其中每个(1, 1, 1)包含以下项的最大值或最小值:每个图像。

1 个答案:

答案 0 :(得分:0)

您可以使用tf.reduce_maxtf.reduce_min

import tensorflow as tf

A = tf.random_normal(shape=(-1, 200, 200, 1))
B = tf.reduce_max(A, axis=(1, 2, 3))
C = tf.reduce_min(A, axis=(1, 2, 3))

print(B.shape)
print(C.shape)

输出:

(?,)
(?,)

另外,您的情况下的输出必须为(None, 1, 1, 1)的形状,而不是(None, 1, 1),因为您已经包括了最后一个通道尺寸。

B = tf.reshape(B, (-1, 1, 1, 1))
C = tf.reshape(C, (-1, 1, 1, 1))

print(B.shape)
print(C.shape)

上面的代码给出以下输出:

(?, 1, 1, 1)
(?, 1, 1, 1)

最后,为什么要从每个像素中减去max,是否意味着要为normalizing each image between 0-1减去min

D = (A - C) / (B - C)
print(D.shape)

给予

(?, 200, 200, 1)

符合预期。