ネットワークで入力のローテーションを同等に扱うにはどうすればよいですか?


11

ニューラルネットワークを実行するように自分のシステムをプログラムしようとしています。必要なノードの数を減らすために、入力の回転を同等に扱うようにすることが提案されました。

私のネットワークは、グリッド内のすべての四角形とその周囲の四角形を調べ、その四角形の出力を与えることにより、コンウェイのライフゲームを学習および予測することを目的としています。入力は9ビットの文字列です。

グライダー

上記は010 001 111として表されます。

ただし、この形状には他に3つの回転があり、それらはすべて同じ出力を生成します。

グライダーの回転

私のネットワークトポロジは、入力の中央の正方形の次の状態の9つの入力ノードと1つの出力ノードです。これらの回転をそれぞれ同じようにして、可能な入力の数を元の4分の1に削減するように、隠しレイヤーを構築するにはどうすればよいですか?

編集:

各回転のフリップもあり、同じ結果が得られます。これらを組み込むと、入力が1/8に削減されます。グライダーの場合、これらの入力をすべて同じように処理することが私の目標です。これは前処理で行う必要がありますか、それともネットワークに組み込むことができますか?


未解決の質問です。私は自分のプロジェクトにも同様の妨げとなる問題があり、対称性を減らすための最も効率的な手法について学ぶことに非常に興味があります。
DukeZhou

@DukeZhouでも、答えが出るまでに少し時間がかかる印象です。必要に応じて、わずかな担当者を使って賞金を設定する準備ができています...
Aric

別の解決策は、入力を前処理して、4つの回転すべてが同じ画像に変換されてからネットワークに供給されるようにすることです。
BlueMoon93 2017

回答:


4

私がよく理解していれば、あなたの単一の出力ノードは中央の正方形の次のステータスになります。モデルをトレーニングするための十分なリソースがあれば、非表示のレイヤーのノード数を気にする必要はありません。この問題はニューラルネットワークで非常に簡単に学習できるため、サイズの問題はありません。

教師付きトレーニングを行う必要があります。つまり、入力データと一致する期待される出力をフィードする必要があります。トレーニングデータで、4つの回転すべてが同じ出力に割り当てられていることを確認する必要があります。このようにして、ネットワークはこれらすべてを同じように扱うことを学ぶ必要があります。

あなたは私を好奇心をそそられたので、私は自分で試しました。私のソリューションは、古いラップトップで数秒以内に実行される約20エポックで100%正しいと学習できました。出力を[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)

私が使用するネットワークは、自分で作成したクラスによってシミュレートされるため、メモリの問題になります。
2017

ネットワークによるメモリ使用量を減らしたい場合は、(ローテーションによって)可能な入力の数を減らすと、ネットワークを小さくするのに役立ちます。必要なネットワークが小さいほど、学習タスクが容易になります。この場合、前処理の方が優れています。それにもかかわらず、NNはコンセプト学習用であり、Game of Lifeのコンセプトを学習するには、すべてのパターンでフィードする必要があります。メモリフットプリントを完全に最小化することが目的である場合は、問題を直線的に解決してください。
Manngo 2017

メモリが問題にならない場合は、あなたが述べたのと同じ理由で、ネットワークがこの操作を実行したいと思います。前処理により、ネットワークからタスクの一部が削除され、簡素化されます。
2017

修正して、前処理に進みます。これで問題は解決したと思います。メモリの問題が発生した場合は、実装することを選択できます。ヒント:64ビットを使用するdoubleではなく、32ビットのみを使用する重みにはfloatを使用します。これにより、使用するメモリが少なくなります。
Manngo 2017

4

あなたは問題空間の最適化を特定し、これをニューラルネットに焼き込もうとしています。前処理をお勧めします。必要なサブセットを実行するニューラルネットを使用して最適化を構成します。

言い換えると、入力でローテーションするローテーションアルゴリズムを手動でコーディングして入力を正規化し、投稿で強調表示された同等性をキャプチャします。次に、この変換の出力をニューラルネットにフィードして、トレーニングやその他すべての用途に使用します。これは、特定したサブ問題に取り組むためにニューラルネットをトレーニングしていることを意味します。回転は冗長です。

ランダム入力を生成し、それを4つの潜在的な変換すべてに回転させてノーマライザをテストし、それぞれに対してノーマライザを実行して、それらがすべて同等であることを確認します。


1

それについて簡潔にするために、入力を別の方法で検討することから始めます。サイズが4の循環配列として、各アイテムはビットのペアと、さらに中央のビットを含みます。

... 01、01、11、10 ...

0

ネットワークの設計全体を通して、この循環構造と中心点のパラダイムを続けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.