我有一个通过RNN模型生成的时间序列预测。时间序列是一个零界的正序列,而预测生成一个负值。我以为可以使用以下代码将值替换为零:
y_pred = sess.run(outputs, feed_dict={X: X_test}) # generate the forecast values
y_pred0 = tf.maximum(y_pred, tf.zeros(tf.shape(y_pred))) # eliminate values<0
张量尺寸匹配...
print(y_pred.shape)
print(y_pred0.shape)
print(y_pred0)
(1, 11, 1)
(1, 11, 1)
Tensor("Maximum_2:0", shape=(1, 11, 1), dtype=float32)
...但是y_pred0张量似乎没有赋值...我错过了什么?我尝试使用tf.zeros(shape(y_pred))初始化y_pred0,但是产生的结果相同。我确信这是一个菜鸟错误,但是我现在花了太多时间试图解决它。
非常感谢您的帮助!
答案 0 :(得分:0)
您正在这里混合符号和数字计算。 Tensorflow操作或多或少总是返回符号张量-它们仅包含可从它们的计算方式推断的信息(例如shape或dtype),而没有实际值。通过会话中的run
调用来计算值,这些值通常以numpy数组的形式返回。
在您的示例中,您在y_pred
中有一个numpy数组(run
的输出),但是将其输入tf.maximum
中。现在,这将创建 symbolic maximum
op,它也返回一个符号张量。您放入的numpy数组实际上已转换为内部的张量。您在这里有两个选择:
np.maximum
上使用y_pred
。outputs0 = tf.maximum(outputs, tf.zeros(tf.shape(outputs)))
的op,然后通过sess.run(outputs0, feed_dict={X: X_test})
对其进行评估。假设outputs
代表您的示例中的一些符号计算。答案 1 :(得分:0)
代码对我而言应做的事情:
import tensorflow as tf
if __name__ == '__main__':
y_pred = tf.convert_to_tensor([1,0,-1,1,-1])
y_pred0 = tf.maximum(y_pred, tf.zeros(tf.shape(y_pred), dtype=y_pred.dtype))
with tf.Session() as sess:
print(sess.run(y_pred0))
产量:
[1 0 0 1 0]
也许您的Feed字典或会话有问题?如果您想知道为什么打印输出是Tensor(“ Maximum_2:0”,shape =(1,11,1),dtype = float32),Tensorflow会在执行之前构建图形。这意味着目前没有可用的实际值,只有形状和流量。如果要打印值,则必须像我在示例中那样在执行会话中进行打印。