Jaringan saraf berulang (RNN) dirancang untuk mempelajari data sekuens. Seperti yang Anda duga, mereka pasti dapat mengambil banyak fitur sebagai input! Keras 'RNNs mengambil input 2D ( T , F ) dari timesteps T dan fitur F (Saya mengabaikan dimensi batch di sini).
Namun, Anda tidak selalu membutuhkan atau menginginkan catatan waktu menengah, t = 1, 2 ... ( T - 1). Karena itu, Keras secara fleksibel mendukung kedua mode. Untuk mengeluarkan semua timesteps T , kirimkan return_sequences=True
ke RNN Anda (misalnya, LSTM
atau GRU
) pada konstruksi. Jika Anda hanya ingin catatan waktu terakhir t = T , maka gunakan return_sequences=False
(ini adalah default jika Anda tidak meneruskan return_sequences
ke konstruktor).
Di bawah ini adalah contoh dari kedua mode ini.
Contoh 1: Mempelajari urutannya
Berikut ini adalah contoh cepat melatih LSTM (tipe RNN) yang menjaga seluruh urutan. Dalam contoh ini, setiap titik data input memiliki 2 timesteps, masing-masing dengan 3 fitur; data output memiliki 2 timesteps (karena return_sequences=True
), masing-masing dengan 4 titik data (karena itu adalah ukuran yang saya lewatkan 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)
Contoh 2: Mempelajari tanda waktu terakhir
Jika, di sisi lain, Anda ingin melatih LSTM yang hanya mengeluarkan stempel waktu terakhir dalam urutan, maka Anda perlu mengatur return_sequences=False
(atau hanya menghapusnya dari konstruktor sepenuhnya, karena False
ini adalah default). Dan kemudian data output Anda ( data_y
dalam contoh di atas) perlu disusun ulang, karena Anda hanya perlu menyediakan catatan waktu terakhir. Jadi, dalam contoh kedua ini, setiap titik input data masih memiliki 2 waktu, masing-masing dengan 3 fitur. Data keluaran, bagaimanapun, hanyalah sebuah vektor tunggal untuk setiap titik data, karena kami telah meratakan semuanya menjadi satu timestep tunggal. Masing-masing vektor keluaran ini masih memiliki 4 fitur (karena itu adalah ukuran yang saya berikan 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)