ValueError: не предусмотрены градиенты для любой переменной: ['Variable:0']. При реализации SGD в TensorFlow 2.0.
Я пытаюсь реализовать 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)])
По моему мнению, проблема связана с тем, что при определении Z дважды использовался метод Variable. Но я никак не мог исправить это.