假设我们有形状为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())
,它将通过全局max
和min
归一化所有图像。我希望使用自己的max
和min
对每个图像进行标准化。
换句话说,如何实现max
或min
运算,其结果是:(None, 1, 1, 1)
的形状,其中每个(1, 1, 1)
包含以下项的最大值或最小值:每个图像。
答案 0 :(得分:0)
您可以使用tf.reduce_max
和tf.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)
符合预期。