构建一系列张量时,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))
...
效果很好。是什么与众不同?
答案 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)
这应该很好。由于定义了局部变量和全局变量,因此在第二个示例中定义函数可能会起作用。很难说,因为您没有提供完整的代码。