Основы Tensorflow, ошибка вычисления tf .less - PullRequest
1 голос
/ 05 мая 2020

Предположим, что я хочу вычислить операцию:

[[1   2   3   4 ],     [1      [[1  2  3   4],
[5   6   7   8 ],       2       [10 12 14  16],
[9   10  11  12],   x   3   =   [27 30 33  36],
[13  14  15  16]]       4]      [42  56  60  64]]

просто попытался сделать это в тензорном потоке со следующим подходом:

inputs=tf.ones((2,10,10,5))

# generate random tensor in shape (10,10) filled with random number from 0 to 100 
gram=tf.random.uniform(shape=(10,10), minval=0, maxval=100,dtype=tf.int32) 

# defining a column vector filled with 10,20 ....
thresh=tf.constant([0,10,20,30,40,50,60,70,80,90], shape=[10,1],dtype=tf.int32) 

# calculate less 
outputs=tf.math.less(gram,thresh)

Используя int32 или float32 приводит к тому же результату. На самом деле сравнения неверны, вот результат:

sess = tf.compat.v1.Session()
print(sess.run(gram))
print(sess.run(outputs))


gram tensor with random values

[[19 58  2 41 50 28 42  4 40 31]
 [71 33 38 16 56  2 26 83 10 33]
 [44 62 54 48 28 27 83 62  7 67]
 [19 96 65 12 55 30 98  8  9 47]
 [62 98 39 60 60 84 17 66  2 44]
 [64 64 37 87 96 48 22 78 62 86]
 [ 8 62 65 58 62 18 67 27  3  5]
 [87 73  4 48  3 33 23 71 21 43]
 [ 3 10 26 44 22  1  7 12  5 70]
 [18  6 10 63  2 69  5 43 58 10]]


corresponding boolean mask

 [[False False False False False False False False False False]
 [False False False False False False  True False False False]
 [ True  True False False  True False  True False  True False]
 [False False  True False False False  True False False False]
 [False False False  True False  True False False False False]
 [False  True False  True  True False  True  True  True  True]
 [ True  True  True False  True False  True  True  True  True]
 [False  True False  True False  True False  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]]

Сравните матрицу граммов и результат, например (row 8, column 2) 73 <70 -> False, но вместо этого есть TRUE. Как я могу это исправить и откуда это взялось. Спасибо

1 Ответ

1 голос
/ 11 мая 2020

Предоставление решения здесь (Раздел ответов), даже если оно присутствует в разделе комментариев, для пользы сообщества.

Как правильно заметил jdehesa, каждый раз, когда вы вызываете run тензор gram получит новое случайное значение, потому что вы используете tf.random. Чтобы получить одинаковое значение для каждого run, используйте tf.constant.

Код,

print(sess.run(gram))
print(sess.run(outputs))

можно заменить на, что решило проблему

print(sess.run([gram, outputs]))

Завершено рабочий код показан ниже:

import tensorflow as tf

with tf.compat.v1.Session() as sess:
  inputs=tf.ones((2,10,10,5))
  # generate random tensor in shape (10,10) filled with random number from 0 to 100
  gram=tf.random.uniform(shape=(10,10), minval=0, maxval=100,dtype=tf.int32) 
  # defining a column vector filled with 10,20 ....
  thresh=tf.constant([0,10,20,30,40,50,60,70,80,90], shape=[10,1],dtype=tf.int32) 
  # calculate less 
  outputs=tf.math.less(gram,thresh)
  print(*sess.run([gram, outputs]), sep='\n')

Вывод:

[[79 44 24 67 53 90  0 57 74 86]
 [47 17 24 81 16 12 22 52 63 70]
 [17 94 71 76 23 66 76 59 77 19]
 [17 43 12 90 27 28 27 89 39 20]
 [22 49 38 49 56 70 77 40 71 13]
 [29 73  2 45 30  2 88 65 65 88]
 [79 15 31 44 19  2 74  4  7 35]
 [89 67 76 66  4 14 63 29 90  6]
 [86 51 61 17 79 78 64 67 33 63]
 [45 16 30 93 75 42 86 93 63 84]]

[[False False False False False False False False False False]
 [False False False False False False False False False False]
 [ True False False False False False False False False  True]
 [ True False  True False  True  True  True False False  True]
 [ True False  True False False False False False False  True]
 [ True False  True  True  True  True False False False False]
 [False  True  True  True  True  True False  True  True  True]
 [False  True False  True  True  True  True  True False  True]
 [False  True  True  True  True  True  True  True  True  True]
 [ True  True  True False  True  True  True False  True  True]]
...