首页 > 编程知识 正文

BP神经网络如何输出概率(概率神经网络)

时间:2023-05-06 08:43:27 阅读:96634 作者:1281

在本文中,我们将尝试创建一个定制的神经网络层,其中训练结果是概率分布函数,输出是置信度最高的值。

“神经网络是一个节点相互连接的计算系统,其工作原理与人脑中的神经元非常相似。”——SAS

神经元是密集系统中的节点,接收输入的数字,输出更多的数字。如果我们仔细观察一个密集的神经网络,就会发现神经元之间是相互连接的,如下图所示。

如果我们进一步放大,我们可以准确地看到每个神经元的功能。例如,一个神经元可以看作一个盒子,吃掉一个数字,抛出另一个计算机数字作为输出。

这种神经网络的局限性在于神经元只能输出特定的数字。而且每个数字都有一定的可信度。在物理学中可以找到一个很好的类比。的当前神经网络体系结构可以被视为具有特定结果的机械和物理过程,但是我们希望看到多个结果。例如,在量子力学中,概率波函数表示在特定点找到粒子的概率。这个概念可以在下图中看到。

我将尝试在下面构建的神经网络中模仿这个概念,让神经元输出一个概率函数,这个概率函数将输出神经元最有信心的值。

Tensorflow是一个用于构建自定义神经网络层的库。我们将在这个项目中使用它,并通过Keras API创建一个自定义层,它可以很容易地集成到我们选择的神经网络架构中。我把这一层称为概率分布函数神经网络。

我们可以使用以下结构在TensorFlow中构建一个神经网络:

PDNN级(tf.keras.layers.Layer):

def __init__(self,num_outputs):

.

def构建(自身,输入_形状):

.

def调用(自身,输入):

.这个python类有三个主要功能:

__init__,独立于输入执行所有初始化。

构建、处理输入张量的形状并完成初始化学工程的剩余部分。

呼叫,在此执行前向传播

波函数是复杂的。为了找到概率密度,我们需要找到波函数的平方模,这是我们想要在自定义层中模拟的行为。首先创建复值部分,然后求其平方模。

PDNN班(层层叠叠。层):

def __init__(self,num_outputs,PDFS):

超级(PDNN,自我)。__init__()

self.num_outputs=num_outputs

自我。PDFS=PDFS

def构建(自身,输入_形状):

self.w=self.add_weight(

形状=[自我。PDFS,自我编号_输出,1],

名称='w ',

可训练=真,

)

self.b=self.add_weight(

形状=[自我。PDFS,自我编号_输出,1],

名称='b ',

可训练=真,

)

self.m=self.add_weight(

形状=[1,自我。PDFS,自我编号_输出,1],

名称='m ',

可训练=真,

)

def调用(self,input_tensor):

pi=tf.constant(math.pi)

e=tf.constant(math.e)

space=tf.constant([value/10表示范围(1,1000)中的值],dtype=tf.float32)

space=TF . resform(space,[1,999])

space=tf.tile(space,[self.nu

m_outputs,1]) space = tf.reshape(space, [1,self.num_outputs,999]) space = tf.tile(space, [self.PDFS,1,1]) input_tensor = tf.reshape(input_tensor, [1,self.num_outputs]) input_tensor = tf.tile(input_tensor, [self.PDFS,1]) input_tensor = tf.reshape(input_tensor, [self.PDFS,self.num_outputs,1]) input_tensor = self.w*input_tensor+self.b pdf = tf.complex(tf.math.cos(input_tensor*space), tf.math.sin(input_tensor*space))pdf = tf.reshape(pdf, [1,self.PDFS,self.num_outputs,999]) pdf = pdf*tf.complex(self.m, self.m) pdf = tf.math.reduce_sum(pdf, axis=1, keepdims=True) pdf = tf.reshape(pdf, [1,self.num_outputs,999]) pdf = tf.abs(pdf) return pdf

我们可以用上面新创建的自定义层来构建网络。

inp = L.Input(shape=(7,)) x = PDNN(7, n_pdfs)(inp) x = L.Lambda(lambda x: tf.math.pow(x,2))(x) x = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(x) x = L.Flatten()(x) x = L.Dense(32, activation='relu')(x) y = PDNN(7, n_pdfs)(inp) y = L.Lambda(lambda x: tf.math.pow(x,2))(y) y = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(y) y = L.Flatten()(y) y = L.Dense(64, activation='relu')(y) z = PDNN(7, n_pdfs)(inp) z = L.Lambda(lambda x: tf.math.pow(x,2))(z) z = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(z) z = L.Flatten()(z) z = L.Dense(64, activation='relu')(z) w = PDNN(7, n_pdfs)(inp) w = L.Lambda(lambda x: tf.math.pow(x,2))(w) w = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(w) w = L.Flatten()(w) w = L.Dense(64, activation='relu')(w) m = PDNN(7, n_pdfs)(inp) m = L.Lambda(lambda x: tf.math.pow(x,2))(m) m = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(m) m = L.Flatten()(m) m = L.Dense(64, activation='relu')(m) n = PDNN(7, n_pdfs)(inp) n = L.Lambda(lambda x: tf.math.pow(x,2))(n) n = L.Lambda(lambda x: tf.math.top_k(x,k=5)[1]/10)(n) n = L.Flatten()(n) n = L.Dense(64, activation='relu')(n) x = L.concatenate([x,y,z,w, m, n]) x = L.Dense(64, activation='relu')(x) x = L.Dense(32, activation='relu')(x) out = L.Dense(1)(x) model = Model(inp, out) model.compile(optimizer=Adam(learning_rate=0.001), loss='mae')

我们的模型可视化如下

现在,让我们尝试在一个基本的时间序列数据集上训练我们的模型,并看看它与ARIMA等经典统计模型的比较情况。训练的完整代码在文章的最后部分提供。在测试结果之前,我们可以先看啊可能由PDNN层生成的波函数的峰值。

看起来不错!在100轮训练之后,该模型获得了12.07的RMSE得分。让我们来看看预测。

在使用ARIMA模型的RMSE为14.96!这意味着我们的模型在很大程度上优于经典模型。

PDNN层在提高神经网络性能方面似乎具有相当大的潜力,因为它可以同时考虑多种可能的结果,而不必选择一个特定的结果。与时间序列预测示例中的ARIMA模型相比,这个想法的实际结果要好很多。

PDNN代码:github/DavidIstrati/PDNN

本文训练代码:kaggle/davidistrati/pdnn-demo/notebook

作者:Istrati David

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。