Bagaimana saya bisa membuat jaringan saya memperlakukan rotasi input secara sama?

11

Saya mencoba memprogram sistem saya sendiri untuk menjalankan jaringan saraf. Untuk mengurangi jumlah node yang dibutuhkan, disarankan untuk membuatnya memperlakukan rotasi input secara merata.

Jaringan saya bertujuan untuk mempelajari dan memprediksi Permainan Kehidupan Conway dengan melihat setiap kotak dan kotak di sekitarnya dalam kotak, dan memberikan output untuk kotak itu. Inputnya adalah string 9 bit:

Pesawat peluncur

Di atas diwakili sebagai 010 001 111.

Namun ada tiga rotasi lain dari bentuk ini, dan semuanya menghasilkan keluaran yang sama:

Rotasi glider

Topologi jaringan saya adalah 9 node input dan 1 node output untuk keadaan berikutnya dari pusat persegi di input. Bagaimana saya bisa membangun lapisan tersembunyi sehingga mereka mengambil setiap rotasi ini sama, memotong jumlah input yang mungkin turun menjadi seperempat dari aslinya?

Edit:

Ada juga flip dari setiap rotasi yang menghasilkan hasil yang identik. Memasukkan ini akan memangkas input saya pada 1/8. Dengan glider, tujuan saya adalah agar semua input ini diperlakukan sama persis. Apakah ini harus dilakukan dengan pra-pemrosesan, atau bisakah saya memasukkannya ke dalam jaringan?

Aric
sumber
Pertanyaan luar biasa! Saya memiliki masalah serupa yang menghambat dengan proyek saya sendiri dan akan sangat tertarik untuk belajar tentang teknik yang paling efisien untuk mengurangi simetri.
DukeZhou
@DukeZhou Saya mendapatkan kesan bahwa akan butuh beberapa saat untuk mendapatkan jawaban. Saya siap menggunakan persediaan tenaga saya yang sedikit untuk menyiapkan hadiah jika diperlukan ...
Aric
Solusi lain adalah pra-proses input, sehingga semua 4 rotasi dikonversi menjadi gambar yang sama sebelum diumpankan ke jaringan.
BlueMoon93

Jawaban:

4

Jika saya mengerti dengan baik simpul output tunggal Anda akan menjadi status persegi berikutnya di tengah. Anda tidak perlu khawatir tentang jumlah node di lapisan tersembunyi sementara Anda memiliki sumber daya yang cukup untuk melatih model. Masalah ini sangat mudah dipelajari untuk jaringan saraf sehingga tidak ada masalah ukuran.

Anda perlu melakukan pelatihan yang diawasi yang berarti Anda perlu memasukkan data input dan hasil yang diharapkan sesuai. Anda harus yakin bahwa dalam data pelatihan Anda semua 4 rotasi ditugaskan untuk output yang sama. Dengan cara ini jaringan Anda harus belajar memperlakukan semua ini dengan cara yang sama.

Anda membuat saya penasaran jadi saya mencoba sendiri. Solusi saya bisa belajar 100% benar dalam sekitar 20 zaman berjalan dalam beberapa detik di laptop lama saya. Saya hanya sedikit mengubah output menjadi kategorikal baik [0,1] atau [1,0] tetapi itu memberikan hasil yang sama seperti yang Anda cari. Hanya untuk referensi di sini adalah kode yang ditulis dengan python:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)
Manngo
sumber
Jaringan yang akan saya gunakan akan disimulasikan oleh kelas yang ditulis oleh saya sendiri, karena itu menyangkut memori.
Aric
Jika Anda ingin mengurangi penggunaan memori oleh jaringan maka mengurangi jumlah input yang mungkin (dengan memutar) akan membantu untuk memiliki jaringan yang lebih kecil. Semakin mudah tugas belajar dibutuhkan jaringan yang lebih kecil. Dalam hal ini pra-pemrosesan akan lebih baik. Namun demikian NN adalah untuk pembelajaran konsep dan untuk mempelajari konsep Game of Life Anda harus memberi makan di semua pola. Jika tujuan Anda adalah meminimalkan jejak memori, pecahkan masalah secara linear.
Manngo
Jika memori bukan masalah, saya lebih suka jaringan melakukan operasi ini untuk alasan yang sama yang Anda nyatakan. Pra-pemrosesan menghapus beberapa tugas dari jaringan, menyederhanakannya.
Aric
Benar, lalu pergi untuk pra-pemrosesan. Saya pikir dengan ini pertanyaan dijawab. Anda dapat memilih untuk mengimplementasikannya jika Anda mengalami masalah dengan memori. Tip: gunakan float untuk bobot yang hanya membutuhkan 32 bit, bukan ganda yang membutuhkan 64. Ini akan menggunakan lebih sedikit memori.
Manngo
4

Anda telah mengidentifikasi optimasi dalam ruang masalah Anda dan keinginan untuk memanggang ini ke jaringan saraf Anda. Saya sarankan preprocessing: Komposisikan optimasi Anda dengan neural net yang melakukan subset dari apa yang Anda inginkan.

Dengan kata lain, normalisasikan input Anda dengan secara manual koding algoritma rotasi yang memutar input untuk menangkap kesetaraan yang disorot dalam posting Anda. Kemudian masukkan output dari transformasi ini ke jaringan saraf Anda, untuk pelatihan dan semua kegunaan lainnya. Ini berarti Anda melatih jaringan saraf untuk mengatasi sub-masalah yang Anda identifikasi - rotasi berlebihan.

Uji normalizer Anda dengan menghasilkan input acak, putar ke keempat transformasi potensial, jalankan normalizer di masing-masing, kemudian periksa apakah semuanya setara.

Harrichael
sumber
1

Agar lebih murni, mulailah dengan mempertimbangkan input secara berbeda, sebagai array lingkaran ukuran empat, setiap item berisi sepasang bit, dan juga bit tengah:

... 01, 01, 11, 10 ...

0

Sepanjang desain jaringan, lanjutkan struktur melingkar dan paradigma titik pusat ini.

Douglas Daseeco
sumber