ValueError: Градиенты не указаны ни для одной переменной: ['Variable: 0']., При реализации SGD в TensorFlow 2.0 - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь реализовать SGD, чтобы найти несколько минимумов потенциальной функции, но сталкиваюсь с этой ошибкой. Я прилагаю игрушечную версию своего кода, может кто-нибудь указать на ошибку (ы), которые я сделал здесь:

import tensorflow as tf
num_stacks = 4
# tf.random.set_seed(42)
N4 = 2 

def Z(i, j, N4):
    """
    Creating randomly initialized matrix of given shape 
    """
    N = tf.Variable(tf.ones(num_stacks, tf.int32))
    N = N[-1].assign(N4)
    if i or j == 4:
        shape = (N[i - 1], N[j - 1])
    else:
        shape = (1, 1)

    rand_real = tf.random.normal(shape=shape)
    rand_imag = tf.random.normal(shape=shape)
    return tf.Variable(tf.complex(rand_real, rand_imag))

print(Z(1,4,N4=N4))

def E(i, j, N4):
    if (i, j) == (1, 2):
        return tf.matmul(Z(1, 2, N4=N4), tf.matmul(Z(2, 3, N4=N4), Z(3, 1, N4=N4))) 
    else:
        pass
#there's actually a bunch of elif loops here, doing similar things. I've removed them for now.

print(E(1,2,N4=N4))

def potential(N4):
    return tf.norm(E(1, 2, N4=N4))**2

print(potential(N4=N4))

def loss():
    return potential(N4)

opt = tf.keras.optimizers.SGD(learning_rate=1e-4)

for _ in range(10):
    print('V =', loss())
    opt.minimize(loss, var_list=[Z(1, 3, N4=N4), Z(2, 3, N4=N4), Z(3, 1, N4=N4)])

По-моему, проблема заключается в двойном использовании метода Variable в определяя Z. Но я никак не мог это исправить

...