Keras를 사용한 LSTM의 input_shape 매개 변수 이해


20

Keras 설명서에 "시퀀스 분류 용 스택 LSTM"(아래 코드 참조)이라는 설명 을 사용하려고하는데 input_shape내 데이터의 맥락 에서 매개 변수를 파악할 수 없습니다 .

최대 길이가 31 인 패딩 된 시퀀스에 정수로 인코딩 된 25 개의 가능한 문자 시퀀스의 행렬을 입력했습니다. 결과적으로 x_train모양의 (1085420, 31)의미가 (n_observations, sequence_length)있습니다.

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

이 코드 x_train에서 모양 (1000, 8, 16)은 16 개의 요소로 구성된 8 개의 배열로 구성된 1000 개의 배열로 구성됩니다. 거기에서 무엇을, 어떻게 데이터가이 형태에 도달 할 수 있는지 완전히 잃어 버리게됩니다.

Keras 문서와 다양한 자습서 및 Q & A를 보면 분명한 내용이 누락 된 것 같습니다. 누군가 나에게 찾아야 할 힌트를 줄 수 있습니까?

당신의 도움을 주셔서 감사합니다 !

답변:


23

LSTM 모양은 거칠기 때문에 기분이 나쁘지 않습니다. 직접 싸우는 데 며칠을 보냈습니다.

한 번에 한 문자 씩 데이터를 공급할 경우 입력 모양은 31 개의 타임 스텝 (각 1 문자)이므로 (31,1)이어야합니다. 이 명령으로 쉽게 수행 할 수있는 x_train을 (1085420, 31)에서 (1085420, 31,1)로 재구성해야합니다.

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))

2

이 자식 저장소 LSTM Keras 요약 다이어그램을 확인 하면 모든 것이 명확해야한다고 생각합니다.

이 git repo에는 Keras LSTM 요약 다이어그램이 포함되어 있습니다.

  • 매개 변수의 사용이 좋아하는 return_sequences, batch_size, time_step...
  • lstm 레이어의 실제 구조
  • 케 라스 에서이 레이어의 개념
  • 모델 요구 사항에 맞게 입력 및 출력 데이터를 조작하는 방법 LSTM의 레이어를 쌓는 방법

그리고 더


감사합니다, @MohammadFneish. 이제 더 도움이 될 것 같습니다. 그러나 이것이 유용한 제안과는 달리 질문에 대한 답변 이라는 것은 확실하지 않습니다 . 주의하십시오 크로스 인증 됨이 엄격 Q & A 사이트가 아닌 포럼입니다. 입력 셰이프 매개 변수를 설명하기 위해 추가 정보를 추가 할 수 있습니까?
gung-Monica Monica 복원

3
@ gung 나는 표준을 유지하기 위해 이러한 답변을 검토하는 방식에 정말로 감사하지만, 많은 기술적 세부 사항이있는 경우 이러한 매개 변수에 대해 더 자세히 설명 할 수 없다고 생각합니다. 내 대답은 keras 입력과 비슷한 문제에 직면 한 개발자에게 도움이 될 수 있으며 반드시이 특정 문제는 아닙니다. 감사합니다
Mohammad Fneish

1

귀하의 질문에 대한 직접적인 답변이 아니라는 것을 알고 있습니다. 이것은 LSTM 셀이 하나 인 단순화 된 예이며, 입력 데이터의 재구성 조작을 이해하는 데 도움이됩니다.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

이것은 단 하나의 LSTM 셀과 특정 모양의 입력 데이터를 가진 LSTM 네트워크의 예입니다.

결과적으로 우리는 여기서 예측하고 있습니다. 훈련은 단순화를 위해 존재하지 않지만 방법 전에 데이터를 재구성 (추가 차원 추가)하는 predict방법을 살펴보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.