조금 늦어 보이지만 도움이 되길 바랍니다. 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.
자세한 답변을 주셔서 대단히 감사합니다. 사실, 나는 (Deep RL에 있었던) 석사 학위 논문에서 이것을보고있을 때 조금 늦었다. 확실히 구현에 관심이있을 것입니다. –