ฉันจะทำให้เครือข่ายของฉันปฏิบัติต่อการหมุนเวียนของอินพุตอย่างเท่าเทียมกันได้อย่างไร


11

ฉันพยายามตั้งโปรแกรมระบบของตัวเองเพื่อใช้งานเครือข่ายประสาท เพื่อลดจำนวนโหนดที่ต้องการแนะนำให้ทำการหมุนของอินพุตอย่างเท่าเทียมกัน

เครือข่ายของฉันมีเป้าหมายที่จะเรียนรู้และทำนายเกมแห่งชีวิตของคอนเวย์โดยดูที่ทุกตารางและพื้นที่โดยรอบในตารางและให้ผลลัพธ์สำหรับตารางนั้น อินพุตของมันคือสตริง 9 บิต:

เครื่องร่อน

ด้านบนแสดงเป็น 010 001 111

อย่างไรก็ตามมีการหมุนของรูปร่างนี้อีกสามแบบและทั้งหมดนั้นสร้างผลลัพธ์เดียวกัน:

การหมุนของเครื่องร่อน

โทโพโลยีเครือข่ายของฉันคือโหนดอินพุต 9 โหนดและโหนดเอาต์พุต 1 โหนดสำหรับสถานะถัดไปของจัตุรัสกลางในอินพุต ฉันจะสร้างเลเยอร์ที่ซ่อนไว้เพื่อให้แต่ละรอบการหมุนเหมือนกันได้อย่างไรโดยลดจำนวนอินพุตที่เป็นไปได้ลงเหลือหนึ่งในสี่ของต้นฉบับ

แก้ไข:

นอกจากนี้ยังมีการพลิกการหมุนแต่ละครั้งซึ่งให้ผลลัพธ์เหมือนกัน การรวมสิ่งเหล่านี้จะทำให้อินพุตของฉันลดลง 1 / 8th ด้วยเครื่องร่อนจุดมุ่งหมายของฉันคือให้อินพุตทั้งหมดเหล่านี้ได้รับการปฏิบัติเหมือนกันทุกประการ สิ่งนี้จะต้องทำด้วยการประมวลผลล่วงหน้าหรือฉันสามารถรวมเข้ากับเครือข่ายได้หรือไม่


คำถามที่โดดเด่น! ฉันมีปัญหาที่คล้ายกันและเป็นอุปสรรคต่อโครงการของฉันและจะสนใจเรียนรู้เกี่ยวกับเทคนิคที่มีประสิทธิภาพที่สุดเพื่อลดความสมมาตร
DukeZhou

@DukeZhou ฉันรู้สึกว่ามันต้องใช้เวลาสักพักกว่าจะได้คำตอบ ฉันพร้อมที่จะใช้งานได้ถึงอุปทานพอเพียงของฉันของตัวแทนในการตั้งค่าโปรดปรานถ้าจำเป็น ...
Aric

อีกวิธีหนึ่งคือการประมวลผลอินพุตล่วงหน้าซึ่งการหมุนทั้ง 4 แบบจะถูกแปลงเป็นภาพเดียวกันก่อนที่จะถูกป้อนเข้าสู่เครือข่าย
BlueMoon93

คำตอบ:


4

หากฉันเข้าใจดีว่าโหนดเอาต์พุตเดี่ยวของคุณจะเป็นสถานะถัดไปของสแควร์ที่อยู่ตรงกลาง คุณไม่จำเป็นต้องกังวลเกี่ยวกับจำนวนโหนดในเลเยอร์ที่ซ่อนอยู่ในขณะที่คุณมีทรัพยากรเพียงพอที่จะฝึกฝนโมเดล ปัญหานี้ง่ายมากในการเรียนรู้สำหรับโครงข่ายประสาทเทียมดังนั้นจึงไม่ต้องกังวลเรื่องขนาด

คุณต้องทำการฝึกอบรมแบบมีผู้ควบคุมซึ่งหมายความว่าคุณต้องป้อนข้อมูลเข้าและผลลัพธ์ที่คาดหวังที่ตรงกัน คุณต้องแน่ใจว่าในข้อมูลการฝึกของคุณการหมุนทั้ง 4 แบบนั้นถูกกำหนดให้กับเอาต์พุตเดียวกัน วิธีนี้เครือข่ายของคุณควรเรียนรู้ที่จะปฏิบัติต่อสิ่งเหล่านี้ด้วยวิธีเดียวกัน

คุณทำให้ฉันอยากรู้อยากเห็นดังนั้นฉันพยายามเอง โซลูชันของฉันสามารถเรียนรู้การแก้ไขได้ 100% ในเวลาประมาณ 20 ยุคภายในไม่กี่วินาทีบนแล็ปท็อปเครื่องเก่าของฉัน ฉันเพียงเปลี่ยนผลลัพธ์เล็กน้อยเพื่อจัดหมวดหมู่อย่างใดอย่างหนึ่ง [0,1] หรือ [1,0] แต่นั่นก็ให้ผลลัพธ์เดียวกันกับที่คุณกำลังมองหา เพื่อการอ้างอิงนี่คือรหัสที่เขียนด้วยไพ ธ อน:

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)

เครือข่ายที่ฉันจะใช้จะถูกจำลองโดยชั้นเรียนที่เขียนด้วยตัวเองดังนั้นหน่วยความจำจะเกี่ยวข้อง
Aric

หากคุณต้องการลดการใช้หน่วยความจำโดยเครือข่ายการลดจำนวนอินพุตที่เป็นไปได้ (โดยการหมุน) จะช่วยให้มีเครือข่ายขนาดเล็กลง งานการเรียนรู้ที่ง่ายขึ้นคือเครือข่ายขนาดเล็กที่ต้องการ ในกรณีนี้การประมวลผลล่วงหน้าจะดีกว่า อย่างไรก็ตาม NN สำหรับการเรียนรู้แนวคิดและการเรียนรู้แนวคิดของเกมแห่งชีวิตคุณควรให้อาหารในทุกรูปแบบ หากเป้าหมายของคุณคือการลดขนาดหน่วยความจำอย่างแน่นอนให้แก้ปัญหาในลักษณะเชิงเส้น
Manngo

หากหน่วยความจำไม่ใช่ข้อกังวลฉันต้องการให้เครือข่ายดำเนินการนี้ด้วยเหตุผลเดียวกับที่คุณระบุไว้ การประมวลผลล่วงหน้าจะลบงานบางส่วนออกจากเครือข่ายทำให้ง่ายขึ้น
Aric

ถูกต้องจากนั้นไปสำหรับการประมวลผลล่วงหน้า ฉันคิดว่าคำถามนี้ตอบแล้ว คุณอาจเลือกที่จะใช้มันหากคุณพบปัญหาเกี่ยวกับหน่วยความจำ เคล็ดลับ: ใช้ float สำหรับน้ำหนักที่ใช้เพียง 32 บิตแทนที่จะเป็น double ที่ใช้ 64 ซึ่งจะใช้หน่วยความจำน้อยกว่า
Manngo

4

คุณได้ระบุการเพิ่มประสิทธิภาพในพื้นที่ที่มีปัญหาของคุณและต้องการอบสิ่งนี้ลงในตาข่ายประสาทของคุณ ฉันขอแนะนำการประมวลผลล่วงหน้า: เขียนการเพิ่มประสิทธิภาพของคุณด้วยตาข่ายประสาทที่ทำชุดย่อยของสิ่งที่คุณต้องการ

กล่าวอีกนัยหนึ่งป้อนข้อมูลปกติของคุณด้วยการเข้ารหัสอัลกอริทึมการหมุนด้วยตนเองที่หมุนอินพุตเพื่อจับภาพไฮไลต์ที่เทียบเท่าในโพสต์ของคุณ จากนั้นป้อนผลลัพธ์ของการแปลงร่างนี้ให้กับโครงข่ายประสาทของคุณสำหรับการฝึกอบรมและการใช้งานอื่น ๆ ทั้งหมด ซึ่งหมายความว่าคุณกำลังฝึกโครงข่ายประสาทเพื่อจัดการกับปัญหาย่อยที่คุณระบุ - การหมุนเวียนซ้ำซ้อน

ทดสอบ Normalizer ของคุณด้วยการสร้างอินพุตแบบสุ่มหมุนไปที่การแปลงทั้งสี่ที่เป็นไปได้เรียกใช้ Normalizer ในแต่ละอันจากนั้นตรวจสอบว่ามันเทียบเท่ากันหมด


1

หากต้องการพิถีพิถันเกี่ยวกับเรื่องนี้เริ่มต้นด้วยการพิจารณาอินพุตที่แตกต่างกันเป็นอาร์เรย์แบบวงกลมที่มีขนาดสี่แต่ละรายการประกอบด้วยคู่ของบิตและบิตที่เพิ่มเข้ามา:

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

0

ตลอดการออกแบบเครือข่ายดำเนินการต่อโครงสร้างวงกลมและกระบวนทัศน์จุดกึ่งกลาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.