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