2016-08-25 11 views
3
를 사용 LSTM 레이어 스택하는 방법

내가 가지고있는 것은 내가 하나의 숨겨진 LSTM 층 네트워크 믿고 다음이다 : 그러나TensorFlow

# Parameters 
learning rate = 0.001 
training_iters = 100000 
batch_size = 128 
display_step = 10 

# Network Parameters 
n_input = 13 
n_steps = 10 
n_hidden = 512 
n_classes = 13 

# tf Graph input 
x = tf.placeholder("float", [None, n_steps, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

# Define weights 
weights = { 
    'out' : tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out' : tf.Variable(tf.random_normal([n_classes])) 
} 

, 내가 예측하는 TensorFlow를 사용하여 LSTM 네트워크를 구축을 위해 노력하고있다 전력 소비. 좋은 예를 찾기 위해 주변을 둘러 보았지만 숨겨진 LSTM 레이어가 2 개있는 모델을 찾을 수 없었습니다. 여기서 I 구축하고자하는 모델의 10

수 :

1 입력 층, 1 개 출력 층 2 숨겨진 LSTM 층, 시간 단계 (시퀀스 길이) (각 512 개 뉴런) 누군가 TensorFlow를 사용하여 이것을 구축하도록 안내합니까? (가중치 정의, 입력 모양 작성, 교육, 예측, 옵티 마이저 또는 비용 함수 사용 등)에서 도움이 될 것입니다.

미리 감사드립니다.

답변

5

다음은 GRU 셀이있는 번역 모델에서의 작업 방법입니다. GRU를 LSTM으로 바꿀 수 있습니다. 랩핑해야하는 여러 셀 목록과 함께 tf.nn.rnn_cell.MultiRNNCell을 사용하면 정말 쉽습니다. 코드에서 나는 그것을 수동으로 풀고있다. 그러나 tf.nn.dynamic_rnn 또는 tf.nn.rnn으로 전달할 수도있다.

y = input_tensor 
with tf.variable_scope('encoder') as scope: 
    rnn_cell = rnn.MultiRNNCell([rnn.GRUCell(1024) for _ in range(3)]) 
    state = tf.zeros((BATCH_SIZE, rnn_cell.state_size)) 
    output = [None] * TIME_STEPS 
    for t in reversed(range(TIME_STEPS)): 
     y_t = tf.reshape(y[:, t, :], (BATCH_SIZE, -1)) 
     output[t], state = rnn_cell(y_t, state) 
     scope.reuse_variables() 
    y = tf.pack(output, 1) 
+0

답변 해 주셔서 감사합니다. 숨겨진 레이어 1에서 숨겨진 레이어 2로 변수 (매개 변수)를 초기화해야합니까? 아니면 내부적으로 처리해야합니까? – subbie

+0

LSTM의 변수는 클래스 내부에서 사용할 때 초기화됩니다. 꽤 도움이되는 소스 코드를 살펴보십시오. – chasep255

+0

LSTM의 네 게이트에 대한 변수가 초기화되지만 첫 번째 숨겨진 레이어의 매개 변수가 두 번째 매개 변수가 없어야합니다.MultiRNNCell이 매개 변수를 숨겨진 매개 변수에서 다른 매개 변수로 초기화하면 의미가 있습니다. – subbie

2

먼저 당신은 당신의 훈련 데이터 (하나의 배치)을 넣어 약간의 자리가 필요

LSTM 아주 좋은 두 가지 구성 요소로 구성 상태, 숨겨진 상태와 세포 상태를 필요
x_input = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 
y_output = tf.placeholder(tf.float32, [batch_size, truncated_series_length, 1]) 

여기 가이드 : https://arxiv.org/pdf/1506.00019.pdf. LSTM의 모든 레이어에는 하나의 셀 상태와 하나의 숨겨진 상태가 있습니다.

문제는 Tensorflow가 이것을 자리 표시 자로 보낼 수없는 LSTMStateTuple에 저장한다는 것입니다. 그래서 당신은 튜플에 텐서에 저장 한 다음 압축을 해제해야합니다

state_placeholder = tf.placeholder(tf.float32, [num_layers, 2, batch_size, state_size]) 

l = tf.unpack(state_placeholder, axis=0) 
rnn_tuple_state = tuple(
    [tf.nn.rnn_cell.LSTMStateTuple(l[idx][0], l[idx][1]) 
    for idx in range(num_layers)] 
) 

이 그럼 당신은 스택 LSTM 층을 생성하기 위해 내장 Tensorflow API를 사용할 수 있습니다.

cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True) 
cell = tf.nn.rnn_cell.MultiRNNCell([cell]*num_layers, state_is_tuple=True) 
outputs, state = tf.nn.dynamic_rnn(cell, x_input, initial_state=rnn_tuple_state) 

여기에서 당신은 y_inputs에 대한 logits하고 손실을 계산하기 위해 출력을 계속합니다.

그런 다음 당신은 잘립니다 역 전파 (여기 http://r2rt.com/styles-of-truncated-backpropagation.html 좋은 설명) 당신은 다시 공급하기 전에 numpy 배열 상태를 변환해야합니다

init_state = np.zeros((num_layers, 2, batch_size, state_size)) 

...current_state... = sess.run([...state...], feed_dict={x_input:batch_in, state_placeholder:current_state ...}) 
current_state = np.array(current_state) 

과 함께 sess.run - 명령과 함께 각 배치를 실행합니다.

아마 Tflearn이나 Keras와 같은 도서관을 대신 사용하는 것이 더 좋을까요?

+0

사용중인 tensorflow 버전에 따라 다르므로 편집하고 싶지 않습니다. 그러나 tf.unpack이 tf.unstack으로 변경되었습니다. – vanilla