Отсутствующие (обучаемые) переменные в Tensorflow 2 - PullRequest
1 голос
/ 04 апреля 2020

Я столкнулся с этой проблемой в большем коде. И я воспроизвел это в следующем тестовом коде. Обрабатываемые переменные не полностью перечислены в списке 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.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Оказывается, ошибка в TF2 подтверждается группой TF (https://github.com/tensorflow/tensorflow/issues/38211)

Существует временный обходной путь, который возвращает список тензоров из buildFoo функция __init__ явно. См. ссылка , например.

0 голосов
/ 04 апреля 2020

А как насчет использования метода add_weight, который является частью класса Layer?

for it in range(0,self.siz):
  self.add_weight("TNS"+str(it+1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...