首页 > 解决方案 > 具有线性激活输出的神经网络。计算每个输出神经元的输出范围

问题描述

假设我有一个如下所示的神经网络:

model = keras.models.Sequential()
model.add(keras.layers.Dense(10, input_shape=(5,), activation='relu'))
model.add(keras.layers.Dense(4, activation='linear'))

具有 n 个具有线性激活函数的输出神经元。

训练过程在这里并不重要,所以我们可以看一下 keras 初始化使用的随机权重:

model.weights 

当然,在一个真实的例子中,这些权重应该在训练过程中进行调整。

根据这些model.weights,每个输出神经元返回一个范围内的值。

我想计算这个确切的范围。

keras 是否提供任何函数来计算它?

我构建了一段有缺陷的代码来对其进行近似,使用循环并预测随机输入。但这在具有更多输入/神经元/权重的实际示例中不会真正有用。

这里有一些示例试图澄清我的问题(所有示例都假设输入值介于 1 和 1 之间):

model = keras.models.Sequential()
model.add(keras.layers.Dense(1, input_shape=(2,), 
          activation='linear', use_bias=False))

model.set_weights([np.array([1, 1]).reshape(2, 1)]) 

对于前面的示例,输出神经元结果将介于 0 和 2 之间

model.set_weights([np.array([-0.5, 1]).reshape(2, 1)])

对于前面的示例,输出神经元结果将介于 -0.5 和 1 之间

model = keras.models.Sequential()
model.add(keras.layers.Dense(2, input_shape=(2,), activation='linear', use_bias=False))
model.add(keras.layers.Dense(1, activation='linear', use_bias=False))

model.set_weights([np.array([1, 1, 1, 1]).reshape(2,2), np.array([1, 1]).reshape(2,1)])

对于前面的示例,输出神经元结果将介于04

这些是简化的示例。在具有非常复杂的网络结构、激活函数、偏差的真实场景中......这些范围计算起来并不明显。

标签: pythontensorflowkerasdeep-learningneural-network

解决方案


听起来您对所谓的神经网络验证大致感兴趣。该领域广泛地包括回答以下问题:给定一系列可能的输入,具有给定权重的神经网络的可能输出范围是多少?需要注意的几点:

  1. 神经网络本质上是一个复杂的非线性函数。也就是说,它将输入空间映射到输出空间。除了输入范围之外,定义输出范围没有任何意义。在您的问题中,您没有提及输入,因此您的示例有缺陷/不完整。

  2. 一般来说,神经网络验证是一个新兴领域,大多数发表的作品都是最近的(过去 5-7 年)。话虽如此,对于具有各种激活函数的全连接网络,有精确和近似的方法。我将在这里列出一些这样的方法:

https://arxiv.org/abs/2004.05519 - MATLAB 工具箱,但您可以以 ONNX 格式导出神经网络,然后使用 MATLAB 进行验证/输出范围分析。

https://arxiv.org/abs/1804.10829 - 专门用于 ReLU 激活函数。

https://anwu1219.github.io/download/Marabou.pdf此处提供 python API:https ://github.com/NeuralNetworkVerification/Marabou

该领域仍在不断发展,因此在某些情况下,您可能不得不自己进行一些编码,而不是使用预先存在的库,但这些论文/用于神经网络验证的搜索查询至少应该让您对从哪里开始有了一些想法。


推荐阅读