创建一个神经网络,由 n 次不同的网络组成。是否可以?

数据挖掘 机器学习 神经网络 分类 回归
2022-02-18 22:13:32

我目前正在从事一个项目,其中包含大量设备数据,这些设备要么属于人,要么不属于人。最终目标是估计检测到的人数。可悲的是,不可能获得哪些设备应该被归类为人类而哪些不应该被分类的标签。所以一个基本的二元分类网络是不可训练的。

然而,我确实有很多人,这可以与应该检测到的人体设备的数量相关联(这不是应该检测到的设备的确切总和,因为我们将无法全部检测)。

所以......我想到了这个奇怪的结构,我有一个二进制分类神经网络(图中的绿色框)沿自身复制 n 次,然后将其输出传播到外部网络,该网络将使用分类器的输出和其他一些将决定缩放比例的变量(粉红色)(例如,如果使用设备只能检测到 50% 的人,那么缩放比例必须为 2。但这是一个非线性函数所以它也将由NN确定)。

绿色神经网络应该共享相同的权重,因为它们将执行相同的工作。

多神经网络

另一种可能性是使用从外部(红色)NN 到绿色 NN 的粉红色缩放变量,然后让它产生一个非二进制值,但更像是一个缩放值。因此,在与上述相同的示例中,1 将返回 2。

这在理论上可行吗?以前做过吗?最好的方法是什么?

我已经和我的顾问谈过这件事,但他对此持怀疑态度。

1个回答

我认为这是可能的。我不知道它对你的效果如何,但我认为这在技术上是可行的(这是最好的)。

对于初学者,我建议使用Keras 的功能 API 来处理这类事情。它使像这样的网络组合变得非常容易,并且像GitHub 上的这种实现这样的残差网络以类似的方式组合。类似以下的内容可能会让您继续前进(请注意,这并不是一个完整的解决方案,抱歉):

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

def single_net(input_shape, filters):
    def f(input):
        h0 = Dense(filters, activation='relu')(input)
        h1 = Dense(filters, activation='relu')(h0)
        prediction = Dense(2, activation='softmax')(h1)
        return prediction
    return f

input_a = Input(shape=input_shape)  # whatever your input shape is
input_b = Input(shape=input_shape)
# ... repeat for however many people you have ...
shared_net = single_net(input_shape, filters)  # define once
network0 = shared_net(input_a)
network1 = shared_net(input_b)
# ... again repeat for each person
combined_nets = keras.layers.concatenate([network0, network1, ...])
dense = Dense(output_shape, activation='relu')(combined_nets)  # or however you want to combine them
model = Model(inputs=[input_a, input_b, ...], outputs=dense)
model.compile(optimizer='adam', loss='binary_crossentropy')  # whatever optimizer, loss you like
model.fit([data_a, data_b, ...], labels, ...)

通过仅定义一次重复网络(shared_net如上),然后为每个输入使用相同的对象,您将在所有这些输入中共享这些层。基本上,当您反向传播时,所有输入/输出都将训练网络的单个实例,即使您基本上对每个输入都使用它的副本。

最大的问题是如何组合所有单独的模型,以及如何处理不断变化的模型数量。我不知道如何处理不确定数量的模型,但我建议查看 Keras 功能 API 文档的共享层部分以获取有关组合的一些帮助,并深入研究 GitHub 上的一些示例。此处显示的内容应该可以帮助您入门,但可能始终隐藏着一些错误。就像我说的,不是一个完整的答案,对不起。