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