Использование не обучаемого веса эквивалентно использованию переменной Python в TensorFlow? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть фрагмент кода (не мой), который определяет необучаемую переменную, которая используется для определения другого свойства слоя, которое выглядит примерно так:

initial_weight_val = 1.0
w = my_layer.add_weight(name=layer.name + '/my_weight', shape=(),
                       initializer=tf.initializers.constant(initial_weight_val), 
                       trainable=False)
# Use w to set another parameter of the layer.
my_layer.the_parameter = some_function(w)

Пожалуйста, не говорите мне что такое необучаемая переменная (конечно, я знаю, что это такое?), которая также обсуждается в Что такое определение необучаемого параметра? .

Однако, учитывая, что w не изменится (я думаю), я не понимаю, почему кто-то определил бы такую ​​переменную, а не просто использовал Python переменную initial_weight_val напрямую, особенно при использовании TensorFlow 2.0 (это мой случай и единственный интересующий меня случай). Конечно, одна из возможностей может заключаться в том, что эта переменная может стать обучаемой, если нужно, чтобы она была обучаемой позже, но зачем вообще этого ожидать?

Можно ли безопасно использовать initial_weight_val для определения the_parameter, т.е. передать initial_weight_val в some_function вместо w?

Я обеспокоен этой проблемой, потому что не могу сохранить модель с переменной, потому что я получаю ошибку «переменная не JSON сериализуемая» (Keras и TF такие глючные, кстати!), Поэтому я пытался понять эквивалентность пользовательских необучаемых переменных и Python переменных.

1 Ответ

1 голос
/ 06 февраля 2020

Вы должны убедиться, что это значение не изменяется вообще, и что это одно значение.
Тогда да, вы можете использовать Python var (если python var совместим с функцией который использует это w).

В этом случае вы должны поместить это initial_weight_val как в __init__, так и в get_config методы слоя, чтобы правильно его сохранить.

Теперь, если функция принимает только тензоры, но вы все еще уверены, что это значение не изменится вообще, тогда вы можете на call сделать w = tf.constant(self.initial_weight_val). У вас все еще есть значение в __init__ и в get_config как python var.

Наконец, если это значение, хотя и не обучаемое, меняется, или если это тензор со многими элементами, то лучше бы оно было весомым. («Не обучаемый» означает «не обучаемый при обратном распространении», но все же разрешается обновлять здесь и там).
Не должно быть абсолютно никаких проблем с сохранением загрузки этого веса, если вы его правильно определили, который должен быть внутри build с self.add_weight(....), как показано в https://keras.io/layers/writing-your-own-keras-layers/.


Классный пример Keras, в котором используются не обучаемые, но обновляемые веса, это слой BatchNormalization. mean и std пакетов обновляются при каждом проходе, но не путем обратного распространения (таким образом trainable=False)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...