Я подклассифицирую модель 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
восстанавливают, у которых еще нет соответствующей переменной.