Ağımın girişin dönüşlerini eşit olarak ele almasını nasıl sağlayabilirim?


11

Sinir ağı kurmak için kendi sistemimi programlamaya çalışıyorum. Gerekli düğüm sayısını azaltmak için, girdinin dönüşlerini eşit şekilde işlemesi önerildi.

Ağım, her kareye ve çevresindeki karelere bir ızgarada bakarak ve o karenin çıktısını vererek Conway'in Yaşam Oyunu'nu öğrenmeyi ve tahmin etmeyi amaçlıyor. Girdisi 9 bitlik bir dizedir:

Planör

Yukarıdakiler 010 001 111 olarak temsil edilmektedir.

Bununla birlikte, bu şeklin üç dönüşü daha vardır ve hepsi aynı çıktıyı üretir:

Planör rotasyonları

Ağ topolojim, girişteki merkez karenin bir sonraki durumu için 9 giriş düğümü ve 1 çıkış düğümüdür. Gizli katmanları bu rotasyonların her birini aynı şekilde alacak şekilde nasıl oluşturabilirim, olası giriş sayısını orijinalin dörtte birine indiririm?

Düzenle:

Her rotasyonun aynı sonucu veren bir dönüşü de vardır. Bunları dahil etmek girdi sayımı 1/8 oranında azaltacaktır. Planör ile amacım, tüm bu girdilerin tamamen aynı şekilde işlem görmesi. Bunun ön işleme ile yapılması gerekecek mi yoksa ağa dahil edebilir miyim?


Mükemmel soru! Kendi projemle de benzer, engelli bir sorunum var ve simetriyi azaltmak için en verimli teknikleri öğrenmekle çok ilgileneceğim.
DukeZhou

@DukeZhou Ancak cevap almanın biraz zaman alacağı izlenimini edindim. Gerekirse ödül kazanmak için yetersiz tedarikimi kullanmaya hazırım ...
Aric

Başka bir çözüm, girişin ön işlem görmesidir, öyle ki 4 rotasyonun tümü ağa beslenmeden önce aynı görüntüye dönüştürülür.
BlueMoon93

Yanıtlar:


4

İyi anlarsam, tek çıkış düğümünüz ortadaki karenin bir sonraki durumu olacaktır. Modeli eğitmek için yeterli kaynağınız varken gizli katmanlardaki düğüm sayısı hakkında endişelenmenize gerek yoktur. Sinir ağı için bu problemi öğrenmek çok kolaydır, bu yüzden boyut endişesi yoktur.

Giriş verilerini ve eşleşen beklenen çıktıyı beslemeniz gerektiği anlamına gelen denetimli eğitim yapmanız gerekir. Egzersiz verilerinizde 4 rotasyonun hepsinin aynı çıkışa atandığından emin olmanız gerekir. Bu şekilde ağınız tüm bunlara aynı şekilde davranmayı öğrenmelidir.

Beni meraklandırdın, bu yüzden kendimi denedim. Çözümüm, eski dizüstü bilgisayarımda birkaç saniye içinde çalışan yaklaşık 20 çağda% 100 doğru öğrenebilir. Çıktıyı sadece [0,1] veya [1,0] kategorik olacak şekilde değiştirdim ancak aradığınız sonucu verir. Sadece burada referans için python ile yazılmış kod:

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)

Kullanacağım ağ, benim tarafımdan yazılmış bir sınıf tarafından simüle edilecek, dolayısıyla bellek endişeleri olacak.
Aric

Ağ tarafından bellek kullanımını azaltmak istiyorsanız, olası girişlerin sayısını (döndürerek) azaltmak daha küçük bir ağa sahip olmanıza yardımcı olacaktır. Öğrenme görevi ne kadar kolay olursa, gereken daha küçük ağ budur. Bu durumda ön işleme daha iyi olur. Yine de NN, kavram öğrenme ve tüm oyunlarda beslemeniz gereken Yaşam Oyunu kavramını öğrenmek içindir. Amacınız bellek ayak izini kesinlikle en aza indirmekse, sorunu doğrusal bir şekilde çözün.
Manngo

Bellek bir endişe değilse, ağın bu işlemi belirttiğiniz nedenlerle gerçekleştirmesini tercih ederim. Ön işlem, görevin bir kısmını ağdan kaldırır ve basitleştirir.
Aric

Düzeltin, ardından ön işlemeye geçin. Bence bu soru cevaplandı. Bellekle ilgili sorun yaşarsanız uygulamayı uygulamayı seçebilirsiniz. İpucu: 64 yerine çift yerine sadece 32 bit alan ağırlıklar için float kullanın. Bu, daha az bellek kullanır.
Manngo

4

Sorun alanınızda bir optimizasyon belirlediniz ve bunu sinir ağınıza dönüştürmek istersiniz. Önişlemeyi öneriyorum: Optimizasyonunuzu, istediğiniz şeyin alt kümesini yapan bir sinir ağı ile oluşturun.

Başka bir deyişle, postanızda vurgulanan denkliği yakalamak için girdileri döndüren bir döndürme algoritmasını manuel olarak kodlayarak girişinizi normalleştirin. Daha sonra eğitim ve diğer tüm kullanımlar için bu dönüşümün çıktısını sinir ağınıza besleyin. Bu, sinir ağını tanımladığınız alt problemle başa çıkmak için eğittiğiniz anlamına gelir - rotasyonlar gereksizdir.

Normalleştiricinizi rastgele giriş oluşturarak test edin, dört potansiyel dönüşüme de döndürün, normalleştiriciyi her birinde çalıştırın, sonra hepsinin eşdeğer olduğunu kontrol edin.


1

Bu konuda saf olmak için, girdiyi farklı bir şekilde, dört boyutlu dairesel bir dizi olarak, her öğenin bir çift bit ve ayrıca bir merkez biti olarak düşünerek başlayın:

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

0

Ağın tasarımı boyunca, bu dairesel yapıya ve merkez nokta paradigmasına devam edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.