如何将tensorflow变量约束为int8或uint8?

2024-05-19 01:16:00 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的代码的简化版本:

import tensorflow as tf
x = tf.zeros((10,10), dtype=tf.dtypes.uint8)
x = tf.Variable(x)

with tf.GradientTape() as t:
    obj = 1- tf.reduce_sum(x) # can be anything

optimizer = tf.optimizers.Adam(0.1)
var_list = [x]

grads = t.gradient(obj, var_list)
optimizer.apply_gradients(zip(grads, var_list))

我想将x约束为uint8。这是为了确保当我计算x时,例如,使它成为一个Image对象(Image.fromarray(x.numpy())),所有的张量信息都被保留。我不想做类似(x.numpy() * 255).astype(np.uint8)的事情,因为那样会导致信息丢失。你知道吗

但是,当我运行上面的代码时,我得到

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-02f5e5f2081e> in <module>
     10 
     11 grads = t.gradient(obj, var_list)
---> 12 optimizer.apply_gradients(zip(grads, var_list))

/anaconda3/envs/ml/lib/python3.6/site-packages/tensorflow_core/python/keras/optimizer_v2/optimizer_v2.py in apply_gradients(self, grads_and_vars, name)
    425       ValueError: If none of the variables have gradients.
    426     """
--> 427     grads_and_vars = _filter_grads(grads_and_vars)
    428     var_list = [v for (_, v) in grads_and_vars]
    429 

/anaconda3/envs/ml/lib/python3.6/site-packages/tensorflow_core/python/keras/optimizer_v2/optimizer_v2.py in _filter_grads(grads_and_vars)
   1023   if not filtered:
   1024     raise ValueError("No gradients provided for any variable: %s." %
-> 1025                      ([v.name for _, v in grads_and_vars],))
   1026   if vars_with_empty_grads:
   1027     logging.warning(

ValueError: No gradients provided for any variable: ['patch:0'].

似乎当xuint8时,我不能取它的梯度。如何使x可微,同时确保值被约束为uint8所允许的值,以便在计算和处理uint8张量时,不会丢失任何信息?你知道吗


Tags: andinobjforvartftensorflowvars

热门问题