Keras의 다 대일 및 다 대다 LSTM 예제


108

LSTM과 Keras를 사용하여 구축하는 방법을 이해하려고합니다. RNN을 실행하는 데 주로 4 가지 모드가 있다는 것을 알아 냈습니다 (사진에서 올바른 4 가지 모드).

여기에 이미지 설명 입력 이미지 출처 : Andrej Karpathy

이제 Keras에서 각각에 대한 최소한의 코드 조각이 어떻게 생겼는지 궁금합니다. 그래서 뭔가

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

4 가지 작업 각각에 대해 약간의 설명이있을 수 있습니다.

답변:


121

그래서:

  1. 일대일 : Dense시퀀스를 처리하지 않으므로 레이어를 사용할 수 있습니다 .

    model.add(Dense(output_size, input_shape=input_shape))
  2. 일대 다 :이 옵션은 지원되지 않으며에서 모델을 연결하는 것이 그리 쉽지 Keras않으므로 다음 버전이 가장 쉬운 버전입니다.

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
  3. 다 대일 : 실제로 코드 조각은 (거의)이 접근 방식의 예입니다.

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  4. 다 대다 : 입력 및 출력의 길이가 반복 단계 수와 일치 할 때 가장 쉬운 스 니펫입니다.

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  5. 단계 수가 입력 / 출력 길이와 다를 때 다 대다 : 이것은 Keras에서 매우 어렵습니다. 이를 코딩하는 쉬운 코드 조각은 없습니다.

수정 : 광고 5

최근 애플리케이션 중 하나에서 우리 는 4 번째 이미지의 다 대다 와 유사한 것을 구현했습니다 . 다음 아키텍처의 네트워크를 원할 경우 (입력이 출력보다 긴 경우) :

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O

다음과 같은 방법으로이 작업을 수행 할 수 있습니다.

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]

N다룰 마지막 단계의 수는 어디에 있습니까 (이미지에서 N = 3).

이 시점부터 :

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 

적절한 크기로 조정하기 위해 N예를 들어 0벡터 와 함께 사용 하는 길이의 인위적인 패딩 시퀀스만큼 간단 합니다.


10
한 가지 설명 : 예를 들어 다 대일의 경우 LSTM (1, input_shape = (timesteps, data_dim)))을 사용합니다. 1이 LSTM 셀 / 숨겨진 노드의 수를 의미한다고 생각했지만 어떻게 Many- 대원으로 말하면 512 노드보다? (비슷한 것을 읽었 기 때문에 model.add (LSTM (512, input_shape = ...)) model.add (Dense (1)) 그게 무엇을 위해 사용됩니까?)
Luca Thiede

1
이 경우-코드-오타를 수정 한 후 괜찮을 것입니다.
Marcin Możejko

첫 번째 항목이 1 = 0이고 다른 모든 항목이 0 인 벡터가 아닌 RepeatVector를 사용하는 이유는 무엇입니까 (위 그림에 따르면 나중에 상태에서는 입력이 전혀없고 항상 동일한 입력은 아닙니다. 벡터 나의 이해에 무엇을 할 것이다 반복)
루카 티데

1
이 그림에 대해 신중하게 생각하면 일대 다 아이디어의 개념적 표현 일뿐 입니다. 이 모든 은닉 유닛 무언가를 입력으로 받아 들여야 합니다 . 따라서 첫 번째 입력이 같고 x다른 입력이 같은 입력을받을 수도 있습니다 0. 그러나-반면에-그들은 같은 것을 x여러 번 반복해서 받아 들일 수도 있습니다. 다른 접근 방식은 Keras. 내가 제공 한 옵션은 .NET 에서 일대 다 아키텍처 의 가장 쉬운 경우입니다 Keras.
Marcin Możejko 2007 년

좋아요! 나는 GAN 아키텍처에서 LSTM N to N을 사용하는 것에 대해 생각하고 있습니다. 나는 LSTM 기반 생성기를 가질 것입니다. 이 생성자 (gans의 "잠재 변수"에서 사용됨)를 시계열의 전반부에 제공하고이 생성기는 시계열의 후반부를 생성합니다. 그런 다음 두 개의 절반 (실제 및 생성)을 결합하여 간을위한 "가짜"입력을 생성합니다. 당신은 soluction의 poin 4를 사용하는 것이 효과가 있다고 생각합니까? 또는 다른 말로하면이 (솔루션 4)이 작업을 수행하는 올바른 방법입니까?
rjpg

6

@Marcin Możejko의 훌륭한 답변

나는 것 NR.5에 다음을 추가 (길이에서 / 다른에 많은 많은) :

A) 바닐라 LSTM

model = Sequential()
model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES)))
model.add(Dense(N_OUTPUTS))

B) 인코더-디코더 LSTM

model.add(LSTM(N_BLOCKS, input_shape=(N_INPUTS, N_FEATURES))  
model.add(RepeatVector(N_OUTPUTS))
model.add(LSTM(N_BLOCKS, return_sequences=True))  
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear')) 

1
B) Encoder-Decoder LSTM아키텍처 의 세부 사항을 설명해 주 시겠습니까? "RepeatVector"/ "TimeDistributed"단계의 역할을 이해하는 데 문제가 있습니다.
Marsellus Wallace
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.