python-3.x - 在循环内修改 Tensorflow 变量
问题描述
我想在 while 循环中修改变量的某些索引。基本上将下面的python代码转换为Tensorflow:
import numpy
tf_variable=numpy.zeros(10,numpy.int32)
for i in range (10):
tf_variable[i]=i
tf_variable
Tensorflow 代码如下所示:除了它给出错误
import tensorflow as tf
var=tf.get_variable('var',initializer=tf.zeros([10],tf.int32),trainable=False)
itr=tf.constant(0)
sess=tf.Session()
sess.run(tf.global_variables_initializer()) #initializing variables
print('itr=',sess.run(itr))
def w_c(itr,var):
return(tf.less(itr,10))
def w_b(itr,var):
var=tf.assign(var[1],9) #lets say i want to modify index 1 of variable var
itr=tf.add(itr,1)
return [itr,var] #these tensors when returning actually get called
OP=tf.while_loop(w_c,w_b,[itr,var],parallel_iterations=1,back_prop=False)
print(sess.run(OP))
谢谢
解决方案
在 CPU 上“绕道”并不总是可行的(你会失去梯度)。以下是如何在 TensorFlow 中实现您的 numpy 示例的可能性(受这篇文章和我在另一篇文章中给出的答案的启发)
import tensorflow as tf
tf_variable = tf.Variable(tf.ones([10]))
def body(i, v):
index = i
new_value = tf.to_float(i)
delta_value = new_value - v[index:index+1]
delta = tf.SparseTensor([[index]], delta_value, (10,))
v_updated = v + tf.sparse_tensor_to_dense(delta)
return tf.add(i, 1), v_updated
_, updated = tf.while_loop(lambda i, _: tf.less(i, 10), body, [0, tf_variable])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(tf_variable))
print(sess.run(updated))
这打印
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
推荐阅读
- reactjs - 如何测试 Redux 的 dispatch() 已在 React Component (Jest + Enzyme) 中被调用
- python - PYTHON:循环通过 xml 文件
- nservicebus - NServiceBus 使用什么队列?
- python - python中字符串的子字符串
- ruby-on-rails - nokogiri gem install rails 出错
- python - 允许用户上传图片并以 html 显示(使用 base64 和 python)
- c# - C# 应用系统睡眠/唤醒事件
- c# - div内元素的Webdriver超时异常
- css - 最适合容器的子 div(行和列)
- workflow - 寻找合适的工作流工具