Dan*_*ela 12 python tensorflow
我发现索引仍然是tensorflow中的一个开放问题(#206),所以我想知道我现在可以使用什么作为解决方法.我想基于每个训练示例更改的变量来索引/切片矩阵的行/列.
到目前为止我尝试过的:
以下(工作)代码片基于固定数字.
import tensorflow as tf
import numpy as np
x = tf.placeholder("float")
y = tf.slice(x,[0],[1])
#initialize
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#run
result = sess.run(y, feed_dict={x:[1,2,3,4,5]})
print(result)
Run Code Online (Sandbox Code Playgroud)
但是,似乎我不能简单地用tf.placeholder替换其中一个固定数字.下面的代码给出了错误"TypeError:预期单个Tensor时的张量列表".
import tensorflow as tf
import numpy as np
x = tf.placeholder("float")
i = tf.placeholder("int32")
y = tf.slice(x,[i],[1])
#initialize
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#run
result = sess.run(y, feed_dict={x:[1,2,3,4,5],i:0})
print(result)
Run Code Online (Sandbox Code Playgroud)
这听起来像[i]周围的括号太多,但删除它们也无济于事.如何使用占位符/变量作为索引?
我也尝试使用普通的python变量作为索引.这不会导致错误,但网络在训练时不会学到任何东西.我想因为更改的变量没有正确注册,图表格式错误,更新不起作用?
我找到的一个解决方法是使用单热矢量.在numpy中创建一个热矢量,使用占位符传递它,然后通过矩阵乘法进行切片.这有效,但速度很慢.
任何想法如何基于变量有效切片/索引?
mrr*_*rry 16
基于占位符切片应该可以正常工作.由于形状和类型的一些微妙问题,您似乎遇到了类型错误.你有以下地方:
x = tf.placeholder("float")
i = tf.placeholder("int32")
y = tf.slice(x,[i],[1])
Run Code Online (Sandbox Code Playgroud)
......你应该改为:
x = tf.placeholder("float")
i = tf.placeholder("int32")
y = tf.slice(x,i,[1])
Run Code Online (Sandbox Code Playgroud)
...然后你应该i像[0]打电话一样喂食sess.run().
为了使这一点更清楚,我建议重写代码如下:
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, shape=[None]) # 1-D tensor
i = tf.placeholder(tf.int32, shape=[1])
y = tf.slice(x, i, [1])
#initialize
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
#run
result = sess.run(y, feed_dict={x: [1, 2, 3, 4, 5], i: [0]})
print(result)
Run Code Online (Sandbox Code Playgroud)
op 的附加shape参数tf.placeholder有助于确保您提供的值具有适当的形状,并且如果形状不正确,TensorFlow也会引发错误.