Como tem un controladas pesos na personalizado keras camada?

0

Pergunta

Gostaria de criar um personalizado keras camada (de um livro de códigos para uma VQVAE modelo.) Durante o treinamento, eu gostaria de ter um tf.Variable que rastreia o uso de cada código para que eu possa reiniciar códigos não utilizados. Então eu criei o meu livro de códigos camada da seguinte forma...

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) 
                                                                                                             

O problema que eu tenho é que o Layer classe encontra a variável de membro self.code_counter e adiciona-o à lista de pesos que são salvos com a camada. Ele também espera que o self.code_counter estar presente quando os pesos são carregados, o que não é o caso, quando eu executar em modo de inferência. Como posso torná-lo tão keras não segue a pista de uma variável na minha camada. Não desejo persistente ou para ser parte do layers.weights.

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

Melhor resposta

1

De acordo com o google docs:

O conjunto de variáveis como atributos de uma camada são registadas como os pesos das camadas (camada.pesos)

Então, a pergunta é se você pode usar tf.zeros sozinho ou em conjunto com 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 qualquer feedback?
AloneTogether

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................