Saya mencoba untuk mulai belajar tentang RNNs dan saya menggunakan Keras. Saya memahami premis dasar lapisan vanilla RNN dan LSTM, tetapi saya mengalami kesulitan memahami poin teknis tertentu untuk pelatihan.
Dalam dokumentasi keras , dikatakan input ke layer RNN harus berbentuk (batch_size, timesteps, input_dim)
. Ini menunjukkan bahwa semua contoh pelatihan memiliki panjang urutan tetap, yaitu timesteps
.
Tapi ini tidak terlalu khas, bukan? Saya mungkin ingin agar RNN beroperasi pada kalimat dengan panjang yang berbeda-beda. Ketika saya melatihnya pada beberapa corpus, saya akan memberinya banyak kalimat, semua panjangnya berbeda.
Saya kira hal yang jelas harus dilakukan adalah menemukan panjang maksimal urutan apa pun dalam set pelatihan dan nol pad. Tetapi apakah itu berarti saya tidak dapat membuat prediksi pada waktu pengujian dengan panjang input lebih besar dari itu?
Ini adalah pertanyaan tentang implementasi khusus Keras, saya kira, tapi saya juga menanyakan apa yang biasanya dilakukan orang ketika menghadapi masalah seperti ini secara umum.
Masking
layer ke ignorJawaban:
Itu tidak sepenuhnya benar, karena dimensi itu bisa
None
, yaitu panjang variabel. Dalam satu batch , Anda harus memiliki jumlah timesteps yang sama (ini biasanya Anda melihat 0-padding dan masking). Tapi di antara batch tidak ada batasan seperti itu. Selama inferensi, Anda dapat memiliki panjang apa pun.Kode contoh yang membuat batch acak dari data pelatihan.
Dan inilah yang dicetaknya. Perhatikan bentuk output
(None, None, x)
menunjukkan ukuran batch variabel dan ukuran cap waktu variabel.sumber
fit()
, kita dapat melewatkansequence_lenth
parameter untuk menentukan panjang urutan untuk mengecualikannya. Tampaknya pendekatan generator tidak memungkinkan mengabaikan 0 urutan?(inputs, targets, sample_weights)
, dan Anda dapat mengatursample_weights
0-bantalan Anda ke 0. Namun, saya tidak yakin ini akan bekerja dengan baik untuk Bidirectional RNNs.model.predict_generator
dengan set tes. Ketika saya mencoba untuk memprediksi dengan generator saya mendapatkan kesalahan tentang penggabungan (set tes juga memiliki urutan panjang variabel). Solusi saya adalah menggunakan standarmodel.predict
dengan cara hacky. Mungkin ini hanya akan lebih cocok untuk pertanyaan baru?@ KBrose tampaknya memiliki solusi yang lebih baik
Ini biasanya merupakan solusi yang baik. Mungkin coba maks panjang urutan + 100. Gunakan apa pun yang paling cocok untuk aplikasi Anda.
Belum tentu. Alasan panjang tetap digunakan dalam keras, adalah karena itu sangat meningkatkan kinerja dengan menciptakan tensor bentuk tetap. Tapi itu hanya untuk pelatihan. Setelah pelatihan, Anda akan mempelajari bobot yang tepat untuk tugas Anda.
Mari kita asumsikan, setelah pelatihan selama berjam-jam, Anda menyadari bahwa panjang maks model Anda tidak cukup besar / kecil dan Anda sekarang perlu mengubah langkah-langkah waktu, cukup ekstrak bobot yang dipelajari dari model lama, buat model baru dengan langkah-langkah waktu baru dan menyuntikkan bobot yang dipelajari ke dalamnya.
Anda mungkin dapat melakukan ini menggunakan sesuatu seperti:
new_model.set_weights(old_model.get_weights())
Saya belum mencobanya sendiri. Silakan coba dan kirim hasil Anda di sini untuk keuntungan semua orang. Berikut ini beberapa tautan: satu dua
sumber
max length + 100
. Lihat jawaban saya sebagai contoh kode.Bidirectional(LSTM)()
danRepeatVector()
berlapis - lapis, dan prediksi yang sempurna.