2016-06-30 9 views
2

나는 다른 LSTM의 가중치의 지수 이동 평균 인 텐서 흐름의 LSTM을 갖고 싶습니다. 지수 이동 평균이를두고 있기 때문에 내가 지금하고 싶은 무엇Tensorflow : 다른 LSTM의 가중 평균 이동이있는 LSTM

def test_lstm(input_ph, init_ph, scope): 
     cell = tf.nn.rnn_cell.LSTMCell(128, use_peepholes=True) 
     input_ph = tf.transpose(input_ph, [1, 0, 2]) 
     input_list = tf.unpack(input_ph) 

     with tf.variable_scope(scope) as vs: 
      outputs, states = tf.nn.rnn(cell, input_list, initial_state=init_ph) 

     theta = [v for v in tf.all_variables() if v.name.startswith(vs.name)] 

     return outputs, theta 

lstm_1, theta_1 = test_lstm(input_1, state_init_1, scope="lstm_1") 

실제로 작동하지 않습니다이 라인 (함께 비슷한입니다 : 그러니까 기본적으로 좀 입력 자리와 일부 초기 상태의 자리에이 코드를 theta_2_1가 theta_2_2와 같은 것 결국

ema = tf.train.ExponentialMovingAverage(decay=1-self.tau, name="ema") 

with tf.variable_scope("lstm_2"): 
     maintain_averages_theta_1 = ema.apply(theta_1) 
     theta_2_1 = [ema.average(x) for x in theta_1] 

lstm_2 , theta_2_2 = test_lstm(input_2, state_init_2, scope="lstm_2" 

를 (또는 예외를 발생 : 태그 가중치의 변수 이름 뒤에 "EMA"그들은 그들이 tf.get_variable로 생성되지 않았기 때문에) 변수 범위에 표시되지 않습니다 변수가 이미 존재하기 때문에).

답변

1

조금 늦어 보이지만 도움이 되길 바랍니다. TF-RNN 시리즈의 중요한 문제는 일반 피드 포워드 또는 길쌈 NN과 달리 RNN에 대한 변수를 직접 지정할 수 없으므로 간단한 작업을 수행 할 수 없기 때문에 EMAed Vars를 얻고 네트워크에 연결할 수 있다는 것입니다.

실제 코드를 살펴 보도록하겠습니다.이 코드는 찾아보기 연습 코드이므로 첨부 파일 EMA_LSTM.py을 참조하십시오.

in_x = tf.placeholder("float", [None,None,6]) 
in_c = tf.placeholder("float", [None,3]) 
in_m = tf.placeholder("float", [None,3]) 
in_h = (in_c, in_m) 

마지막으로, 우리가 세션을 실행

def network(in_x,in_h): 
    # Input: 'in_x' is the input sequence, 'in_h' is the initial hidden cell(c,m) 
    # Output: 'hidden_outputs' is the output sequence(c-sequence), 'net' is the list of parameters used in this network function 
    cell = tf.nn.rnn_cell.BasicLSTMCell(3, state_is_tuple=True) 
    in_h = tf.nn.rnn_cell.LSTMStateTuple(in_h[0], in_h[1]) 
    hidden_outputs, last_tuple = tf.nn.dynamic_rnn(cell, in_x, dtype=tf.float32, initial_state=in_h) 
    net = [v for v in tf.trainable_variables() if tf.contrib.framework.get_name_scope() in v.name] 
    return hidden_outputs, net 

그런 다음 당신이 필요한 입력을위한 tf.placeholder을 선언

우리는 네트워크 기능이 포함 LSTM이, 말할 것이다 지정된 입력으로 network() 함수를 진행합니다.

init_cORm = np.zeros(shape=(1,3)) 
input = np.ones(shape=(1,1,6)) 

print '========================new-1(beh)==============================' 
with tf.Session() as sess:  
    with tf.variable_scope('beh', reuse=False) as beh: 
     result, net1 = network(in_x,in_h) 
     sess.run(tf.global_variables_initializer()) 
     list = sess.run([result, in_x, in_h, net1], feed_dict={ 
      in_x : input, 
      in_c : init_cORm, 
      in_m : init_cORm 
     }) 
    print 'result:', list[0] 
    print 'in_x:' , list[1] 
    print 'in_h:', list[2] 
    print 'net1:', list[3][0][0][:4] 

이제 우리는 mak e 'net1'의 ExponentialMovingAverage (EMA) 값을 포함하는 'net4'라는 var_list는 아래의 'net1'세션에서 처음 할당되고 아래에서 새로 추가되며 각 요소에 1이 추가됩니다.

ema = tf.train.ExponentialMovingAverage(decay=0.5) 
target_update_op = ema.apply(net1) 
init_new_vars_op = tf.initialize_variables(var_list=[v for v in tf.global_variables() if 'ExponentialMovingAverage' in v.name]) # 'initialize_variables' will be replaced with 'variables_initializer' in 2017 
sess.run(init_new_vars_op) 

len_net1 = len(net1) 
net1_ema = [[] for i in range(len_net1)] 
for i in range(len_net1): 
    sess.run(net1[i].assign(1. + net1[i])) 

sess.run(target_update_op) 

하는 것으로 우리는 NET1에없는 변수도있을 것입니다 경우, 'ExponentialMovingAverage'를 포함하는 이름의 변수를 (다음 선언 작업을 실행 'init_new_vars_op'선언) 초기화

  • 새로 초기화되었습니다.

  • 'net1'에있는 변수의 모든 요소에 대해 'net1'에 +1이 새로 할당되었습니다. 'net1'의 원소가 -0.5이고 +1이 0.5 인 경우, EMA 감쇠율이 0.5 일 때 'net4'를 0으로하고 싶습니다.

  • 마지막으로 EMA 작업을 ' sess.run (target_update_op)() '함수를 다음 &은 EMA (NET1가)에 값 실행 지정'네트워크 '를 먼저'NET4을 '

결국, 우리는 선언 'NET4 '. 'sess.run (result)'를 실행하면 EMA (net1) 변수가있는 것이됩니다.

with tf.variable_scope('tare', reuse=False) as tare: 
    result, net4 = network(in_x,in_h) 
    len_net4 = len(net4) 

    target_assign = [[] for i in range(len_net4)] 
    for i in range(len_net4): 
     target_assign[i] = net4[i].assign(ema.average(net1[i])) 
     sess.run(target_assign[i].op) 
    list = sess.run([result, in_x, in_h, net4], feed_dict={ 
     in_x : input, 
     in_c : init_cORm, 
     in_m : init_cORm 
    }) 

여기에 무슨 일이 일어 났습니까? 당신은 'network()'함수에서 LSTM 변수를 'net4'로 간접적으로 선언합니다. 그런 다음 for 루프에서 을 가리키며 'net4'는 실제로 'net1'및 'net1 + 1'의 EMA입니다. . 마지막으로, net4가 (네트워크()를 통해) 무엇을 할 것인지와 ('assay (ema.average()) 루프를 통해 '걸리는 값을 지정하면 프로세스를 실행합니다.

'결과'를 먼저 선언하고 매개 변수의 값을 두 번째로 지정하는 것은 다소 직관적입니다. 그러나 그것은 TF의 본질입니다. 정확하게 변수, 프로세스 및 관계를 먼저 설정 한 다음 값을 할당하고 프로세스를 실행하는 것이 항상 논리적이기 때문에 정확하게 찾는 대상입니다. 실제 기계 학습 코드에 대한 더 갈

마지막으로, 몇 가지 : 여기에서

  • , 방금 두 번째 'NET1 + 1'과 'NET1'을 할당. 사실,이 '+1'. 단계는 당신이 말한 곳입니다. 실행() (당신이 어딘가에서 '선언'한 후에) 당신의 최적화 자. 그래서 'EMA'에 따라 'net4'를 업데이트하려면 '실행 (최적화)', 'sess.run (target_update_op)'및 then'sess.run (target_assign [i] .op) 'net1'. Conceretly, 아래처럼 다른 순서로이 작업을 수행 할 수 있습니다

    ema = tf.train.ExponentialMovingAverage(decay=0.5) 
    target_update_op = ema.apply(net1) 
    
    with tf.variable_scope('tare', reuse=False) as tare: 
        result, net4 = network(in_x,in_h) 
        len_net4 = len(net4) 
        target_assign = [[] for i in range(len_net4)] 
        for i in range(len_net4): 
         target_assign[i] = net4[i].assign(ema.average(net1[i])) 
    
    init_new_vars_op = tf.initialize_variables(var_list=[v for v in tf.global_variables() if 'ExponentialMovingAverage' in v.name]) # 'initialize_variables' will be replaced with 'variables_initializer' in 2017 
    sess.run(init_new_vars_op) 
    
    len_net1 = len(net1) 
    net1_ema = [[] for i in range(len_net1)] 
    for i in range(len_net1): 
        sess.run(net1[i].assign(1. + net1[i])) 
    sess.run(target_update_op) 
    
    for i in range(len_net4): 
        sess.run(target_assign[i].op) 
    list = sess.run([result, in_x, in_h, net4], feed_dict={ 
        in_x : input, 
        in_c : init_cORm, 
        in_m : init_cORm 
    }) 
    

    당신이 진짜 구현 미리보기를보고 싶어하면

, 나는 깊은 강화 학습 일을위한 일했다. 관심이 있으시면 저에게 답장하십시오. Chrs.

+0

자세한 답변을 주셔서 대단히 감사합니다. 사실, 나는 (Deep RL에 있었던) 석사 학위 논문에서 이것을보고있을 때 조금 늦었다. 확실히 구현에 관심이있을 것입니다. –