在TensorFlow中,我想将一个“假”量化函数应用于我的一个张量。具体来说,我对使用this函数感兴趣:
fake_quant_with_min_max_args(
inputs,
min=-6,
max=6,
num_bits=8,
narrow_range=False,
name=None
)
它开箱即用。理想情况下,我想根据输入张量调整min
和max
参数。具体来说,我想使用99.7% rule来定义该范围。换句话说,我想使用值的范围,如果将输入张量表示为一维向量,其99.7%的元素将位于 [mean-3 * std,mean + 3 * std]之间] 范围。
为此,我执行以下操作:
def smartFakeQuantization(tensor):
# Convert the input tensor to a 1-d tensor
t_1d_data = tf.reshape(tensor,[tf.size(tensor), 1])
# get the moments of that tensor. Now mean and var have shape (1,)
mean, var = tf.nn.moments(t_1d_data, axes=[0])
# get a tensor containing the std
std = tf.sqrt(var)
< some code to get the values of those tensors at run-time>
clip_range = np.round([mean_val - 3*std_val, mean_val + 3*stdstd_val], decimals=3)
return tf.fake_quant_with_min_max_args(tensor, min=clip_range[0], max=clip_range[1])
我知道我可以通过执行以下操作来评估图中的任何张量:myTensor.eval()
或mySession.run(myTensor)
但是如果我在上面的函数中添加这些行,那么在执行图形时它会崩溃。我会收到表格错误:
张量&lt; ...&gt;被标记为不可取。
我正在遵循的步骤可能不是TensorFlow“图形”性质的正确步骤。有什么想法可以做到这一点?总结一下,我想在运行时使用张量值来修改另一个张量。我会说这个问题比使用tf.cond()
可以做的更复杂。
答案 0 :(得分:1)
我不认为有一种简单的方法可以做你想做的事。 min
的{{1}}和max
参数将转换为操作属性,并在基础内核construction中使用。它们不能在运行时更改。有一些(似乎不是公共API的一部分)ops(请参阅fake_quant_with_min_max_args
和LastValueQuantize
)根据他们看到的数据调整他们的间隔,但他们做得不够你想要什么。
您可以编写自己的自定义操作,或者如果您认为这通常是有价值的,请在github上提交功能请求。
答案 1 :(得分:0)
您可以使用tf.fake_quant_with_min_max_vars,它接受张量作为最小/最大参数:
return tf.fake_quant_with_min_max_vars(tensor, min=mean-3*std, max=mean+3*std)