如何使我的网络平等对待输入的旋转?


11

我正在尝试对自己的系统进行编程以运行神经网络。为了减少所需的节点数,建议使它平等地对待输入的旋转。

我的网络旨在通过查看网格中的每个正方形及其周围的正方形,并给出该正方形的输出,来学习和预测Conway的生活游戏。它的输入是9位字符串:

滑翔机

以上表示为010 001 111。

但是,此形状还有另外三个旋转,并且所有旋转均产生相同的输出:

滑翔机旋转

我的网络拓扑是9个输入节点和1个输出节点,用于输入中的中心正方形的下一个状态。如何构造隐藏层,使它们将这些旋转的每一个都相同,从而将可能的输入数量减少到原来的四分之一?

编辑:

每旋转一圈也会产生相同的结果。合并这些将使我的输入减少1/8。使用滑翔机,我的目标是对所有这些输入进行完全相同的处理。这必须通过预处理完成,还是可以将其合并到网络中?


悬而未决的问题!我在自己的项目中遇到类似的阻碍性问题,并且将非常有兴趣了解减少对称性的最有效技术。
周公爵

@DukeZhou我给人的印象是要花一些时间才能得到答案。如果需要,我准备用我很少的代表来建立赏金...
Aric

另一种解决方案是对输入进行预处理,以便在将所有4个旋转输入到网络之前将其转换为同一图像。
BlueMoon93

Answers:


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)

我将使用的网络将由我自己编写的类进行模拟,因此需要考虑内存问题。
Aric

如果要减少网络的内存使用量,则减少可能的输入数量(通过轮换)将有助于使网络更小。学习任务越容易,所需的网络就越小。在这种情况下,预处理会更好。但是,NN是用于概念学习的,要学习生活游戏的概念,您应该以各种方式进行学习。如果您的目标是绝对减少内存占用,请以线性方式解决问题。
曼戈

如果不考虑内存问题,我宁愿网络出于与您所述相同的原因执行此操作。预处理可以从网络中删除某些任务,从而简化了任务。
艾瑞克(Aric)

正确,然后进行预处理。我认为这个问题已经得到回答。如果遇到内存问题,则可以选择实施它。提示:对仅占用32位的权重使用float而不是占用64位的double权重。这将使用更少的内存。
曼戈

4

您已经确定了问题空间中的优化,并且希望将其烘焙到神经网络中。我建议进行预处理:使用神经网络组成您想要的子集的优化。

换句话说,通过手动编码旋转算法来规范化您的输入,该算法旋转输入以捕获帖子中突出显示的等价内容。然后将此转换的输出馈送到您的神经网络,以进行训练和所有其他用途。这意味着您正在训练神经网络来解决您确定的子问题-旋转是多余的。

通过生成随机输入,将其旋转到所有四个可能的转换,对每个归一化器运行归一化器,然后检查它们是否相等,来测试归一化器。


1

为了做到这一点,首先要以不同的方式考虑输入,即大小为4的圆形数组,每个项都包含一对位以及一个中心位:

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

0

在整个网络的设计中,继续执行此圆形结构和中心点范例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.