Keras'ta birçok LSTM örneği


108

LSTM'leri ve Keras ile nasıl inşa edileceğini anlamaya çalışıyorum. Bir RNN'yi çalıştırmak için temel olarak 4 mod olduğunu öğrendim (resimde sağdaki 4 mod)

görüntü açıklamasını buraya girin Resim kaynağı: Andrej Karpathy

Şimdi Keras'ta her biri için minimalist bir kod parçacığının nasıl görüneceğini merak ediyorum. Yani şöyle bir şey

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

4 görevin her biri için, belki biraz açıklama ile.

Yanıtlar:


121

Yani:

  1. Bire bir : Densedizileri işlemediğiniz için bir katman kullanabilirsiniz :

    model.add(Dense(output_size, input_shape=input_shape))
  2. Birden çoğa : bu seçenek desteklenmediği için, zincirleme modelleri çok kolay değildir Keras, bu nedenle aşağıdaki sürüm en kolay olanıdır:

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
    
  3. Çoktan bire : aslında, kod pasajınız (neredeyse) bu yaklaşımın bir örneğidir:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
    
  4. Birçok çoğa : Bu giriş ve çıkış uzunluğu tekrarlayan adım sayısını maçları kolay snippet'idir:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    
  5. Adım sayısı giriş / çıkış uzunluğundan farklı olduğunda çoktan çoğa: Bu Keras'ta acayip zordur. Bunu kodlamak için kolay kod parçacıkları yoktur.

DÜZENLE: Reklam 5

Benim son uygulamalardan birinde, biz benzer olabilecek bir şey uygulanan birçok çoğa 4 görüntüden. Aşağıdaki mimariye sahip bir ağa sahip olmak istemeniz durumunda (bir giriş, çıkıştan daha uzun olduğunda):

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

Bunu şu şekilde başarabilirsiniz:

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

Kaplamak Nistediğiniz son adımların sayısı nerede (resimde N = 3).

Bu noktadan itibaren:

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

uygun bir boyuta ayarlamak için, Nörneğin 0vektörlerle birlikte kullanılan uzunlukta yapay dolgu dizisi kadar basittir .


10
Bir açıklama: Örneğin bir çok için, LSTM (1, input_shape = (timesteps, data_dim)) kullanıyorsunuz) 1'in LSTM hücrelerinin / gizli düğümlerin sayısını temsil ettiğini düşünmüştüm, ama görünüşe göre bir Many'u nasıl kodlarsınız? diyelim ki bire bir, 512 düğüm olsa? (Benzeri bir şey okuduğum için model.add (LSTM (512, input_shape = ...)) model.add (Yoğun (1)) ne için kullanılır?)
Luca Thiede

1
Bu durumda - kodunuz - bir yazım hatasını düzelttikten sonra tamam olmalıdır.
Marcin Możejko

Neden ilk giriş 1 = 0 ve diğer tüm girişler = 0 olan bir vektör değil de RepeatVector'ı kullanıyoruz (yukarıdaki resme göre, sonraki durumlarda hiç Giriş yok ve her zaman aynı giriş değil, Repeat Vector benim anlayışıma göre ne yapardı)
Luca Thiede

1
Bu resim hakkında dikkatlice düşünürseniz - bu sadece bire çok fikrinin kavramsal bir sunumudur . Tüm bu gizli birimler bir şeyi girdi olarak kabul etmelidir . Yani - aynı girdiyi kabul edebilirler ve ilk girdinin eşit xve diğerinin eşit olduğu girdiyi kabul edebilirler 0. Ancak - öte yandan - aynı şeyi xdefalarca tekrar etmeyi de kabul edebilirler . Farklı yaklaşım, içinde zor olan zincir modellerdir Keras. Sağladığım seçenek, bire çok mimarisinin en kolay durumudur Keras.
Marcin Możejko

Güzel ! Bir GAN mimarisinde LSTM N'den N'ye kullanmayı düşünüyorum. LSTM tabanlı bir jeneratörüm olacak. Bu jeneratörü (gans'ta "Gizli değişken" de kullanıldığı gibi) zaman serisinin ilk yarısını vereceğim ve bu jeneratör zaman serisinin ikinci yarısını üretecek. Daha sonra gan için "sahte" girdi üretmek için iki yarıyı (gerçek ve üretilmiş) birleştireceğim. Poin 4'ün çözümünü kullanmanın işe yarayacağını düşünüyor musun? veya başka bir deyişle, bu (çözüm 4) bunu yapmanın doğru yolu mu?
rjpg

6

@Marcin Możejko tarafından Büyük Cevap

Ben ediyorum Nr.5 aşağıdakileri ekleyin (uzunluk dışarı / farklı in birçok birçok):

A) Vanilya LSTM olarak

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

B) Kodlayıcı-Kod Çözücü LSTM olarak

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 LSTMMimarinin detaylarını açıklar mısınız? "RepeatVector" / "TimeDistributed" adımlarının rollerini anlamada sorunlar yaşıyorum.
Marsellus Wallace
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.