2017-10-24 5 views
0

시계열을 예측하기 위해 keras LSTM을 만들려고합니다. 내 x_train은 3000,15,10 (예, Timesteps, 기능), 3000, 15,1과 같은 y_train과 같은 많은 모델 (시퀀스 당 10 개의 입력 기능으로 1 개의 출력/시퀀스 만들기)을 구축하려고합니다.Keras - 예기치 않은 예측 결과

내가 사용하는 코드는 이것이다 :

model = Sequential() 

model.add(LSTM(
    10, 
    input_shape=(15, 10), 
    return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(
    100, 
    return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(Dense(1, activation='linear')) 
model.compile(loss="mse", optimizer="rmsprop") 
model.fit(
     x_train, y_train, 
     batch_size=1, nb_epoch=1, validation_split=0.05) 
predicted = model.predict(x_test) 

내 데이터는 다음과 같습니다

x_train = [ 
    [ 
     [3,4,3,1.5,0,7....], # 10 Features 
     [2,4,1,1,4,3....], 
     .... # 15 Timesteps 
    ], 
    .... # 3000 Examples 
] 
y_train = [ 
    [ 
     [0], 
     [5], 
     .... 
    ], 
    ..... 
] 

코드는 컴파일하고 오류없이 적합하지만 예측 값은 사실이 아니다.

예상 값은 0과 ~ 15 사이의 정수입니다. 그러나 예측은 ~ -0.03과 1 사이의 수레입니다. 또한 예측에는 15 개의 시간 단계가 있지만 실제로는 16 번째 시간 단계 (예측 된 미래 결과)에 관심이 있습니다.

예 예측 :

predicted = [ 
    [ 
     [0.035478], 
     [0.046423], 
     [0.948723], 
     .... 
    ], 
    .... 
] 

keras 버전은 2.0.6이고 python 버전 3.4.5입니다.

도움을 주시면 대단히 감사하겠습니다.

답변

1

당신은 아마 NumPy와 배열 인 y_train되어 있다고 가정하고, 예측 0과 1로 당신의 y_train 크기를 조정해야합니다

y_train = y_train/15.0 

이 완료되면 그럼 당신은 당신의 예측을 재조정 할 수 있습니다.

predicted = (predicted*15).astype(int) 
+0

좋아, 고마워, 난이 시도됩니다. 16 번째 예측을 가져 오는 방법을 알고 있습니까? – sbz

+0

x_test에 대한 예측을 했으므로 x_test에 16 번째 timestep이 있는지 확인하십시오. – Mark

+0

감사합니다. 데이터를 0에서 1 사이의 크기로 조정 했으므로 모든 결과가 훨씬 현실적으로 보입니다.나는 또한 그것을 생각하고 나는 단지 15 개의 타임 스텝을 고수 할 것이지만 마지막 입력 타임 스텝을 자르고 처음에 빈 것을 삽입함으로써 입력과 결과를 이동시킨다. 따라서 모든 x 값은 다음 y 값에 해당합니다. 그러나 모든 결과에 대해 동일한 숫자 (~ 0.018)를 주로 받음에 따라 결과가 올바르지 않습니다. 그게 뭔지 알아? – sbz

0

나는 많은 모델에 많은 구축을 위해 노력하고있어 (순서 당 10 개 입력 기능은 1 출력/순서를 확인).

많은 모델을 만들고 싶습니다. 이를 위해

(10 입력 순서 당 1 개 출력 기능)은 다음을 수행해야합니다 모양 (3000,1)와 y_train

  1. 빌드. y_train은 t + 1 시간에 대한 미래의 예측 일 것입니다. 더 많은 시간 간격을 예측하려면 y_train과 마지막 dense 레이어를 조정하십시오.
  2. 신경망에서 규모 데이터가 필요하므로 아직 훈련 데이터를 확장하지 않은 경우 이 같은 마지막 LSTM 층에서
  3. 제거 return_sequences :

코드

model = Sequential() 
model.add(LSTM(10, input_shape=(15, 10), return_sequences=True)) 
model.add(Dropout(0.2)) 
model.add(LSTM(100, return_sequences=False)) 
model.add(Dropout(0.2)) 
model.add(Dense(1, activation='linear')) 
+0

입력을 주셔서 감사하지만 실제로 그것을 생각하고 실제로 많은 모델을 필요로한다고 생각합니다. 기본적으로 모든 나의 타임 스텝의 다음 결과를 예측해야합니다. 'return_sequence'를 바꾸는 이유는 무엇입니까? – sbz