为什么tf操纵仅在任意函数中起作用?

时间:2018-09-03 09:40:08

标签: python tensorflow

构建一系列张量时,tensorflow的操纵函数(例如tf.transpose(~)tf.split(~)会返回错误。

代码

window = 60
len_feat= 15
X = tf.placeholder(tf.float32, shape=[None, window, len_feat]
X = tf.transpose(X, (1,0,2))

tf.Session().run(X, feed_dict={X: x}) #x has a shape (100, 60, 15)

错误

"shape (100, 60, 15) can't be reshaped into (60, ?, 15)"

但是,如果我构建任意函数,例如:

X = tf.placeholder(tf.float32, shape=[None, window, len_feat])
def fun(X):
    X = tf.transpose(X, (1,0,2))
    ...

效果很好。是什么与众不同?

1 个答案:

答案 0 :(得分:0)

在第一个代码段中,您将通过转置的结果覆盖占位符。这是不再的占位符。

请注意,feed_dict允许您替换任何张量的值,而不仅仅是占位符。但是,由于占位符的形状为[None,60,15],因此转置的形状为[60,None,15]。因此,形状为[100,60,15]的数据无法放入此张量,因为第一个维度不匹配。

您只需重命名变量即可修复第一个代码段。例如

window = 60
len_feat= 15
X = tf.placeholder(tf.float32, shape=[None, window, len_feat]
Y = tf.transpose(X, (1,0,2))

tf.Session().run(Y, feed_dict={X: x}) #x has a shape (100, 60, 15)

这应该很好。由于定义了局部变量和全局变量,因此在第二个示例中定义函数可能会起作用。很难说,因为您没有提供完整的代码。