#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.