tensorflow - Tensorflow 最小化整数
问题描述
我正在尝试实现一个函数,该函数最小化一个函数,其中参数由数组的条目给出。我尝试了示例代码:
z = tf.Variable(6., trainable=True)
A=np.linspace(-1,1,50)
data_tf = tf.convert_to_tensor(A, np.float32)
f_x = data_tf[tf.cast(tf.clip_by_value(z,0,25),tf.int32)]
loss = f_x
opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(100):
print(sess.run([z,loss]))
sess.run(opt)
这给了我错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-35-278fa6e8507a> in <module>()
14
15 loss = f_x
---> 16 opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)
17
18 with tf.Session() as sess:
~\Anaconda3\lib\site-packages\tensorflow\python\training\optimizer.py in
minimize(self, loss, global_step, var_list, gate_gradients,
aggregation_method, colocate_gradients_with_ops, name, grad_loss)
405 “No gradients provided for any variable, check your graph for
ops”
406 “ that do not support gradients, between variables %s and loss
%s.” %
--> 407 ([str(v) for _, v in grads_and_vars], loss))
408
409 return self.apply_gradients(grads_and_vars, global_step=global_step,
ValueError: No gradients provided for any variable, check your graph for ops
that
do not support gradients, between variables ["<tf.Variable 'Variable:0'
shape=()
dtype=float32_ref>",
有人有想法吗?
解决方案
如错误消息所述,您尝试最小化的功能是不可微的。区域切片操作根本无法连接到tf.Variable
您定义的。但是,此示例将起作用
z = tf.Variable(6., trainable=True)
e = tf.Variable(0., trainable=True)
A = np.linspace(-1, 1, 50)
data_tf = tf.convert_to_tensor(A, np.float32)
idx = tf.cast(tf.clip_by_value(z,0,25),tf.int32)
f_x = tf.slice(data_tf, [idx],[1])
f_x = tf.reduce_sum(f_x - e)
loss = f_x
opt = tf.train.GradientDescentOptimizer(1).minimize(f_x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(100):
sess.run(opt)
print(sess.run([z,loss]))
z
编辑:您可以添加这样的副本
zz = tf.identity(z)
但它会将其值与原始变量联系起来,因此您仍然需要将其添加到最终操作(在本例中reduce_sum
)以使其可微。这是因为如果您将其转换为 int 并作为索引传递,它将停止可微。为了改变它,您需要在原始值和 f_x 之间建立联系。希望这能让它更清楚。
推荐阅读
- google-app-engine - 如何为 appengine 托管的 GO 服务器禁用 HTTP/2?
- python - 将 Django 项目从 Python 2 转换为 Python 3:pip3 install django_comments NameError unicode
- java - TableView 的样式如何?
- linear-programming - 当 dvar B 依赖于 A 时,如何随着 dvar A 的变化而改变 dvar B 的值
- java - 即使我给了 6 GB -Xmx,Netflix zuul (AWS) 也出现内存不足错误
- javascript - 如何在 MVC4 C# 中编写 javascript?
- amazon-web-services - 如何将我的自签名证书绑定到我购买的域?
- java - 如何使用休眠@ID 实现共享主键
- java - 如果我有一百万个实例,类方法会重复一百万次吗?
- c# - add-migration 正在组合所有上下文模式/表