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

agu*_*231 10 python conv-neural-network tensorflow

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

有没有办法做到这一点?

谢谢!

Wil*_*ück 26

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

normalize_value = (value ? min_value) / (max_value ? min_value)
Run Code Online (Sandbox Code Playgroud)

tensorflow的实现如下所示:

tensor = tf.div(
   tf.subtract(
      tensor, 
      tf.reduce_min(tensor)
   ), 
   tf.subtract(
      tf.reduce_max(tensor), 
      tf.reduce_min(tensor)
   )
)
Run Code Online (Sandbox Code Playgroud)

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

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

tensor = tf.to_float(tensor)
Run Code Online (Sandbox Code Playgroud)

  • 然后将epsilon加到分子上,将2 * epsilon加到分母上,以在val == max == min`(val-min_val + epsilon)/ max((max_val-min_val),2 * epsilon)时得到0.5。 (3认同)
  • 还要确保取一个小值(即epsilon = 1e-12)和分母的最大值,以避免div除以零。`(val-min_val)/ max((max_val-min_val),epsilon)` (2认同)

Ler*_*ang 6

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

在此处输入图片说明

可以使用这段代码来实现:

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)
Run Code Online (Sandbox Code Playgroud)


Alb*_*ert 5

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