Как использовать tf.make_tensor_proto для преобразования тензора в ndarray в Tensorflow версии 1 с установлением сеанса?

#python #tensorflow

#python #tensorflow

Вопрос:

Я могу использовать tf.make_tensor_proto в tensorflow2 для преобразования тензора в ndarray следующим образом

 action=tf.Variable([20.,10.,6.,9.],dtype=tf.float64)
bound=tf.Variable([10,20,5,10],dtype=tf.float64)
mask=tf.greater(bound, action )
proto_tensor=tf.make_tensor_proto(mask)
ndarry=tf.make_ndarray(proto_tensor)
print(ndarry)
  

и это может превзойти [False True False True] тип ndarry

Однако я хочу сделать это в tensorflow1 с помощью session и я пытаюсь таким образом

 #using sess.run must disable eager execution in tensorflow 2
tf.compat.v1.disable_eager_execution() 
action=tf.Variable([20.,10.,6.,9.],dtype=tf.float64)
bound=tf.Variable([10,20,5,10],dtype=tf.float64)
sess = tf.compat.v1.Session()
mask = tf.greater(bound,action)
proto_tensor=tf.compat.v1.make_tensor_proto(mask)
ndarry=tf.compat.v1.make_ndarray(proto_tensor)
print(sess.run(ndarry))
  

в нем будет эта ошибка

 Traceback (most recent call last):

  File "C:UsersstitchDesktopCG_metting0gym-BSS-masterDDPG-With-EnvBSStensor_test_v2.py", line 407, in <module>
    proto_tensor=tf.compat.v1.make_tensor_proto(mask)

  File "C:UsersstitchanacondaenvsCG_tensor2libsite-packagestensorflow_corepythonframeworktensor_util.py", line 451, in make_tensor_proto
    _AssertCompatible(values, dtype)

  File "C:UsersstitchanacondaenvsCG_tensor2libsite-packagestensorflow_corepythonframeworktensor_util.py", line 328, in _AssertCompatible
    raise TypeError("List of Tensors when single Tensor expected")

TypeError: List of Tensors when single Tensor expected
  

И я пытаюсь в каждом конкретном случае увидеть, что, если не использовать session в версии v1 (поэтому нам не нужно отключать быстрое выполнение), но в моем учебном примере мне нужно иметь session в моем коде, могу ли я в любом случае изменить его на ndarray с помощью этой функции (make_tesensor_proto и make_ndarry в tensorflow) без ошибок?

Ответ №1:

Что было неправильно: вы не можете преобразовать tf.variable в массив numpy с помощью выполнения graph и должны использовать tf.constant вместо этого. Также использование tf.make_tensor_proto бессмысленно, поскольку sess.run преобразует тензор в массив numpy для вас.

Объяснение: Преобразуйте свои действия в константы TF вместо переменных или используйте вместо них константы (преобразование переменных невозможно). Затем примените ту же логику к вашей привязке. Затем создайте маску, как вы делали ранее. Наконец, создайте сеанс и оцените маску в сеансе.

Вот код для преобразования вашей маски в массив numpy с использованием выполнения graph:

 import tensorflow as tf
import numpy as np

graph = tf.Graph()

with graph.as_default():
  action=tf.constant([20.,10.,6.,9.],dtype=tf.float64)
  bound=tf.constant([10,20,5,10],dtype=tf.float64)
  mask = tf.greater(bound,action)

  with tf.compat.v1.Session() as sess:
    result = sess.run(mask)

print(result)
  

Исходя из вашей ситуации, я думаю, что это лучший способ сделать это. Но вы также могли бы использовать tf.py_func для создания функции, которая преобразовывала бы маску в массив numpy.