Вычислить среднее значение для каждой строки тензора в TensorFlow

1

Я новичок в тензорном потоке, и я хочу вычислить среднее значение из каждой строки из тензора. Для этого Tensorflow выполняет операцию tf.reduce_mean. Проблема заключается в том, что когда строка имеет значение nan, среднее значение для этой строки также является наном. Кроме того, я хочу реализовать это самостоятельно, чтобы лучше понять философию, основанную на тензорном потоке. Итак, как я мог реализовать это вручную? Код, который я написал:

import tensorflow as tf
import numpy as np

ratings = np.array([[7, 6, 7, 4, 5, 4], [6, 7, np.NaN, 4, 3, 4], [np.NaN, 3, 3, 1, 1, np.NaN],
                   [1, 2, 2, 3, 3, 4], [1, np.NaN, 1, 2, 3, 3]], dtype = np.float16)

tRatings = tf.convert_to_tensor(ratings, dtype = np.float16)

means = tf.get_variable("means", shape=(5), dtype=tf.float16)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    mean = tf.reduce_mean(tRatings, axis=1)
    print(sess.run(mean))
  • 0
    Существует два подхода: вы можете определить среднюю операцию в numpy и использовать tf.py_func для вызова функции numpy. В качестве альтернативы, определите его в самом тензорном потоке, но замените NaN на 0 по желанию. Вы можете использовать tRatings = tf.where (tf.is_nan (tRatings), tf.zeros_like (tRatings), tRatings), чтобы заменить NaN нулями.
  • 0
    Если я заменю значения nan на нули, я найду неправильное среднее значение. Я хочу вычислить среднее значение из существующих значений в каждой строке.
Показать ещё 1 комментарий
Теги:
tensorflow

1 ответ

1
Лучший ответ
import tensorflow as tf
import numpy as np
ratings = np.array([[7, 6, 7, 4, 5, 4], [6, 7, np.NaN, 4, 3, 4], [np.NaN, 3, 3, 1, 1, np.NaN],
                       [1, 2, 2, 3, 3, 4], [1, np.NaN, 1, 2, 3, 3]], dtype = np.float16)

tRatings = tf.convert_to_tensor(ratings, dtype = np.float16)
means = tf.get_variable("means", shape=(5), dtype=tf.float16)
with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  #mean = tf.reduce_mean(tRatings, axis=1)
  tRatings_wonan=tf.where(tf.is_nan(tRatings), tf.zeros_like(tRatings), tRatings)
  sum = tf.reduce_sum(tRatings_wonan,axis=1)
  count_nans = tf.reduce_sum(tf.cast(tf.is_nan(tRatings), tf.float16),axis=1)
  mean = tf.div(sum,tf.subtract(tf.cast(tf.shape(tRatings)[1], tf.float16),count_nans))
  print(sess.run(mean))
  • 0
    Большое спасибо за ответ. Если я использую tf.py_func, я теряю много эффективности?
  • 0
    Зависит от конкретной реализации: stackoverflow.com/questions/42927920/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню