네트워크가 입력 회전을 동일하게 처리하도록하려면 어떻게해야합니까?


11

신경망을 실행하기 위해 자체 시스템을 프로그래밍하려고합니다. 필요한 노드 수를 줄이려면 입력 회전을 동일하게 처리하도록 제안했습니다.

내 네트워크는 모든 사각형과 그 주변 사각형을 격자 모양으로보고 해당 사각형의 출력을 제공하여 Conway의 게임 게임을 배우고 예측하는 것을 목표로합니다. 입력은 9 비트 문자열입니다.

글라이더

위는 010 001 111로 표시됩니다.

그러나이 모양에는 세 가지 다른 회전이 있으며 모두 같은 출력을 생성합니다.

글라이더 회전

내 네트워크 토폴로지는 입력의 다음 가운데 사각형 상태에 대한 9 개의 입력 노드와 1 개의 출력 노드입니다. 숨겨진 레이어를 각 회전을 동일하게 사용하여 가능한 입력 수를 원본의 1/4로 줄이려면 어떻게 숨겨진 레이어를 구성 할 수 있습니까?

편집하다:

동일한 회전을 생성하는 각 회전의 반전도 있습니다. 이것들을 통합하면 입력을 1/8로 줄일 수 있습니다. 글라이더와 함께, 나의 목표는 이러한 모든 입력이 정확히 동일하게 취급되는 것입니다. 이것은 사전 처리로 수행해야합니까, 아니면 네트워크에 통합 할 수 있습니까?


뛰어난 질문! 나는 내 자신의 프로젝트와 비슷하고 방해하는 문제가 있으며 대칭을 줄이기 위해 가장 효율적인 기술에 대해 배우고 싶습니다.
DukeZhou

@DukeZhou 그러나 답변을 얻는 데 시간이 걸릴 것이라는 인상을 받았습니다. 필요한 경우 현상금을 설정하기 위해 빈약 한 담당자를 사용할 준비가되었습니다.
Aric

다른 해결책은 입력을 사전 처리하여 네 개의 회전이 모두 네트워크에 공급되기 전에 동일한 이미지로 변환되도록하는 것입니다.
BlueMoon93

답변:


4

잘 이해하면 단일 출력 노드가 중간에 다음 사각형 상태가됩니다. 모델을 훈련시키기에 충분한 리소스가있는 동안 숨겨진 레이어의 노드 수에 대해 걱정할 필요가 없습니다. 이 문제는 신경망에 대해 배우기 쉽기 때문에 크기에 관계가 없습니다.

감독 훈련을 받아야합니다. 즉, 입력 데이터와 일치하는 예상 출력을 제공해야합니다. 훈련 데이터에서 4 개의 회전이 모두 동일한 출력에 할당되어 있는지 확인해야합니다. 이런 식으로 네트워크는이 모든 것을 같은 방식으로 다루는 법을 배워야합니다.

당신은 나를 호기심으로 만들어서 스스로 시도했습니다. 내 솔루션은 오래된 랩톱에서 몇 초 안에 실행되는 약 20 개의 시대에서 100 % 정확한 것을 배울 수 있습니다. 출력을 [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은 개념 학습을위한 것이며 Game of Life의 개념을 배우기 위해서는 모든 패턴을 사용해야합니다. 메모리 사용 공간을 최소화하는 것이 목표라면 선형 방식으로 문제를 해결하십시오.
Manngo

메모리가 중요하지 않은 경우, 네트워크가 언급 한 것과 같은 이유로이 작업을 수행합니다. 사전 처리는 네트워크에서 일부 작업을 제거하여 단순화합니다.
Aric

수정 한 다음 전처리를 진행하십시오. 나는 이것으로 질문에 대답한다고 생각합니다. 메모리에 문제가있는 경우이를 구현하도록 선택할 수 있습니다. 팁 : 64를 사용하는 double 대신 32 비트 만 사용하는 가중치에는 float를 사용하십시오. 이렇게하면 메모리가 줄어 듭니다.
Manngo

4

문제점 공간에서 최적화를 식별했으며이를 신경망에 굽고 자합니다. 전처리를 제안합니다. 원하는 것의 일부를 수행하는 신경망으로 최적화를 작성하십시오.

즉, 게시물에서 강조된 동등성을 캡처하기 위해 입력을 회전시키는 회전 알고리즘을 수동으로 코딩하여 입력을 정규화합니다. 그런 다음이 변환의 결과를 신경망에 공급하여 훈련 및 기타 모든 용도로 사용하십시오. 이는 식별 한 하위 문제를 해결하기 위해 신경망을 훈련하고 있음을 의미합니다. 회전은 중복됩니다.

임의의 입력을 생성하고 네 가지 잠재적 변환 모두로 회전하여 정규화기를 테스트하고 각각에 대해 정규화기를 실행 한 다음 모두 동일한 지 확인하십시오.


1

그것에 대해 순수하게 말하면, 입력을 다르게 크기를 4의 원형 배열로 고려하십시오. 각 항목에는 한 쌍의 비트와 추가로 중앙 비트가 포함됩니다.

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

0

네트워크 설계 전체에서이 순환 구조와 중심점 패러다임을 계속하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.