是否存在可以预测大多数纯数学函数的激活函数?

问题描述 投票:0回答:1

我一直在尝试构建一个神经网络,它可以预测某些输入 x 的 1/x。

这里是模型总结:

Model: "sequential_9"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_20 (Dense)             (None, 1000)              2000    
_________________________________________________________________
dense_21 (Dense)             (None, 1000)              1001000   
_________________________________________________________________
dense_22 (Dense)             (None, 1)                 1001      

Total params: 1,004,001
Trainable params: 1,004,001
Non-trainable params: 0

我试过使用三个 Dense 层的 relu,但是损失太高了。我应该使用哪个激活函数。有可能吗?

代码如下:

import tensorflow as tf 
from tensorflow import keras
model = keras.Sequential(
    [
     keras.layers.Dense(1000, activation='relu', input_shape=(1,)),
     keras.layers.Dense(1000, activation='relu'),
     keras.layers.Dense(1, activation='relu')
    ]
)
import numpy as np 
n = 10000
x = np.linspace(1,n,n)
y = 1/x
model.compile(optimizer='Adam', loss="mse")
model.fit(x,y, epochs=500)
python keras deep-learning tensorflow2.0
1个回答
0
投票

具有一个隐藏层和 relu 激活的网络足以以您喜欢的任何精度对任何函数进行建模(通用逼近定理,例如,请参阅 Michael Nielsen 以获得简单描述)。

这意味着像 y(x)=1/x 这样的函数可以用如下所示的网络建模:

y=W*relu(V*x+a)+b
其中 x 是输入,V 和 W 是权重,a 和 b 是偏置项。

使用 relu 激活时,您的输出将由线段创建。 当然,使用足够多的这些线段,您可以创建任何函数的近乎完美的近似值。 给定隐藏层中的 3 个神经元,我们可以手工得出 1/x 的这个非常粗略的近似值:

y=1-relu(x/2-1/2)+relu(3*x/8-3/4)+relu(3*x/32-3/8)
。 从中应该很容易识别参数 V、W、a、b。 该近似值适用于从 1 到 8 的 x 范围,请参见图:

通常,您定义网络,然后使用损失函数和优化器对其进行训练,而不是像之前所示手动提出参数。作为损失函数,您可以使用绝对误差或平方误差并查看其性能。此外,在开始时从较小的 x 范围开始,例如从 1 到 8,看看在扩展该范围之前会得到什么。

© www.soinside.com 2019 - 2024. All rights reserved.