Çoklu özelliklere sahip RNN'ler


27

Makine Öğrenmesi algoritmalarıyla (temel Rastgele Orman ve Doğrusal Regresyon türü şeyler) çalışan bir miktar kendi kendine öğrendiğim bilgiye sahibim. Dallara ayrılmaya ve RNN'leri Keras ile öğrenmeye başladım. Genellikle stok tahminleri içeren örneklerin çoğuna bakarken, özellik tarihi olan ve çıktı olan 1 sütun dışında uygulanan birden çok özelliğin temel örneklerini bulamadım. Kaçırdığım önemli bir şey var mı?

Eğer birinin bir örneği varsa, buna minnettar kalırım.

Teşekkürler!


1
"Birden çok özellik" ile ne kastettiğinizden emin değilsiniz. Öğrenmeyi etkileyecek birden fazla özellik demek istiyorsan, sadece çok değişkenli bir tasarım matrisi kullanırsın. Pls bir örnek veya bir şey ile netleşir.
horaceT

@horaceT multiple features Burada , sayısal veri içeren ve sayısal olmayan veri içeren özelliklerle zaman serisi tahminleri için RNN'nin nasıl kullanılacağı hakkında daha spesifik bir soru açıkladım.
hhh

Yanıtlar:


25

Tekrarlayan sinir ağları (RNN'ler) dizi verilerini öğrenmek için tasarlanmıştır. Tahmin ettiğiniz gibi, kesinlikle girdi olarak birden fazla özellik alabilirler! Keras' RNNs 2D girdileri (almak T , F dilimler arasında) T ve özellikleri F (burada toplu boyut görmezden geliyorum).

Bununla birlikte, her zaman ara zaman adımlarına ihtiyaç duymaz veya istemezsiniz, t = 1, 2 ... ( T - 1). Bu nedenle Keras, her iki modu da esnek bir şekilde destekler. Tüm T timestepslerini çıkartabilmek için, yapım sırasındaki RNN'nize return_sequences=True(ör. LSTMVeya GRU) geçin . Sadece son zamanaşımını t = T istiyorsanız , o zaman kullanın return_sequences=False(bu, kurucuya geçmezseniz varsayılan değerdir return_sequences).

Aşağıda bu modların her ikisine de örnek gösterilmektedir.

Örnek 1: Diziyi öğrenme

İşte tüm diziyi etrafında tutan bir LSTM (RNN tipi) eğitimi için hızlı bir örnek. Bu örnekte, her giriş veri noktası, her biri 3 özellik içeren 2 zaman adımına sahiptir; çıktı verisi return_sequences=True, her biri 4 veri noktası olan (çünkü ilettiğim boyuta göre ) 2 zamanlayıcısına (çünkü ) sahiptir LSTM.

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Örnek 2: Son zaman adımını öğrenme

Öte yandan, dizideki yalnızca son zaman adımını çıkaran bir LSTM düzenlemek istiyorsanız, o zaman ayarlamanız gerekir return_sequences=False(ya da sadece Falsevarsayılan olduğundan , bunu yapıcıdan tamamen kaldırmanız gerekir ). Ve sonra çıktı verilerinizin ( data_yyukarıdaki örnekte) yeniden düzenlenmesi gerekir, çünkü yalnızca son zaman aşımını sağlamanız gerekir. Yani bu ikinci örnekte, her bir giriş veri noktası hala her biri 3 özellik içeren 2 zaman adımına sahiptir. Bununla birlikte, çıktı verileri her veri noktası için sadece tek bir vektördür, çünkü her şeyi tek bir zaman aşamasına indirdik. Bu çıkış vektörlerinin her biri yine de 4 özelliğe sahiptir (çünkü aktardığım boyut budur LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Büyük açıklamanız için teşekkür ederim. Veri noktası # 1 ve veri noktası # 2 arasındaki ilişki nedir? Örneğin, ilk durumda, eğer veri noktası 2'yi çıkarmanız ve veri noktası 1'in altına yerleştirecekseniz, şimdi 4 zaman adımımız var. Bu, modeli bir bütün olarak nasıl etkiler?
Rjay155

Veri noktaları arasında özel bir ilişki yoktur. İyi bir derin öğrenme eğitim seti, on binlerce, hatta milyonlarca veri noktasına sahip olacaktır. Bir veri noktası = bir eğitim örneği, hepsi bu. Eğer # 1 ve # 2 veri noktalarını "birleştirmek" data_xolsaydı , o zaman tek bir veri noktası olurdu ve bu veri noktasının her biri 3 boyutta (ve benzer data_yşekilde aynı şekilde birleştirmek zorunda olmanız gerekirdi) dört timesteps olurdu . Kullandığınız zaman adımlarının sayısı basitçe neyi modellemeye çalıştığınıza (ve bu işlem için kaç tane zaman adımının geçerli olduğuna) bağlıdır.
Adam Sypniewski

@Adam Sypniewski Y ile ilgili sorum var. data_y = numpy.array ([# Veri Noktası 1 # Timestep 2'deki hedef özellikler [[105, 106, 107, 108], [0, 1]], # Veri Noktası 2 # Timestep 2'deki hedef özellikleri [[205, 206, 207 , 208], [1, 0]]]) eğer y benim biri kategorik özellikse. Bunu nasıl yapılandırabilirim. Teşekkürler!
Hua Ye,

2
Bu durumda, büyük olasılıkla RNN'nin çıktısını yoğun bir katmana beslemelisiniz, böylece her bir çıkış zaman aşaması tek bir sıcak kategoride eşleştirilir.
Adam Sypniewski

Buradaki sonuçları nasıl görselleştirebilirsiniz? Bazı araziler yararlı olacaktır.
hhh
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.