在 Theano 中计算裁剪后的饱和值

Calculate saturated values after clipping in Theano

我正在使用 theano.clip 来限制我的 numpy 数组的值。例如

array = np.array([[  1.,  -1.,  -3.,   1.,   1.],
         [  3.,  -4.,  -5.,   0.,  -1.],
         [  8.,  -3.,  -7.,  -3.,  -3.],
         [  8.,   2.,  -2.,  -3.,  -3.],
         [  7.,   0.,   0.,   1.,   0.]])

max_val = np.array([2.0]).astype('float32')

T.clip(array, -max_val, max_val).eval()

输出:

array([[ 1., -1., -2.,  1.,  1.],
       [ 2., -2., -2.,  0., -1.],
       [ 2., -2., -2., -2., -2.],
       [ 2.,  2., -2., -2., -2.],
       [ 2.,  0.,  0.,  1.,  0.]])

我想计算裁剪操作后裁剪了多少个值。可能吗?

如果你的数组名称是a,你可以

np.logical_or(a >= 1, a <= -1).sum()

您不会对元素进行两次计数,因为 - max_val < max_val。但是,这需要 a.

两遍

这是一种方法 np.count_nonzero 掩码值超出通过与最小和最大限制进行比较计算的限制 -

np.count_nonzero((array < -max_val) | (array > max_val))

np.count_nonzero 是为了提高性能,因为它在 mask/boolean 数组上运行以获得总计数 .

或者,使用绝对值作为最小和最大限制的较短版本,因为在这种情况下,它们只是同一限制数的负值和正值 -

np.count_nonzero(np.abs(array) > max_val)

样本运行-

In [267]: array
Out[267]: 
array([[ 1., -1., -3.,  1.,  1.],
       [ 3., -4., -5.,  0., -1.],
       [ 8., -3., -7., -3., -3.],
       [ 8.,  2., -2., -3., -3.],
       [ 7.,  0.,  0.,  1.,  0.]])

In [268]: max_val = np.array([2.0]).astype('float32')

In [269]: np.count_nonzero((array < -max_val) | (array > max_val))
Out[269]: 13

In [270]: np.count_nonzero(np.abs(array) > max_val)
Out[270]: 13