2017-03-24 1 views
1

견적 도구 (Estimator)에 대한 model_fn 입력으로 LSTM 모델을 구현하려고합니다. 내 X는 가격의 시계열이있는 .txt에 불과합니다. 이 다음에 들어갈 예정이다Tensorflow 1.0 dynamic_rnn의 LSTM 셀이 차원 오류를 발생시킵니다.

def lstm_cell(): 
    return tf.contrib.rnn.BasicLSTMCell(
    size, forget_bias=0.0, state_is_tuple=True) 
    attn_cell = lstm_cell 
    if is_training and keep_prob < 1: 
    def attn_cell(): 
    return tf.contrib.rnn.DropoutWrapper(
    lstm_cell(), output_keep_prob=keep_prob) 
    cell = tf.contrib.rnn.MultiRNNCell([attn_cell() for _ in range(num_layers)], state_is_tuple=True) 
    initial_state = cell.zero_state(batch_size, data_type()) 
    inputs = tf.unstack(X, num=num_steps, axis=0) 
    outputs = [] 
    outputs, state = tf.nn.dynamic_rnn(cell, inputs, 
          initial_state=initial_state) 

: 내 첫 번째 숨겨진 레이어를 이동하기 전에 내가 같이 lstm 셀을 정의하려고 불행하게도

first_hidden_layer = tf.contrib.layers.relu(outputs, 1000) 

을, 그것은 "그 ValueError를을 idicating 오류가 발생합니다 : 치수는 1이어야하지만 입력 모양 [1], [3]을 사용하여 '조 변경'(op : '조옮김')의 경우 3입니다. " 내 문제가 "입력"텐서라는 것을 모았습니다. 설명에서, 입력 변수는 [batch_size, max_time, ...] 형식의 텐서라고 가정합니다. 그러나이를 추정자를 통해 입력 값 X와 대상 값 y만으로부터 위 구조로 변환하는 방법을 모릅니다. 시스템에 공급됩니다. 그래서 내 질문에 dynamic_rnn 클래스에 입력 변수 역할을 수있는 텐서를 만드는 방법이 될 것입니다.

고마워요.

답변

1

난 당신이 줄 필요가 없습니다 생각 : 당신은 텐서의 목록을지지 않습니다 dynamic_rnn 이후 dynamic_rnn에 직접 X를 제공 할 수 있습니다

inputs = tf.unstack(X, num=num_steps, axis=0) 

을; 시간 축이 차원 0 (time_major == True 인 경우) 또는 차원 1 (time_major == False 인 경우) 인 경우에는 하나의 텐서가 필요합니다.

실제로 은 2 차원 만 가지고있는 것으로 보입니다. inputs은 1 차원 텐서 목록입니다 (오류 메시지에 표시된대로). 그래서 당신과 함께 unstack 라인을 교체해야합니다 :이 dynamic_rnn

+0

그것은 작동에 의해 필요한 크기 1의 3 차원을 추가합니다

inputs = tf.expand_dims(X, axis=2) 

을, 그래서 나는 매우 당신에게 의무가 있어요,하지만 난 꽤하지 않습니다 아직 이해하지 못해. "inputs"변수는 "[batch_size, time_steps, ....]"형식이어야합니다. 그러나, 내 X는 추정치에 넘겨 줘야 numpy 배열입니다.이 추정기는 2 차원으로 천천히 텐서를 만듭니다. 그래서 내 질문은 두 번째 것이 무엇이고 어디에서 왔으며 어떤 의미에서이 "tf.expand_dims()"명령이 "[batch_size, time_steps, ....]"형식을 만드는가? –

+0

나는 당신의 질문에 기초하여, 당신은 가격 순서를 가지고 있다고 생각합니다 (길이 T라고 말하십시오). dynamic_rnn은 한 번에 여러 시퀀스로 작업 할 수 있습니다. "Batch"(크기 B라고합시다). 하나의 시퀀스 만 제공하려면 B를 1로 설정하고 입력은 [B, T] 모양이어야하지만 dynamic_rnn은 하나의 차원을 더 필요로합니다. 각 단어가 벡터 인 NLP와 같은 다른 작업에 유용합니다. 우리는 그 여분의 차원을 가져야 만하지만 가격 순서에 그것을 필요로하지 않기 때문에, 그것을 1로 설정한다. 그래서 입력 형태는 [B, T, 1]이다. time_major가 True이면 [T, B, 1]이어야합니다. expand_dims는 추가 측정 기준을 추가합니다. –

+0

마지막 부분을 이해합니다. 그러나 문제는 B를 설정하는 방법을 이해하는 것입니다. 제가 말했던 것처럼, 저는 추정기에 일차원 numpy 배열로 시계열을 공급합니다. 시스템에 batch_size를 알려주는 유일한 시간은 initial_state 변수를 정의 할 때입니다. 그것은 또한 손실 손실 함수가 –

관련 문제