Spec-Zone.ru › TensorFlow

tf.keras.layers.JaxLayer

Слой Keras, оборачивающий модель JAX.

Наследует от: Layer, Operation

tf.keras.layers.JaxLayer(
    call_fn, init_fn=None, params=None, state=None, seed=None, **kwargs
)

Этот слой позволяет использовать компоненты JAX в Keras при использовании JAX в качестве бэкенда Keras.

Функция модели

Этот слой принимает модели JAX в виде функции, call_fn, которая должна принимать следующие аргументы с указанными точными именами:

  • params: обучаемые параметры модели.
  • state (необязательно): необучаемое состояние модели. Можно опустить, если у модели нет необучаемого состояния.
  • rng (необязательно): экземпляр jax.random.PRNGKey. Можно опустить, если модели не нужны RNG ни во время обучения, ни во время инференса.
  • inputs: входные данные модели — массив JAX или PyTree массивов.
  • training (необязательно): аргумент, указывающий, выполняется ли обучение или инференс; в режиме обучения передаётся True. Можно опустить, если модель ведёт себя одинаково в режиме обучения и инференса.

Аргумент inputs является обязательным. Входные данные модели должны передаваться одним аргументом. Если модель JAX принимает несколько входов в виде отдельных аргументов, их необходимо объединить в одну структуру, например в tuple или dict.

Инициализация весов модели

Инициализацию params и state модели может выполнять этот слой; в этом случае необходимо указать аргумент init_fn. Это позволяет динамически инициализировать модель с нужной формой. Если же форма известна, можно использовать аргумент params и, при необходимости, аргумент state, чтобы создать уже инициализированную модель.

Функция init_fn, если она указана, должна принимать следующие аргументы с указанными точными именами:

  • rng: экземпляр jax.random.PRNGKey.
  • inputs: массив JAX или PyTree массивов со значениями-заполнителями для задания формы входных данных.
  • training (необязательно): аргумент, указывающий, выполняется ли обучение или инференс. True всегда передаётся в init_fn. Его можно опустить независимо от того, имеет ли call_fn аргумент training.

Модели с необучаемым состоянием

Для моделей JAX с необучаемым состоянием:

  • call_fn должен иметь аргумент state
  • call_fn должен возвращать tuple, содержащий выходные данные модели и новое необучаемое состояние модели
  • init_fn должен возвращать tuple, содержащий начальные обучаемые параметры модели и начальное необучаемое состояние модели.

В этом коде показано возможное сочетание сигнатур call_fn и init_fn для модели с необучаемым состоянием. В этом примере у модели есть аргумент training и аргумент rng в call_fn.

def stateful_call(params, state, rng, inputs, training):
    outputs = ...
    new_state = ...
    return outputs, new_state

def stateful_init(rng, inputs):
    initial_params = ...
    initial_state = ...
    return initial_params, initial_state

Модели без необучаемого состояния

Для моделей JAX без необучаемого состояния:

  • call_fn не должен иметь аргумент state
  • call_fn должен возвращать только выходные данные модели
  • init_fn должен возвращать только начальные обучаемые параметры модели.

В этом коде показано возможное сочетание сигнатур call_fn и init_fn для модели без необучаемого состояния. В этом примере у модели нет аргумента training и нет аргумента rng в call_fn.

def stateless_call(params, inputs):
    outputs = ...
    return outputs

def stateless_init(rng, inputs):
    initial_params = ...
    return initial_params

Соответствие требуемой сигнатуре

Если сигнатура модели отличается от требуемой для JaxLayer, можно легко написать метод-обёртку для адаптации аргументов. В этом примере показана модель, которая принимает несколько входов в виде отдельных аргументов, ожидает несколько RNG в dict и имеет аргумент deterministic с противоположным значением по сравнению с training. Чтобы привести сигнатуру к требуемой, входы объединяются в одну структуру с помощью tuple, RNG разделяется и используется для заполнения ожидаемого dict, а логическое значение инвертируется:

def my_model_fn(params, rngs, input1, input2, deterministic):
    ...
    if not deterministic:
        dropout_rng = rngs["dropout"]
        keep = jax.random.bernoulli(dropout_rng, dropout_rate, x.shape)
        x = jax.numpy.where(keep, x / dropout_rate, 0)
        ...
    ...
    return outputs

def my_model_wrapper_fn(params, rng, inputs, training):
    input1, input2 = inputs
    rng1, rng2 = jax.random.split(rng)
    rngs = {"dropout": rng1, "preprocessing": rng2}
    deterministic = not training
    return my_model_fn(params, rngs, input1, input2, deterministic)

keras_layer = JaxLayer(my_model_wrapper_fn, params=initial_params)

Использование с модулями Haiku

JaxLayer позволяет использовать компоненты Haiku в виде haiku.Module. Для этого модуль преобразуется в соответствии с шаблоном Haiku, после чего module.apply передаётся параметру call_fn, а при необходимости module.init — параметру init_fn.

Если модель имеет необучаемое состояние, её следует преобразовать с помощью haiku.transform_with_state. Если модель не имеет необучаемого состояния, её следует преобразовать с помощью haiku.transform. Кроме того, если модуль не использует RNG в "apply", его можно преобразовать с помощью haiku.without_apply_rng.

В следующем примере показано, как создать JaxLayer из модуля Haiku, который использует генераторы случайных чисел через hk.next_rng_key() и принимает позиционный аргумент обучения:

class MyHaikuModule(hk.Module):
    def __call__(self, x, training):
        x = hk.Conv2D(32, (3, 3))(x)
        x = jax.nn.relu(x)
        x = hk.AvgPool((1, 2, 2, 1), (1, 2, 2, 1), "VALID")(x)
        x = hk.Flatten()(x)
        x = hk.Linear(200)(x)
        if training:
            x = hk.dropout(rng=hk.next_rng_key(), rate=0.3, x=x)
        x = jax.nn.relu(x)
        x = hk.Linear(10)(x)
        x = jax.nn.softmax(x)
        return x

def my_haiku_module_fn(inputs, training):
    module = MyHaikuModule()
    return module(inputs, training)

transformed_module = hk.transform(my_haiku_module_fn)

keras_layer = JaxLayer(
    call_fn=transformed_module.apply,
    init_fn=transformed_module.init,
)
Аргументы
call_fn: функция, вызывающая модель. Список принимаемых ею аргументов и возвращаемых выходных данных см. в описании выше. init_fn: функция, вызывающая инициализацию модели. Список принимаемых ею аргументов и возвращаемых выходных данных см. в описании выше. Если None, необходимо указать params и/или state.
params PyTree, содержащий все обучаемые параметры модели. Это позволяет передавать обученные параметры или управлять инициализацией. Если и params, и state равны None, во время сборки вызывается init_fn для инициализации обучаемых параметров модели.
state PyTree, содержащий всё необучаемое состояние модели. Это позволяет передавать выученное состояние или управлять инициализацией. Если и params, и state равны None, а call_fn принимает аргумент state, во время сборки вызывается init_fn для инициализации необучаемого состояния модели.
seed Начальное значение генератора случайных чисел. Необязательно.
Атрибуты
input Возвращает входные тензоры символьной операции.

Возвращает только тензоры, соответствующие первому вызову операции.

output Возвращает выходные тензоры слоя.

Возвращает только тензоры, соответствующие первому вызову операции.

Методы

from_config

Посмотреть исходный код

@classmethod
from_config(
    config
)

Создаёт слой на основе его конфигурации.

Этот метод является обратным для get_config и позволяет создать тот же слой из словаря конфигурации. Он не обрабатывает связи слоёв (это делает Network) и веса (это делает set_weights).

Аргументы
config Словарь Python, обычно являющийся результатом вызова get_config.
Возвращает
Экземпляр слоя.

symbolic_call

Посмотреть исходный код

symbolic_call(
    *args, **kwargs
)

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/keras/layers/JaxLayer

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API