Saya berjuang untuk menafsirkan perbedaan pengkodean Keras untuk pelabelan urutan satu-ke-banyak (misalnya klasifikasi gambar tunggal) dan banyak-ke-banyak (misalnya klasifikasi urutan gambar). Saya sering melihat dua jenis kode:
Tipe 1 adalah di mana TimeDistributed tidak diterapkan seperti ini:
model=Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode="valid", input_shape=[1, 56,14]))
model.add(Activation("relu"))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Reshape((56*14,)))
model.add(Dropout(0.25))
model.add(LSTM(5))
model.add(Dense(50))
model.add(Dense(nb_classes))
model.add(Activation("softmax"))
Tipe 2 adalah tempat TimeDistributed diterapkan seperti ini:
model = Sequential()
model.add(InputLayer(input_shape=(5, 224, 224, 3)))
model.add(TimeDistributed(Convolution2D(64, (3, 3))))
model.add(TimeDistributed(MaxPooling2D((2,2), strides=(2,2))))
model.add(LSTM(10))
model.add(Dense(3))
Pertanyaan saya adalah:
Apakah asumsi saya benar bahwa Tipe 1 adalah jenis satu-ke-banyak dan Tipe 2 adalah jenis banyak-ke-banyak? Atau
TimeDistributed
tidak memiliki relevansi dalam aspek ini?Dalam salah satu kasus satu-ke-banyak atau banyak-ke-banyak adalah lapisan padat terakhir seharusnya 1 simpul "panjang" (memancarkan hanya satu nilai pada gilirannya) dan
lapisan berulang sebelumnya bertanggung jawab untuk menentukan berapa banyak
1-panjang nilai untuk dipancarkan? Atau lapisan padat terakhir seharusnya terdiri dari N node di manaN=max sequence length
? Jika demikian, apa gunanya
menggunakan RNN di sini ketika kita dapat menghasilkan input yang serupa dengan banyak
keluaran dengan penduga "vanilla" paralel N?Bagaimana cara menentukan jumlah catatan waktu dalam RNN? Apakah itu entah bagaimana
berkorelasi dengan panjang urutan output atau hanya
hiperparameter untuk disetel?Kasus Inn pada contoh 1 saya di atas apa gunanya menerapkan
LSTM ketika model hanya memancarkan satu prediksi kelas (dari kemungkinan
nb_classes
)? Bagaimana jika seseorang menghilangkan layer LSTM?
Jawaban:
Inti dari menggunakan setiap layer berulang adalah memiliki output menjadi hasil tidak hanya satu item independen dari item lain, tetapi juga urutan item, sehingga output dari operasi layer pada satu item dalam urutan adalah hasilnya baik item itu dan item apa pun sebelum itu dalam urutan. Jumlah tanda waktu menentukan berapa lama urutan tersebut. Artinya, berapa banyak item yang harus ditangani secara berurutan, dan memengaruhi hasil yang dihasilkan masing-masing.
Lapisan LSTM beroperasi sedemikian rupa sehingga menerima input pada form number_of_timesteps, dimensi_of_each_item. Jika parameter return_afterences diatur ke False, yang secara default, layer "senyawa" input dari semua catatan waktu menjadi output tunggal. Jika Anda mempertimbangkan urutan, katakan 10 item, layer LSTM dengan return_afterences diatur ke False akan dari urutan seperti itu menghasilkan item output tunggal, dan atribut dari item tunggal ini akan menjadi hasil dari semua item (tanda waktu) di urutan. Inilah yang Anda inginkan dalam hal desain banyak-ke-satu.
Lapisan LSTM dengan return_afterences diatur ke True will untuk setiap item (timestep) dalam urutan input menghasilkan output. Ini dilakukan sedemikian rupa sehingga pada setiap timestep, output tidak hanya bergantung pada item yang sedang dioperasikan, tetapi juga item sebelumnya dalam urutan. Inilah yang Anda inginkan dalam hal desain banyak-ke-banyak.
Karena lapisan LSTM mengambil urutan item sebagai input, setiap lapisan sebelum lapisan LSTM dalam model Anda perlu menghasilkan urutan sebagai output. Dalam kasus model Tipe 1 Anda, beberapa layer pertama tidak beroperasi pada urutan, melainkan satu item pada satu waktu. Karenanya, ini tidak menghasilkan urutan item yang akan dioperasikan untuk LSTM.
Menggunakan TimeDistributed memungkinkan lapisan beroperasi pada setiap item secara berurutan tanpa item yang saling mempengaruhi. Lapisan TimeDistributed dengan demikian beroperasi pada urutan item, tetapi tidak ada rekursi.
Dalam kasus model tipe 2 Anda, lapisan pertama akan menghasilkan urutan 5 timestep panjang, dan operasi yang dilakukan pada masing-masing item dalam urutan akan independen satu sama lain, karena lapisan yang dibungkus dalam TimeDistributed tidak berulang. Karena lapisan LSTM menggunakan pengaturan default, return_afterences = Salah, lapisan LSTM akan menghasilkan output tunggal untuk setiap urutan 5 item.
Jumlah akhir node keluaran dalam model Anda sepenuhnya tergantung pada use case. Sebuah simpul tunggal cocok untuk sesuatu seperti klasifikasi biner atau untuk menghasilkan semacam skor.
sumber
Saya pikir Anda mungkin dapat menggunakan pekerjaan saya sebelumnya. Dalam kode ini saya membuat gelombang sinus (dari panjang gelombang dan fase acak) dan melatih LSTM ke urutan titik dari gelombang sinus ini dan menghasilkan urutan 150 poin yang menyelesaikan setiap gelombang sinus.
Inilah modelnya:
Dan ini adalah keseluruhan skrip:
sumber