LSTM DQN의 어레이 입력 형태 오류를 해결하는 방법은 무엇입니까?

2020-08-01 input lstm layer shapes dqn

LSTM 레이어로 DQN을 구축 중입니다. 훈련을 위해 모델에 96timeperiod, 33 개 기능 배열을 전달하려고합니다. 즉 shape = (96, 33) 또한 가변 길이 시퀀스 (최대 길이 = 96)를 수용하기 위해 포스트 패딩 마스크 (val =.)를 구현하려고했습니다.

model = Sequential()
inp = (NUM_TIMEPERIODS, NUM_FEATURES)
model.add(Masking(mask_value=0., input_shape=inp))
model.add(LSTM(NUM_FEATURES, input_shape=inp, activation='tanh', return_sequences=True))
model.add(LSTM(NUM_FEATURES, activation='tanh'))
model.add(Dense(NUM_FEATURES, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
              optimizer=Adam(lr=LEARNING_RATE, decay=DECAY),
              metrics=['accuracy'])

모양이 (96, 33) 인 current_states라는 시퀀스를 제출하면 다음을 사용합니다.

current_qs_list = self.model.predict(current_states)

q- 값을 생성하려면 오류를 반환합니다.

ValueError: Input 0 of layer lstm is incompatible with the layer: 
expected ndim=3, found ndim=2. Full shape received: [32, 33]

32는이 첫 번째 시퀀스의 마스크 된 길이 (최대 길이 96에서)가 모델에 제출되고 덤프됩니다 ... 마스킹 레이어 바로 앞에 입력 레이어를 추가하려고했습니다.

model.add(Input(batch_size=None, shape=inp))

그러나 해결책이 없으며 더 많은 오류 만 있습니다. [96,33] 배열을 수신하고 학습하기 위해 모델 입력 레이어를 다시 작성하는 방법은 무엇입니까? 또는 '[4, 96, 33]과 같이 일련의 시퀀스 (예 : 4 개의 시퀀스)를 배열로 통합 한 다음 모델에 제출해야합니까?

Answers

내가 생각해 낸 유일한 가능한 해결책은 두 개 이상의 (96, 33) 배열을 미니 배치로 결합하는 것입니다.

minibatchSize = 2
current_states = np.concatenate(array1(96,33), array2(96,33)).reshape(minbatchSize, 
                 NUM_TIMEPERIODS, NUM_FEATURES)

마스킹 직전에 입력 레이어가 추가 된 모델에 제출합니다.

model.add(Input(batch_size=minibatchSize, shape=inp))

0이 아닌 또는 1이 아닌 batchsize를 지정하지 않고 입력 레이어에서 해당 batchsize를 지정하지 않으면 작동하지 않을 수 있습니다. 배치를 사용해야합니다 ...

Related