Преобразование tf.gradients в тензорный тип - PullRequest
2 голосов
/ 19 июня 2020

Я использую тензорный поток 1.14.0. Я хотел бы знать, как я могу ввести список приведения в тензор. Я получаю эту ошибку при попытке использовать tf.convert_to_tensor (). Благодарю за любую помощь

Не удалось преобразовать объект типа в Tensor. Содержание: [Нет]. Рассмотрим приведение элементов к поддерживаемому типу.

Вот мой код

def testtf4():
    x = tf.placeholder(tf.float32, shape=[None])
    y = tf.placeholder(tf.float32, shape=[None])
    op = tf.placeholder(tf.float32, shape=[None,3])

    print("\nshape of x,y", x.shape, y.shape)
    arr = np.genfromtxt("C:\\Data\\Training_and_codes\\ML\\TF Samples\\Data.csv", delimiter=",");
    gradmulx_op = tf.gradients(op[:,0],x)
    gradmuly_op = tf.gradients(op[:,0],y)
    tgradmulx_op = tf.convert_to_tensor(gradmulx_op)
    tgradmuly_op = tf.convert_to_tensor(gradmuly_op)
    print("\nshape of gradmul tensors", tgradmulx_op.shape, tgradmuly_op.shape)

    with tf.Session() as sess:
        print("started session......\n")
        input_feed={}
        input_feed[x]=arr[:,0]
        input_feed[y]=arr[:,1]
        input_feed[op]=arr[:,2:4]
        [gradx, grady] = sess.run([tgradmulx_op, tgradmuly_op],input_feed)
        print("x gradient",gradx) 
        print("y gradient",grady) 

1 Ответ

1 голос
/ 19 июня 2020

Ваша проблема связана не с tf.convert_to_tensor, а с тем фактом, что вы пытаетесь вычислить некоторые градиенты, которых не существует. У вас есть эти два заполнителя:

x = tf.placeholder(tf.float32, shape=[None])
op = tf.placeholder(tf.float32, shape=[None, 3])

И затем вы пытаетесь получить следующие градиенты:

gradmulx_op = tf.gradients(op[:, 0], x)
gradmuly_op = tf.gradients(op[:, 0], y)

Чтобы эти градиенты существовали (то есть не были None), значение op[:, 0] должно быть результатом одной или нескольких дифференцируемых операций с использованием x и y. Например, если op было определено как:

op = tf.stack([2 * x + 3 * y, x - 1, 2 * y + 2], axis=1)

, тогда это будет работать, потому что op[:, 0] будет вычисляться из x и y (и, возможно, других значений), поэтому существует градиент между тензорами. Или, другими словами, изменение x или y изменяет значение op[:, 0]. TensorFlow отслеживает операции, используемые для вычисления каждого значения, и использует эту информацию для автоматического вычисления градиентов.

Но op не вычисляется из x и y, фактически оно не вычисляется из что угодно, поскольку это заполнитель, это просто заданное значение. Изменение x или y не влечет за собой изменение op. Таким образом, между этими тензорами нет градиентов. Я не уверен, чего вы пытаетесь достичь с помощью своего кода, но вам, вероятно, нужно переосмыслить, какой именно результат вы хотите вычислить.

...