Как заморозить переменные tenorflow внутри фреймворка tf.keras в режиме активного исполнения? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь настроить входные веса в рекуррентной ячейке, не позволяя обратному распространению повлиять на предыдущие состояния (вид усеченного обратного распространения с n = 1). Я использую tf.keras и стремлюсь к исполнению в tenorflow.

Я не могу найти способ заморозить определенную часть ячейки ГРУ. В частности рекуррентное ядро. Кажется, что рекуррентное ядро ​​- это переменная тензорного потока, и поэтому я не нахожу способ установить для обучаемого атрибута значение False.

Мой код основан на этом уроке о text_generation ( версия Google Colab , в которой вы можете просто изменить функцию build_model и проверить ее)


def build_model(vocab_size, embedding_dim, rnn_units, batch_size, freeze_embedding_layer=False, freeze_recurrent_kernel=False):

    model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[batch_size, None]),
        rnn(rnn_units, return_sequences=True,recurrent_initializer='glorot_uniform', stateful=True),
        tf.keras.layers.Dense(vocab_size)
    ])

    if freeze_embedding_layer:
      print("embedding type:", model.layers[0])
      model.layers[0].trainable = False

    if freeze_recurrent_kernel:
      print("rnn type:",type(model.layers[1]))
      print("rnn recurrent kernel type:", type(model.layers[1].recurrent_kernel))
      model.layers[1].recurrent_kernel.trainable = False


    return model

При вызове этой функции, например:


# Length of the vocabulary in chars
vocab_size = len(vocab)

# The embedding dimension
embedding_dim = 256

# Number of RNN units
rnn_units = 1024

if tf.test.is_gpu_available():
    rnn = tf.keras.layers.CuDNNGRU
else:
    import functools
    rnn = functools.partial(
        tf.keras.layers.GRU, recurrent_activation='sigmoid')

model = build_model(
  vocab_size = len(vocab),
  embedding_dim=embedding_dim,
  rnn_units=rnn_units,
  batch_size=BATCH_SIZE, 
  freeze_embedding_layer=True, 
  freeze_recurrent_kernel=True)

Я получаю:

embedding type: <tensorflow.python.keras.layers.embeddings.Embedding object at 0x7f955a198d68>
rnn type: <class 'tensorflow.python.keras.layers.cudnn_recurrent.CuDNNGRU'>
rnn recurrent kernel type: <class 'tensorflow.python.ops.resource_variable_ops.ResourceVariable'>
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-1677e05c2afc> in <module>()
      3   embedding_dim=embedding_dim,
      4   rnn_units=rnn_units,
----> 5   batch_size=BATCH_SIZE, freeze_embedding_layer=True, freeze_recurrent_kernel=True)

<ipython-input-18-62788170b303> in build_model(vocab_size, embedding_dim, rnn_units, batch_size, freeze_embedding_layer, freeze_recurrent_kernel)
     15       print("rnn type:",type(model.layers[1]))
     16       print("rnn recurrent kernel type:", type(model.layers[1].recurrent_kernel))
---> 17       model.layers[1].recurrent_kernel.trainable = False
     18 
     19 

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