首页 > 解决方案 > 为什么 tf 操作仅在任意函数中有效?

问题描述

当我构建一系列张量时, 的操作函数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))
    ...

它运作良好。是什么造成了这种差异?

标签: pythontensorflow

解决方案


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

请注意,它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)

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


推荐阅读