2017-05-08 4 views
0

의 기능 I theano에서 다음과 같은 기능이 있습니다(스캔) theano 및 tensorflow

def forward_prop_step(x_t, s_t1_prev, s_t2_prev): 
     # This is how we calculated the hidden state in a simple RNN. No longer! 
     # s_t = T.tanh(U[:,x_t] + W.dot(s_t1_prev)) 

     # Word embedding layer 
     x_e = E[:,x_t] 

     # GRU Layer 1 
     z_t1 = T.nnet.hard_sigmoid(U[0].dot(x_e) + W[0].dot(s_t1_prev) + b[0]) 
     r_t1 = T.nnet.hard_sigmoid(U[1].dot(x_e) + W[1].dot(s_t1_prev) + b[1]) 
     c_t1 = T.tanh(U[2].dot(x_e) + W[2].dot(s_t1_prev * r_t1) + b[2]) 
     s_t1 = (T.ones_like(z_t1) - z_t1) * c_t1 + z_t1 * s_t1_prev 

     # GRU Layer 2 
     z_t2 = T.nnet.hard_sigmoid(U[3].dot(s_t1) + W[3].dot(s_t2_prev) + b[3]) 
     r_t2 = T.nnet.hard_sigmoid(U[4].dot(s_t1) + W[4].dot(s_t2_prev) + b[4]) 
     c_t2 = T.tanh(U[5].dot(s_t1) + W[5].dot(s_t2_prev * r_t2) + b[5]) 
     s_t2 = (T.ones_like(z_t2) - z_t2) * c_t2 + z_t2 * s_t2_prev 

     # Final output calculation 
     # Theano's softmax returns a matrix with one row, we only need the row 
     o_t = T.nnet.softmax(V.dot(s_t2) + c)[0] 

     return [o_t, s_t1, s_t2] 

을 그리고 스캔하여이 함수를 호출 :

[o, s, s2], updates = theano.scan(
      forward_prop_step, 
      sequences=x, 
      truncate_gradient=self.bptt_truncate, 
      outputs_info=[None, 
          dict(initial=T.zeros(self.hidden_dim)), 
dict(initial=T.zeros(self.hidden_dim))]) 

내가에서 동일한 기능을 재 작성 시도 tensorflow :

def forward_prop_step(x_t, s_t1_prev, s_t2_prev): 
    # Word embedding layer 
    x_e = E[:, x_t] 

    # GRU Layer 1 
    z_t1 = tf.sigmoid(tf.reduce_sum(U[0] * x_e, axis=1) + tf.reduce_sum(W[0] * s_t1_prev, axis=1) + b[0]) 
    r_t1 = tf.sigmoid(tf.reduce_sum(U[1] * x_e, axis=1) + tf.reduce_sum(W[1] * s_t1_prev, axis=1) + b[1]) 
    c_t1 = tf.tanh(tf.reduce_sum(U[2] * x_e, axis=1) + tf.reduce_sum(W[2] * (s_t1_prev * r_t1), axis=1) + b[2]) 
    s_t1 = (tf.ones_like(z_t1) - z_t1) * c_t1 + z_t1 * s_t1_prev 

    # GRU Layer 2 
    z_t2 = tf.sigmoid(tf.reduce_sum(U[3] * s_t1, axis=1) + tf.reduce_sum(W[3] * s_t2_prev, axis=1) + b[3]) 
    r_t2 = tf.sigmoid(tf.reduce_sum(U[4] * s_t1, axis=1) + tf.reduce_sum(W[4] * s_t2_prev) + b[1]) 
    c_t2 = tf.tanh(tf.reduce_sum(U[5] * s_t1, axis=1) + tf.reduce_sum(W[5] * (s_t2_prev * r_t2), axis=1) + b[5]) 
    s_t2 = (tf.ones_like(z_t2) - z_t2) * c_t2 + z_t2 * s_t2_prev 

    # Final output calculation 
    o_t = tf.softmax(tf.reduce_sum(V * s_t2, axis=1) + c)[0] 

    return [o_t, s_t1, s_t2] 

그리고 스캔을 사용하여이 함수를 호출 한 :

s = tf.zeros([self.hidden_dim, 0]) 
s2 = tf.zeros([self.hidden_dim, 0]) 

[o, s, s2] = tf.scan(
    fn=forward_prop_step, 
    elems=[x, s, s2]) 

초기화 프로그램을 사용하는 대신 스캔 전에 s 및 s2 변수를 초기화했습니다. tensorflow에서 코드를 실행할 때 다음 오류가 발생합니다.

TypeError: forward_prop_step() takes exactly 3 arguments (2 given)

유일한 문제는 위의 버그가 아닌 것입니다. 테 노어 플로우에서 테 노노 코드를 참조하여 스캔 기능을 재 작성하려면 어떻게해야합니까?

+1

오류가 정확합니다. 설명서에 명시된 바와 같이 tensorflow 스캔 기능이 2 개의 인수를 사용한다고 가정합니다. https://www.tensorflow.org/api_docs/python/tf/scan – arkhy

+0

제발 arkhy, 제게 어떻게 보여줄 수 있습니까? tf에서 스캔을 작성하는 올바른 방법이 될까요? :) 나는 매우 감사 할 것이다 – yusuf

답변

1

tf.scan()에 두 개 이상의 요소를 전달하려면 목록 또는 터플로 묶어야합니다. 여기에 그것을 수행하는 방법의 예 : 인쇄하는

def f(x, ys): 
    (y1, y2) = ys 
    return x + y1 * y2 

a = tf.constant([1, 2, 3, 4, 5]) 
b = tf.constant([2, 3, 2, 2, 1]) 
c = tf.scan(f, (a, b), initializer=0) 
with tf.Session() as sess: 
    print(sess.run(c)) 

:

[ 2 8 14 22 27] 

나는 희망이 도움이!

+0

당신은 x를 통과하지 않는다. 나는 혼란 스럽다. 그리고 x는 나를 위해 중요합니다. – yusuf