在张量流中改变张量的比例

时间:2016-07-14 14:08:45

标签: python tensorflow conv-neural-network

对不起,如果我弄乱了标题,我不知道怎么说这个。无论如何,我有一组值的张量,但我想确保张量中的每个元素的范围都是0 - 255,(或者0 - 1也可以)。但是,我不想像softmax那样使所有值加起来为1或255,我只想缩小值。

有没有办法做到这一点?

谢谢!

4 个答案:

答案 0 :(得分:23)

您正在尝试规范化数据。一个经典的标准化公式就是这个:

normalize_value = (value − min_value) / (max_value − min_value)

tensorflow的实现将如下所示:

tensor = tf.div(
   tf.subtract(
      tensor, 
      tf.reduce_min(tensor)
   ), 
   tf.subtract(
      tf.reduce_max(tensor), 
      tf.reduce_min(tensor)
   )
)

张量的所有值都在0和1之间。

重要:确保张量具有浮点/双精度值,或输出张量只有零和1。如果你有一个整数张量,请先调用它:

tensor = tf.to_float(tensor)

答案 1 :(得分:1)

sigmoid(tensor) * 255应该这样做。

答案 2 :(得分:1)

根据维基百科中的feature scaling,您还可以尝试缩放到单位长度:

enter image description here

可以使用以下代码段实现:

In [3]: a = tf.constant([2.0, 4.0, 6.0, 1.0, 0])                                                                                                                                                                     
In [4]: b = a / tf.norm(a)
In [5]: b.eval()
Out[5]: array([ 0.26490647,  0.52981293,  0.79471946,  0.13245323,  0.        ], dtype=float32)

答案 3 :(得分:1)

在某些情况下,您需要分别对每个图像进行归一化 - 例如,每个图像都有噪声的对抗性数据集。假设输入具有典型尺寸 Batch x YDim x XDim x Channels,以下根据其自己的最小值和最大值对每个图像进行归一化:

    cast_input = tf.cast(inputs,dtype=tf.float32)     # e.g. MNIST is integer
    input_min = tf.reduce_min(cast_input,axis=[1,2])  # result B x C
    input_max = tf.reduce_max(cast_input,axis=[1,2])
    ex_min = tf.expand_dims(input_min,axis=1)         #  put back inner dimensions
    ex_max = tf.expand_dims(input_max,axis=1)
    ex_min = tf.expand_dims(ex_min,axis=1)            # one at a time - better way?
    ex_max = tf.expand_dims(ex_max,axis=1)            # Now Bx1x1xC
    input_range = tf.subtract(ex_max, ex_min)
    floored = tf.subtract(cast_input,ex_min)          # broadcast
    scale_input = tf.divide(floored,input_range)

我想像在 Numpy 中一样将维度扩展到一个短片中,但是 tf.expand_dims 似乎一次只接受一个维度 - 在这里接受建议。谢谢!