3

나는 떨어지는 공의 궤도를 예측하고 싶습니다. 그 궤적은 포물선입니다. LSTM이 너무 많아서 (즉, 간단한 방법으로도 충분할 수 있음) 2 개의 LSTM 레이어와 Dense 레이어로 끝낼 수 있다고 생각했습니다.Keras LSTM 입력 - 포물선 궤적 예측

내가 원하는 최종 결과는 모델에 3 개의 높이 h0, h1, h2를 부여하고 h3을 예측하게하는 것입니다. 그런 다음 h1, h2 및 이전에 h3을 예측 한 h3을주고 싶습니다. 그러면 전체 궤적을 예측할 수 있습니다.

첫 번째로 첫 번째 LSTM 레이어의 입력 모양은 무엇입니까? input_shape = (3,1)이겠습니까? 둘째, LSTM은 포물선 경로를 예측할 수 있습니까?

포물선이 아닌 거의 평평한 선이 나옵니다. 입력을 공급하고 입력하는 방법을 오해하고 있다는 가능성을 배제하고 싶습니다.

답변

0

입력 형태는 형태 (samples, timeSteps, features)에 감사드립니다.

유일한 기능은 "높이"이므로 features = 1입니다.
길이가 다른 시퀀스를 입력하기 때문에 timeSteps = None을 사용할 수 있습니다.

따라서 input_shape(None, 1) 일 수 있습니다.
아래에서 stateful=True 레이어를 사용할 예정이므로 batch_input_shape=(1,None,1)을 사용할 수 있습니다. 원하는 "샘플"의 양을 선택하십시오.

모델에서 실제로 궤적을 예측할 수 있지만 두 개 이상의 레이어가 필요할 수도 있습니다. (얼마나 많은 레이어와 셀이 LSTM 내부의 일치 방식을 알고 있는지에 대한 정확한 대답).

교육 :

지금, 먼저 (만 그때는 좋은 일들을 예측 시작할 수 있습니다) 네트워크를 훈련해야합니다.

훈련의 경우 올바른 순서로 true 값인 [h1,h2,h3,h4,h5,h6...]의 시퀀스가 ​​있다고 가정합니다. (나는 당신이 실제로 많은 시퀀스 (샘플)을 가지고 있으므로 모델이 더 잘 배울 것이라고 제안한다). 이 순서

, 당신은 다음 단계를 예측 출력이, 다음 목표는 그래서 [h2,h3,h4,h5,h6,h7...]

될 싶어, 당신이 모양 (manySequences, steps, 1)data 배열을 가정, 당신은 만들 : 이제

x_train = data[:,:-1,:]  
y_train = data[:,1:,:] 

레이어에 return_sequences=True을 사용해야합니다. (모든 입력 단계는 출력 단계를 생성합니다). 그리고이 데이터로 모델을 훈련시킵니다.

stateful=True 또는 stateful=False 중 어느 것을 사용하든 관계 없습니다.

예측 (, 당신은 항상 매 시대 시퀀스 전에 model.reset_state() 필요 true의 경우는하지만) : 예측

, 당신은 모델에 stateful=True을 사용할 수 있습니다. 즉, h1을 입력하면 h2가 생성됩니다. 그리고 h2을 입력하면 올바른 "h3"을 예측하기 위해 "현재 속도"(모델의 state)가 기억됩니다.

(트레이닝 단계에서는 전체 시퀀스를 한 번에 입력하기 때문에 트레이닝 단계에서는 중요하지 않습니다. 따라서 긴 시퀀스의 단계 사이에서 속도를 이해할 수 있습니다).

reset_states()set_current_speed_to(0)으로 지정할 수 있습니다. 입력하려는 단계가 시퀀스의 첫 번째 단계 일 때마다이 매개 변수를 사용합니다.

그럼 당신은 이런 식으로 루프를 수행 할 수 있습니다

model.reset_states() #make speed = 0 
nextH = someValueWithShape((1,1,1)) 

predictions = [nextH] 

for i in range(steps): 
    nextH = model.predict(nextH)  
    predictions.append(nextH) 

an example here이지만,이 개 기능을 사용. 두 모델을 훈련 용으로 사용하고 예측 용으로 하나씩 사용하는 차이점이 있습니다. 그러나 return_sequences=Truestateful=True (훈련 기간마다 초 단위로 reset_states()을 잊지 마십시오) 중 하나만 사용할 수 있습니다.