我的问题是关于用更少的数据来解决我的问题所需的网络结构。
我有一个传感器设备,可以简单地报告在它前面看到的东西的颜色。一个传感器向我报告4个数字:红色,绿色,蓝色和Alpha。 颜色变化的强度取决于距离和所看到的东西。 我在一个小立方体的每一侧都装有6个这样的传感器。可以用手移动和旋转立方体。
我想实时预测立方体在空间中的位置。
我的问题:
输入:6个相同的传感器,每个传感器给出4个数字。总数= 6 * 4 = 24个数字。
输出:3个数字,X,Y,Z(多维数据集的位置)
我已准备好带有XYZ标签的数据。
现在,训练一个简单的多层感知器,该感知器需要24个数字并输出3个数字。 这种方法工作得很好,但需要在立方米的空间中提供大量数据才能准确预测。
问题在于旋转。我需要旋转并在每个位置覆盖360度才能准确预测。
但是我知道每个传感器都是相同的,所以我想分担每个传感器的重量。我知道将多维数据集旋转90度时,它根本不会影响输出位置。因此,这意味着传感器的顺序并不重要。这意味着我应该以某种方式使用add
或average
合并我的传感器层。如果我使用concatenate
,它将保留更改输出位置的顺序。
我的工作方式是将4个数字输入到所有传感器之间共享的传感器模型中,获取编码,将其累加起来,然后将其连接到密集层。以下是模型原型:
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度旋转,如何调整此模型以使其预测相同的位置。并以不删除输入之间有用关系的方式进行构建。
答案 0 :(得分:0)
我找到了解决方案。而且我已经为此编写了代码,对于任何有兴趣的人,请检查: https://github.com/off99555/keras_helpers/blob/master/permutational_layer.py