以下是我的代码的简化版本:
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'].
似乎当x
是uint8
时,我不能取它的梯度。如何使x
可微,同时确保值被约束为uint8
所允许的值,以便在计算和处理uint8张量时,不会丢失任何信息?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐