Begitu:
Satu-ke-satu : Anda dapat menggunakan Dense
lapisan karena Anda tidak memproses urutan:
model.add(Dense(output_size, input_shape=input_shape))
Satu-ke-banyak : opsi ini tidak didukung dengan baik karena model perangkaian tidak mudah digunakan Keras
, jadi versi berikut adalah yang termudah:
model.add(RepeatVector(number_of_times, input_shape=input_shape))
model.add(LSTM(output_size, return_sequences=True))
Many-to-one : sebenarnya, cuplikan kode Anda (hampir) adalah contoh dari pendekatan ini:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim)))
Many-to-many : Ini adalah cuplikan termudah ketika panjang input dan output sesuai dengan jumlah langkah berulang:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
Many-to-many ketika jumlah langkah berbeda dari panjang input / output : ini sangat sulit di Keras. Tidak ada potongan kode yang mudah untuk mengkodekannya.
EDIT: Iklan 5
Di salah satu aplikasi saya baru-baru ini, kami menerapkan sesuatu yang mungkin mirip dengan many-to-many dari gambar ke-4. Jika Anda ingin memiliki jaringan dengan arsitektur berikut (ketika input lebih panjang dari output):
O O O
| | |
O O O O O O
| | | | | |
O O O O O O
Anda dapat mencapai ini dengan cara berikut:
model = Sequential()
model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Lambda(lambda x: x[:, -N:, :]
Di mana N
jumlah langkah terakhir yang ingin Anda tutupi (pada gambar N = 3
).
Dari titik ini menuju:
O O O
| | |
O O O O O O
| | |
O O O
adalah sesederhana urutan panjang bantalan buatan N
menggunakan misalnya dengan 0
vektor, untuk menyesuaikannya ke ukuran yang sesuai.