Пользовательская карта Tensorflow Checkpoint

Я подклассифицирую модель keras с пользовательскими слоями. Каждый слой содержит словарь параметров, который используется при создании их слоев. Кажется, что эти словари параметров не устанавливаются до создания контрольной точки в Tensorflow, они устанавливаются после, что вызывает ошибку. Я не уверен, как это исправить, так как значение ValueError также дает устаревшую информацию ( tf.contrib больше не существует).

ValueError: Невозможно сохранить объект {'units': 32, 'активации': 'tanh', 'recurrent_initializer': 'glorot_uniform', 'dropout': 0, 'return_sequence': True} (оболочка словаря, автоматически созданная для атрибута назначение). Обернутый словарь был изменен вне обертки (его конечное значение было {'Единицы измерения': 32, 'активация': 'tanh', 'recurrent_initializer': 'glorot_uniform', 'dropout': 0, 'return_sequence': True}, его значение, когда была добавлена ​​зависимость от контрольной точки, было Нет), что прерывает восстановление при создании объекта.

Если вам не нужна эта контрольная точка в словаре, поместите ее в объект tf.contrib.checkpoint.NoDependency; он будет автоматически распакован и впоследствии проигнорирован.

Вот пример Слоя, который выбрасывает эту проблему:

class RecurrentConfig(BaseLayer):
    '''Basic configurable recurrent layer'''
    def __init__(self, params: Dict[Any, Any], mode: ModeKeys, layer_name: str = '', **kwargs):
        self.layer_name = layer_name
        self.cell_name = params.pop('cell', 'GRU')
        self.num_layers = params.pop('num_layers', 1)
        kwargs['name'] = layer_name
        super().__init__(params, mode, **kwargs)
        if layer_name == '':
            self.layer_name = self.cell_name
        self.layers: List[layers.Layer] = stack_layers(self.params,
                                                       self.num_layers,
                                                       self.cell_name)

    def call(self, inputs: np.ndarray) -> layers.Layer:
        '''This function is a sequential/functional call to this layers logic
        Args:
            inputs: Array to be processed within this layer
        Returns:
            inputs processed through this layer'''
        processed = inputs
        for layer in self.layers:
            processed = layer(processed)
        return processed

    @staticmethod
    def default_params() -> Dict[Any, Any]:
        return{
            'units': 32,
            'recurrent_initializer': 'glorot_uniform',
            'dropout': 0,
            'recurrent_dropout': 0,
            'activation': 'tanh',
            'return_sequences': True
        }

BaseLayer.py

'''Basic ABC for a keras style layer'''

from typing import Dict, Any

from tensorflow.keras import layers
from mosaix_py.mosaix_learn.configurable import Configurable

class BaseLayer(Configurable, layers.Layer):
    '''Base configurable Keras layer'''
    def get_config(self) -> Dict[str, Any]:
        '''Return configuration dictionary as part of keras serialization'''
        config = super().get_config()
        config.update(self.params)
        return config

    @staticmethod
    def default_params() -> Dict[Any, Any]:
        raise NotImplementedError('Layer does not implement default params')

Всего 2 ответа


Проблема, с которой я столкнулся, заключалась в том, что я выталкивал элементы из словаря, переданного в слои.

    self.cell_name = params.pop('cell', 'GRU')
    self.num_layers = params.pop('num_layers', 1)

При передаче словаря в слой он должен оставаться неизменным при отслеживании.

Моим решением было дальнейшее абстрагирование парсинга параметров и передача в окончательный словарь.


Ваш объект RecurrentConfig должен наследоваться от tf.keras.layers.Layer вместо BaseLayer . Документация TF о контрольно-пропускных пунктах / отложенных реставрациях описывает, почему:

Объекты Layer в TensorFlow могут задерживать создание переменных до их первого вызова, когда доступны входные фигуры. Например, форма ядра плотного слоя зависит как от входных, так и от выходных форм слоя, и поэтому в выходной форме, требуемой в качестве аргумента конструктора, недостаточно информации для создания переменной самостоятельно. Поскольку вызов Layer также считывает значение переменной, восстановление должно произойти между созданием переменной и ее первым использованием.

Чтобы поддержать эту идиому, очереди tf.train.Checkpoint восстанавливают, у которых еще нет соответствующей переменной.


Есть идеи?

10000