Назначение строк в тензорных бросках «Ни одно значение не поддерживается» - PullRequest
1 голос
/ 30 сентября 2019

Я написал программу для обновления строк с одного тензора на другой. Ниже приведено очень общее представление о том, чего я хочу достичь

with tf.Session() as sess:
    A = tf.Variable(
        [[[0.2, 0.8, 0.1], [0.0, 1.0, 3.0], [0.0, 1.0, 3.0]], [[0.0, 1.0, 1.0], [0.0, 1.0, 0.5], [0.0, 1.0, 3.0]],
         [[0.0, 1.0, 0.6], [0.0, 1.0, 0.4], [0.0, 1.0, 3.0]]])
    B = tf.Variable(
        [[[1.2, 1.8, 1.1], [1.1, 1.1, 3.1], [1.1, 1.1, 3.1]], [[1.1, 1.1, 1.1], [1.1 ,1.1, 1.5], [1.1, 1.1, 3.1]],
         [[1.0, 1.0, 1.6], [1.1, 1.1, 1.4], [1.1, 1.1, 3.1]]])

    sess.run(tf.global_variables_initializer())
    parent1 = 0
    parent2 = 1

    print("\n A")
    print(sess.run(A[parent2][0]))
    # A=[0. 1. 1.]
    print("\n B")
    print(sess.run(B[parent1][0]))
    # B=[0.2 0.8 0.1]
    print("\n Result")
    B = B[0,0].assign(A[1,0])
    print(sess.run(B[0]))
    #  Result
    # [[0.  1.  1. ]
    #  [1.1 1.1 3.1]
    #  [1.1 1.1 3.1]]

Это работает. Моя проблема возникает, когда я добавляю второй оператор:

print("\n Result")
B = B[0,0].assign(A[1,0])
B = B[1,0].assign(A[0,0])

Затем я получаю сообщение (полная трассировка стека внизу):

ValueError: None values not supported.

Кажется, по какой-то причине он пытаетсясделать внутреннее преобразование в тензор и по какой-то причине передается тип None. Я попытался оценить переменную, прежде чем пытаться продолжить, что также не работает. Идея состоит в том, чтобы добраться до точки, где я могу использовать цикл следующим образом:

for i in indexes:
    B = B[parent1][i].assign(A[parent2][i])
    B = B[parent2][i].assign(A[parent1][i])

Полная трассировка стека:

Traceback (most recent call last):
  File "tensorflow\python\framework\op_def_library.py", line 527, in _apply_op_helper
    preferred_dtype=default_dtype)
  File "tensorflow\python\framework\ops.py", line 1224, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "tensorflow\python\framework\constant_op.py", line 305, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "tensorflow\python\framework\constant_op.py", line 246, in constant
    allow_broadcast=True)
  File "tensorflow\python\framework\constant_op.py", line 284, in _constant_impl
    allow_broadcast=allow_broadcast))
  File "tensorflow\python\framework\tensor_util.py", line 454, in make_tensor_proto
    raise ValueError("None values not supported.")
ValueError: None values not supported.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

B = B [0,0] .assign (A [1,0]) B = B [1,0] .assign (A [0,0])

Я попытался повторить ваш коди я не получил ту же ошибку, но вместо этого получил «Sliced ​​присвоение поддерживается только для переменных». Это также верно, поскольку после разрезания B он больше не является переменной, а становится тензором.

Нотация с разрезом в стиле numpy (тензор [a: b]) - это просто сокращение для более длинной нотации тензорного потока tf. срез (тензор, а, а + б), который выводит новую тензорную операцию на графике (см. https://www.tensorflow.org/api_docs/python/tf/slice).

Надеюсь, это поможет понять проблему.

0 голосов
/ 30 сентября 2019

Несмотря на то, что я не обнаружил эту ошибку, в настоящее время для обхода этой проблемы используется tf.assign.

op1 = tf.assign(B[0,0], A[1,0])
op2 = tf.assign(B[1,0], A[0,0])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run([op1, op2])
    print(B.eval())
#[[[0.  1.  1. ]
#   [1.1 1.1 3.1]
#   [1.1 1.1 3.1]]

#  [[0.2 0.8 0.1]
#   [1.1 1.1 1.5]
#   [1.1 1.1 3.1]]

#  [[1.  1.  1.6]
#   [1.1 1.1 1.4]
#   [1.1 1.1 3.1]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...