У меня есть прогноз временных рядов, который я создал с помощью модели 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, похоже, не имеет назначенных значений... что я пропустил? Я попробовал intializing y_pred0 с tf.zeros(shape (y_pred)), но это дает те же результаты. Я уверен, что это ошибка новобранец, но я потратил слишком много времени на ее решение.
Любая помощь очень ценится!
Здесь вы смешиваете символические и числовые вычисления. Операторы Tensorflow более или менее всегда возвращают символические тензоры - они содержат только информацию, которая может быть выведена из того, как они вычисляются (например, форма или тип), но нет фактических значений. Значения вычисляются с помощью run
вызова в сеансе, и эти значения, как правило, возвращаются в виде Numpy массивов.
В вашем примере у вас есть массив numpy в y_pred
(результат run
), но tf.maximum
в tf.maximum
. Теперь это создаст символический maximum
op, который также вернет символический тензор. Массив numpy, который вы положили, фактически преобразуется в тензор под капотом. У вас есть два варианта:
np.maximum
на y_pred
.outputs0 = tf.maximum(outputs, tf.zeros(tf.shape(outputs)))
а затем оцените его с помощью sess.run(outputs0, feed_dict={X: X_test})
. Это предполагает, что outputs
представляют собой некоторые символические вычисления, как в вашем примере.Код делает то, что мне нужно:
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]
Может быть, у вас проблемы с фидом или сеансом фида? В случае, если вам интересно, почему вывод печати - Tensor ("Maximum_2: 0", shape = (1, 11, 1), dtype = float32), Tensorflow строит график перед выполнением. Это означает, что в настоящее время нет реальных значений, только формы и поток. Если вы хотите распечатать значения, вы должны сделать это из сеанса выполнения, как это было в моем примере.