Я столкнулся с этой проблемой в большем коде. И я воспроизвел это в следующем тестовом коде. Обрабатываемые переменные не полностью перечислены в списке tenorflow 2.1.
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
import numpy as np
class FooLayer(tf.keras.layers.Layer):
def __init__(self, siz):
super(FooLayer, self).__init__()
self.siz = siz
self.buildFoo(siz)
def call(self, in_data):
Foo0 = tf.multiply(in_data,self.FooTns0)
FooList = []
FooList.append(Foo0)
for it in range(1,self.siz+1):
tmp = tf.multiply(FooList[it-1],self.FooTns[it-1])
FooList.append(tmp)
return FooList[self.siz]
def buildFoo(self,siz):
self.FooTns0 = tf.Variable(1.0, name="TNS0")
self.FooTns = []
for it in range(0,self.siz):
self.FooTns.append(tf.Variable(np.float32(it),
name="TNS"+str(it+1)))
self.add_weight("TNS"+str(it+1)) # Added after the first suggestion
class FooModel(tf.keras.Model):
def __init__(self, siz):
super(FooModel, self).__init__()
self.flayer = FooLayer(siz)
def call(self, in_data):
return self.flayer(in_data)
model = FooModel(5)
for v in model.trainable_variables:
print(v.name)
for v in model.variables:
print(v.name)
x = np.arange(1.0,2.0,1.0)
x = x.astype(np.float32)
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)
with tf.GradientTape() as tape:
y = model(x)
grads = tape.gradient(y, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
Исходный вывод в настоящее время только:
TNS0:0
TNS0:0
В то время как ожидаемый вывод перечисляет все 6 тензоров, '' self. FooTns0 '' и '' self.FooTns ''.
Первое предложение
После первого предложения @Wathek LOUED я добавил строку self.add_weight("TNS"+str(it+1))
и вывод включает в себя все другие TNS. Однако градиент все равно не находит их и выдает сообщение об ошибке, как
WARNING:tensorflow:Gradients do not exist for variables ['TNS1:0', 'TNS2:0', 'TNS3:0', 'TNS4:0', 'TNS5:0'] when minimizing the loss.