如何在 keras 中构建置换不变性神经网络?

数据挖掘 Python 神经网络 深度学习 喀拉斯 张量流
2022-01-31 14:01:25

我的问题是关于用更少的数据解决我的问题所需的网络结构。

我有一个传感器设备,可以简单地报告它在它前面看到的东西的颜色。一个传感器向我报告 4 个数字:红色、绿色、蓝色和 Alpha。颜色变化的强度取决于距离和它所看到的东西。我在一个小立方体的每一侧都安装了 6 个这样的传感器。立方体可以用手移动和旋转。

我想实时预测立方体在空间中的位置。

我的问题:

输入:6 个相同的传感器,每个传感器给出 4 个数字。总数=6*4=24 个数字。

输出:3个数字,X,Y,Z,(立方体的位置)

我已经准备好带有标签 XYZ 的数据。

现在,训练一个简单的多层感知器,它接受 24 个数字并输出 3 个数字。这工作得很好,但它需要一立方米空间中的大量数据才能准确预测。

问题在于旋转。我需要为每个位置旋转并覆盖 360 度,以便它能够很好地预测。

但我知道每个传感器都是相同的,所以我想分担每个传感器的重量。我知道当您将立方体旋转 90 度时,它根本不会影响输出位置。所以这应该意味着传感器的顺序并不重要。这意味着我应该以某种方式使用addaverage合并我的传感器层。如果我使用concatenate它将保留使输出位置发生变化的顺序。

我这样做的方式是将 4 个数字输入到一个传感器模型中,该模型在所有传感器之间共享,获取编码,将它们相加,然后将其连接到 Dense 层。以下是模型原型:

from keras.layers import Input, Dense
from keras.models import Model, Sequential

sensor1 = Input(shape=(4,))
sensor2 = Input(shape=(4,))
sensor3 = Input(shape=(4,))
sensor4 = Input(shape=(4,))
sensor5 = Input(shape=(4,))
sensor6 = Input(shape=(4,))
sensor_model = Sequential([
    Dense(64, activation='relu'),
    Dense(64, activation='relu'),
])
sensor1_encoding = sensor_model(sensor1)
sensor2_encoding = sensor_model(sensor2)
sensor3_encoding = sensor_model(sensor3)
sensor4_encoding = sensor_model(sensor4)
sensor5_encoding = sensor_model(sensor5)
sensor6_encoding = sensor_model(sensor6)
sensor_encoding = average([
    sensor1_encoding,
    sensor2_encoding,
    sensor3_encoding,
    sensor4_encoding,
    sensor5_encoding,
    sensor6_encoding,
])
h = sensor_encoding
h = Dense(128, activation='relu')(h)
h = Dense(128, activation='relu')(h)
h = Dense(3, activation='linear')
model = Model(inputs=[sensor1, sensor2, sensor3, sensor4, sensor5, sensor6], outputs=[h])

现在,当我将average函数更改为 时concatenate,模型损失在训练集和验证集上都较低,这与我的直觉相矛盾。我的想法有什么问题?你怎么看?如果我旋转 90 度而不遭受 45 度旋转,我该如何调整这个模型以便它预测相同的位置。并且还要以不删除输入之间的有用关系的方式进行。

2个回答

Concatenate很好。


通过连接,您可以让网络访问预测输出所需的所有信息。顺序无关紧要。

通过平均,您可以将数据压缩成更小的数据:以信息量较少的方式表示您的数据。这就是您的准确性松散的原因:您向网络提供的可供学习的信息较少。


您需要做的是获取更多数据。您的初始方法很好,您只需要足够的数据让您的网络了解当数据表示 90 度旋转时,输出应该是相同的。

我找到了解决方案。我已经为它编写了代码,有兴趣的人请查看: https ://github.com/off99555/superkeras/blob/master/permutational_layer.py

这是一篇论文的实现。这是关于配对所有 2 个输入并使用接受 2 个输入的模型。该模型是共享的,并且它们的输出使用平均值进行汇总。这保留了每一层的置换不变性,同时也使输入始终相互可见。