Jaringan Neuron Buatan (JST) dengan jumlah input dan output yang sewenang-wenang

10

Saya ingin menggunakan JST untuk masalah saya, tetapi masalahnya adalah input dan output saya nomor node tidak diperbaiki.

Saya melakukan pencarian google sebelum mengajukan pertanyaan saya dan menemukan bahwa RNN dapat membantu saya dengan masalah saya. Tapi, semua contoh yang saya temukan entah bagaimana telah menentukan jumlah input dan output node.

Jadi, saya mencari strategi, bagaimana membuatnya nyata atau setidaknya beberapa contoh, lebih disukai di Keras atau PyTorch.

Lebih detail tentang masalah saya:

Saya memiliki dua daftar input, di mana panjang yang pertama diperbaiki dan sama dengan dua, fe:

in_1 = [2,2] 

tetapi panjang daftar kedua fleksibel, panjangnya bisa dari tiga hingga inf, fe:

in_2 = [1,1,2,2]

atau

in_2 = [1,1,1,2,2,2,3,3,3]

Juga, daftar input bergantung satu sama lain. Daftar pertama menunjukkan dimensi daftar keluaran. Jadi jika in_1 = [2,2], berarti output harus memiliki kemungkinan untuk dibentuk ulang menjadi [2,2].

Saat ini, saya berpikir untuk menggabungkan dua daftar input menjadi satu:

in = in_1 + in_2 = [2, 2, 1, 1, 2, 2]

Selain itu, output memiliki panjang yang sama dengan daftar in_2 , fi:

jika daftar input adalah:

in_1 = [2, 2]
in_2 = [1, 1, 2, 2]

Output harus:

out = [1, 2, 1, 2]

Ada ide selamat datang!

Padi
sumber

Jawaban:

6

Jawabannya mungkin tergantung pada signifikansi panjang vektor input atau bagaimana itu berasal.

Namun, solusi paling sederhana adalah dengan mengetahui input ukuran terbesar dan menggunakannya sebagai jumlah vektor. Jika input yang diberikan memiliki panjang yang lebih rendah, Anda dapat melakukan padding dengan nol atau simbol yang sesuai. Jadi, alih-alih memiliki vektor [1, 2, 3] dan [1, 2, 2, 3] Anda dapat memiliki vektor [1, 2, 3, 0] dan [1, 2, 2, 3].

Hal yang sama dapat diterapkan untuk output. Jika output yang diharapkan adalah [1, 2, 1] dan [1, 3, 4, 1] Anda dapat memperlakukan output pertama sebagai [1, 2, 1, 0]

Bukankah ini hanya peretasan?

Biasanya, jaringan saraf melakukan pendekatan fungsi. Idealnya, itu mewakili vektor (matriks) sebagai input dan vektor (matriks) sebagai output. Inilah sebabnya mengapa selalu diinginkan bahwa ukuran vektor input Anda diperbaiki.

Dipan Mehta
sumber
Ok, itu jelas, saya bisa melakukan padding untuk input. Tapi, bagaimana cara menentukan ukuran node output?
Paddy
3

Saya pikir Anda mungkin salah mengerti jumlah input tetap untuk RNN. Ini adalah jumlah input per catatan waktu . Semua contoh Anda memiliki jumlah input tetap per timestep: 1! Anda memberi mereka satu per satu ke jaringan saraf Anda, diakhiri dengan token "akhir" khusus (Anda selalu dapat memiliki input kedua untuk ini). Ajarkan untuk tidak memberikan output sampai ia melihat token akhir, dan kemudian untuk output komponen hasil satu per satu, berakhir dengan token keluaran akhir khusus.

Arthur Tacca
sumber
Wow terima kasih! Apakah Anda tahu tutorial / contoh yang layak untuk memahaminya dengan lebih baik?
Paddy
1
@ Paddy See awesome-rnn untuk beberapa tautan misalnya char-rnn cukup menyenangkan.
Arthur Tacca
2

Mengetahui bahwa daftar pertama cukup invarian (hanya menggambarkan geometri tertentu) Anda juga dapat mencoba membuat banyak NN khusus yang berbeda untuk setiap konfigurasi in_1 yang berbeda dan hanya menggunakan in_2 untuk memberi makan jaringan.

Jadi in_1 dapat menggerakkan networks.ie yang berbeda

in_1=[1,1]? --> NN #1 (n1) --> (o1)
in_1=[2,1]? --> NN #2 (n1,n2) --> (o1,o2)
in_1=[2,2]? --> NN #3 (n1,n2,n3,n4) -> (o1,o2,o3,o4)

Pada langkah pertama Anda menentukan konfigurasi (yaitu membuat dict) dan kemudian melatih / memberi makan jaringan khusus sesuai.

Jürgen Schwietering
sumber
sebenarnya, itu ide yang bagus, tetapi jumlah bentuknya cukup besar ... ngomong-ngomong, terima kasih atas masukannya!
Paddy