Я реализую кодировщик-декодер rnn, используя tf.contrib.cudnn_rnn.CudnnGRU()
в качестве кодировщика, и обнаружил проблему:
Я хочу повторно использовать переменные, чтобы создать ту же модель, но использовать еес другими данными и, проще говоря, это будет код для воспроизведения моей проблемы:
tf.reset_default_graph()
def create_model():
return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
direction='unidirectional')
# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))
with tf.variable_scope('model') as scope:
model_1 = create_model()
rnn_out_1, rnn_state_1 = model_1(x)
scope.reuse_variables()
model_2 = create_model()
rnn_out_2, rnn_state_2 = model_2(x)
Это приводит к следующей ошибке:
Переменная модель / cudnn_gru_1 / opaque_kernel несуществует или не был создан с помощью tf.get_variable ().Вы имели в виду установить reuse = tf.AUTO_REUSE в VarScope?
Итак, вторая модель пытается найти переменную model/cudnn_gru_1/opaque_kernel
, но не может ее найти, потому что она должна искать model/cudnn_gru/opaque_kernel:0
.
Дело в том, что я не знаю, почему это происходит, поскольку, следуя ссылке на тензор потока переменных, кажется, что все в порядке.С другой стороны, я также попытался написать это по-другому, так как документ tenorflow утверждает, что моя вышеупомянутая реализация и та, которую я показываю далее, фактически делают то же самое:
tf.reset_default_graph()
def create_model():
return tf.contrib.cudnn_rnn.CudnnGRU(num_layers=1, num_units=100,
direction='unidirectional')
# (time, batch_size, num_inputs)
x = tf.random_normal((100, 16, 100))
with tf.variable_scope('model'):
model_1 = create_model()
rnn_out_1, rnn_state_1 = model_1(x)
with tf.variable_scope('model', reuse=True):
model_2 = create_model()
rnn_out_2, rnn_state_2 = model_2(x)
Этот второй способ фактически работает (илипо крайней мере я так думаю).Так что я действительно не знаю, что я делаю неправильно в первой реализации, я также не уверен, что обе реализации должны делать то же самое (что, я думаю, они должны).Так может кто-нибудь помочь мне разобраться, что я делаю неправильно или что я не могу правильно понять?
Заранее спасибо