Як я можу змусити свою мережу порівнювати обертання вхідного сигналу однаково?


11

Я намагаюся запрограмувати власну систему для запуску нейронної мережі. Щоб зменшити кількість потрібних вузлів, пропонувалося зробити так, щоб вони обробляли обертання вводу однаково.

Моя мережа має на меті вивчити та передбачити Гра життя Конвея, переглядаючи кожну площу та навколишні її квадрати в сітці та даючи вихід для цієї площі. Його вхід - це рядок з 9 біт:

Планер

Вищезазначене представлено як 010 001 111.

Однак є три інші обертання такої форми, і всі вони дають однаковий вихід:

Обертання планера

Моя мережа топологія - це 9 вузлів входу та 1 вихідний вузол для наступного стану центральної площі на вході. Як я можу побудувати прихований шар (и), щоб вони сприйняли кожне з цих обертань однаковим, скоротивши кількість можливих входів до чверті оригіналу?

Редагувати:

Також є обертання кожного обертання, що дає однаковий результат. Включення цих даних скоротить мої входи на 1/8. За допомогою планера, моя мета полягає в тому, щоб усі ці входи трактувалися точно так само. Чи потрібно це робити з попередньою обробкою, чи можу я включити її в мережу?


Невирішене питання! У мене є подібне, що перешкоджає моєму власному проекту, і мені буде дуже цікаво дізнатись про найефективніші методи зменшення для симетрії.
DukeZhou

@DukeZhou У мене складається враження, що для отримання відповіді буде потрібно якийсь час. Я готовий використати свою мізерну пропозицію представників, щоб створити щедрість, якщо потрібно ...
Aric

Іншим рішенням є попередня обробка вводу, щоб усі 4 обертання перетворилися на одне і те ж зображення перед подачею в мережу.
BlueMoon93

Відповіді:


4

Якщо я добре розумію, ваш єдиний вихідний вузол буде наступним статусом квадрата посередині. Вам не потрібно турбуватися про кількість вузлів у прихованих шарах, хоча у вас є достатні ресурси для підготовки моделі. Цю проблему дуже легко вивчити для нейромережі, тому розмір не стосується.

Вам потрібно провести контрольоване навчання, що означає, що вам потрібно вводити вхідні дані та відповідні очікувані результати. Ви повинні бути впевнені, що у ваших навчальних даних усі 4 ротації призначаються одному і тому ж результату. Таким чином ваша мережа повинна навчитися поводитись із цим однаково.

Ти зробив мене цікавим, щоб я спробував себе. Моє рішення могло навчитися 100% правильно приблизно за 20 епох, що працюють протягом декількох секунд на моєму старому ноутбуці. Я лише трохи змінив вихід, щоб бути категоричним або [0,1], або [1,0], але це дає той самий результат, який ви шукаєте. Для довідки тут код, написаний в 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)

Мережа, якою я буду користуватися, буде змодельована класом, написаним власноруч, тому пам'ять стосується.
Арік

Якщо ви хочете зменшити використання пам'яті в мережі, то зменшення кількості можливих входів (шляхом обертання) допоможе мати меншу мережу. Чим простіше навчальне завдання, тим менша мережа потрібна. У цьому випадку попередня обробка була б кращою. Тим не менш, NN призначений для вивчення концепцій та для засвоєння концепції Game of Life, ви повинні годуватись у всіх моделях. Якщо ваша мета - абсолютно мінімізувати слід пам’яті, вирішіть проблему лінійним шляхом.
Манго

Якщо пам'ять не викликає занепокоєння, я б скоріше мережа виконувала цю операцію з тих самих причин, які ви вказали. Попередня обробка видаляє частину завдання з мережі, спрощуючи її.
Арік

Виправте, тоді перейдіть до попередньої обробки. Я думаю, що з цим питанням дано відповідь. Ви можете вибрати його для реалізації, якщо у вас виникли проблеми із пам'яттю. Порада: використовуйте поплавок для ваг, який займає лише 32 біти, а не подвійний, який займає 64. Це займе менше пам'яті.
Манго

4

Ви визначили оптимізацію у своєму проблемному просторі та хотіли зафіксувати це у своїй нейронній мережі. Я пропоную попередню обробку: Складіть оптимізацію за допомогою нейронної мережі, яка робить підмножину того, що ви хочете.

Іншими словами, нормалізуйте введення, вручну кодуючи алгоритм обертання, який обертає входи, щоб захопити еквівалентність, виділену у вашій публікації. Потім передайте результат цієї трансформації у вашу нейронну мережу, для тренувань та всіх інших цілей. Це означає, що ви навчаєте нейронну мережу для вирішення визначеної вами субпроблеми - обертання є зайвими.

Перевірте свій нормалізатор, генеруючи випадковий вхід, повернувши його до всіх чотирьох потенційних перетворень, запустіть нормалізатор на кожному, а потім перевірте, чи всі вони рівнозначні.


1

Для цього слід по-різному розглядати введення як круговий масив розміром чотири, кожен елемент містить пару біт, а також біт по центру:

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

0

Протягом усього проектування мережі продовжуйте цю кругову структуру та парадигму центральної точки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.