Состояние GRU / RNN в графическом режиме и активный режим выполнения - PullRequest
1 голос
/ 26 февраля 2020

У меня есть тот же кусок кода, написанный сначала в режиме нетерпеливого выполнения, а затем в графическом режиме. Теперь я не могу понять, почему состояние GRU не сохраняется в графическом режиме, когда оно отлично работает в активном режиме.

Вот код нетерпеливого режима:

import tensorflow as tf 
import xxhash
import numpy as np 
tf.enable_eager_execution()
rnn_units = 1024 
def hash_code(arr): 
    return xxhash.xxh64(arr).hexdigest()

model = tf.keras.Sequential([tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True,
                        recurrent_initializer='glorot_uniform', batch_input_shape=[1, None, 256])])

lstm_wt = np.load('lstm_wt.npy', allow_pickle=True) # fixed weights for comparison 
lstm_re_wt = np.load('lstm_re_wt.npy', allow_pickle=True)
lstm_bias = np.load('lstm_bias.npy', allow_pickle=True)
model.layers[0].set_weights([lstm_wt, lstm_re_wt, lstm_bias])

op_embed = np.load('op_embed.npy', allow_pickle=True) # fixed input 
op_lstm = model(op_embed)
print(hash_code(op_lstm.numpy()))

op_lstm = model(op_embed)
print(hash_code(op_lstm.numpy()))

model.layers[0].reset_states() # now reset the state, you'll get back the initial output. 
op_lstm = model(op_embed)
print(hash_code(op_lstm.numpy()))

Вывод этого кода:

d092fdb4739588a3
cdfdf8b8e292c6e8
d092fdb4739588a3

Теперь код модели графа:

import tensorflow as tf 
import xxhas
import numpy as np 

# checking lstm 
op_embed = np.load('op_embed.npy', allow_pickle=True)
# load op_embed, lstm weights 
lstm_wt = np.load('lstm_wt.npy', allow_pickle=True)
lstm_re_wt = np.load('lstm_re_wt.npy', allow_pickle=True)
lstm_bias = np.load('lstm_bias.npy', allow_pickle=True)

rnn_units = 1024 
layers = tf.keras.layers.GRU(rnn_units,
                        return_sequences=True,
                        stateful=True,
                        recurrent_initializer='glorot_uniform')
x_placeholder = tf.placeholder(shape=op_embed.shape, dtype=tf.float32)
op_lstm = layers(x_placeholder)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
layers.set_weights([lstm_wt, lstm_re_wt, lstm_bias])
tf.assign(layers.weights[0],lstm_wt ).eval(sess)
tf.assign(layers.weights[1], lstm_re_wt).eval(sess)
tf.assign(layers.weights[2], lstm_bias).eval(sess)
print('keras op hash',xxhash.xxh64(sess.run(op_lstm, feed_dict={x_placeholder:op_embed})).hexdigest())
print('keras op hash',xxhash.xxh64(sess.run(op_lstm, feed_dict={x_placeholder:op_embed})).hexdigest())

output:

keras op hash d092fdb4739588a3
keras op hash d092fdb4739588a3

Есть какие-нибудь идеи о том, как исправить эту неоднозначность и сохранить состояния в случае графического режима? Есть похожий вопрос, заданный ранее, но без ответа. Statefulness в режиме ожидания против режима не-нетерпеливости

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