Ошибка при создании тензорного графа с использованием пользовательской функции для GRU - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь кодировать ГРУ в тензорном потоке.Я использую две функции, одну для инициализации весов, а другую для уравнений ГРУ.Но это дает мне следующую ошибку:

ValueError: Tensor("Reshape_4:0", shape=(200, 1), dtype=float32) must be from the same graph as Tensor("w1_rx:0", shape=(100, 200), dtype=float32_ref)

функция инициализатора веса

def init_weights(n_index, n_h, n_em):
"""
    returns a dictionary of weights for a GRU with following parameters required

    n_index : index of the weights w.r.t. GRU layer
    n_h     : neurons in GRU
    n_em    : length of embedding vector
"""
tf.reset_default_graph()
w_prefix = 'w'+str(n_index)+'_'
b_prefix = 'b' + str(n_index) + '_'

w = {
    str('w_rx') : tf.get_variable(str(w_prefix + 'rx'), [n_h, n_em], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_ra') : tf.get_variable(str(w_prefix + 'ra'), [n_h, n_h], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_r')  : tf.get_variable(str(b_prefix + 'r'), [n_h, 1], initializer=tf.contrib.layers.xavier_initializer()),

    str('w_ux') : tf.get_variable(str(w_prefix + 'ux'), [n_h, n_em], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_ua') : tf.get_variable(str(w_prefix + 'ua'), [n_h, n_h], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_u')  : tf.get_variable(str(b_prefix + 'u'), [n_h, 1], initializer=tf.contrib.layers.xavier_initializer()),

    str('w_cx') : tf.get_variable(str(w_prefix + 'cx'), [n_h, n_em], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_ca') : tf.get_variable(str(w_prefix + 'ca'), [n_h, n_h], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_c')  : tf.get_variable(str(b_prefix + 'c'), [n_h, 1], initializer=tf.contrib.layers.xavier_initializer()),

    str('w_y')  : tf.get_variable(str(w_prefix + 'y'), [n_em, n_h], initializer=tf.contrib.layers.xavier_initializer()),
    str('w_y')  : tf.get_variable(str(b_prefix + 'y'), [n_em, 1], initializer=tf.contrib.layers.xavier_initializer()),

}

return w

функция для GRU

def GRU(n_size, a_t, x, w, t=0):
# word vector at step t
x_t = tf.reshape(x[t], [x.shape[1],1])
a_t = tf.reshape(a_t, [a_t.shape[1],1])

# gru    
reset = tf.nn.sigmoid( tf.matmul(w['w_rx'], x_t) + tf.matmul(w1['w_ra'], a_t) + w1['b_r'] )
update = tf.nn.sigmoid( tf.matmul(w1['w_ux'], x_t) + tf.matmul(w1['w_ua'], a_t) + w1['b_u'] )
cell = tf.nn.tanh( tf.matmul(w1['w_cx'], x_t) + tf.matmul(w1['w_ca'], tf.multiply(reset,a_t)) + w1['b_c'] )
h = tf.multiply(update, a_t) + tf.multiply((1-update), cell)
yhat.append(tf.nn.softmax(tf.matmul(w1['w_y'], h) + w1['b_y']))

# function recursively iterates over t time steps
if t <= x.shape[0]:
    GRU(n_size = n_size, a_t = h, x = yhat, w=w, t = t+1)

return yhat

Так я называю функцию

GRU(100, x = x_train, a_t=encoder, w = init_weights(1, 100, n_em = embedding_len))

кодировщик = тензор формы (1,512)
x_train = тензор формы (1200)

...