Как сохранить не отслеживаемые веса в пользовательском слое keras?

0

Вопрос

Я хотел бы создать пользовательский слой keras (кодовая книга для модели VQVAE). Во время тренировки я хотел бы иметь tf.Variable который отслеживает использование каждого кода, чтобы я мог перезапустить неиспользуемые коды. Поэтому я создал свой слой кодовой книги следующим образом...

class Codebook(layers.Layer): 
     def __init__(self, num_codes, code_reset_limit = None, **kwargs): 
         super().__init__(**kwargs) 
         self.num_codes = num_codes 
         self.code_reset_limit = code_reset_limit 
         if self.code_reset_limit: 
             self.code_counter = tf.Variable(tf.zeros(num_codes, dtype = tf.int32), trainable = False) 
     def build(self, input_shape): 
         self.codes = self.add_weight(name = 'codes',  
                                      shape = (self.num_codes, input_shape[-1]), 
                                      initializer = 'random_uniform',  
                                      trainable = True) 
         super().build(input_shape) 
                                                                                                             

Проблема, с которой я столкнулся, заключается в том, что Layer класс находит переменную - член self.code_counter и добавляет его в список весов, которые сохраняются вместе со слоем. Он также ожидает, что self.code_counter присутствовать при загрузке весов, чего не происходит, когда я работаю в режиме вывода. Как я могу сделать так, чтобы keras не отслеживал переменную в моем слое. Я не хочу, чтобы это сохранялось или было частью layers.weights.

keras python tensorflow
2021-11-23 10:45:03
1

Лучший ответ

1

Согласно документам:

Переменные, заданные в качестве атрибутов слоя, отслеживаются как веса слоев (в слое.веса)

Поэтому вопрос в том, можете ли вы использовать tf.zeros в одиночку или вместе с tf.constant:

import tensorflow as tf

class Codebook(tf.keras.layers.Layer): 
     def __init__(self, num_codes, code_reset_limit = None, **kwargs): 
         super().__init__(**kwargs) 
         self.num_codes = num_codes 
         self.code_reset_limit = code_reset_limit 
         if self.code_reset_limit: 
            self.code_counter = tf.constant(tf.zeros(num_codes, dtype = tf.int32))

     def build(self, input_shape): 
         self.codes = self.add_weight(name = 'codes',  
                                      shape = (self.num_codes, input_shape[-1]), 
                                      initializer = 'random_uniform',  
                                      trainable = True) 
         super().build(input_shape) 
code_book = Codebook(num_codes=5, code_reset_limit=True)
print(code_book.weights)
[]
2021-11-23 13:35:05

@chasep255 есть какие-нибудь отзывы?
AloneTogether

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................