Я пытаюсь настроить входные веса в рекуррентной ячейке, не позволяя обратному распространению повлиять на предыдущие состояния (вид усеченного обратного распространения с 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