IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 神经网络中的概率分布函数 -> 正文阅读

[人工智能]神经网络中的概率分布函数

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

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

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

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

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

我将尝试在下面构建的神经网络中模仿这个概念,允许神经元输出一个概率函数,该函数将输出神经元最置信度最高的值。

Tensorflow 是用于构建自定义神经网络层的库,我们将在本项目中使用它并通过 Keras API 创建一个自定义层,该层可以轻松集成到我们选择的神经网络架构中。 我将这一层称为 probability distribution function neural network(概率分布函数神经网络)。

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

class PDNN(tf.keras.layers.Layer):
  def __init__(self, num_outputs):
    ...
  def build(self, input_shape):
    ...
  def call(self, inputs):
    ...

该python类具有三个主要函数:

__init__ ,进行所有与输入无关的初始

build,处理输入张量的形状并完成其余的初始化工

call,在那里进行前向传播

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

class PDNN(layers.Layer):
    def __init__(self, num_outputs, PDFS):
        super(PDNN, self).__init__()
        self.num_outputs = num_outputs
        self.PDFS = PDFS
    def build(self, input_shape):
        self.w = self.add_weight(
            shape=[self.PDFS,self.num_outputs,1],
            name="w",
            trainable=True,
        )
        self.b = self.add_weight(
            shape=[self.PDFS,self.num_outputs,1],
            name="b",
            trainable=True,
        )
        self.m = self.add_weight(
            shape=[1,self.PDFS,self.num_outputs,1],
            name="m",
            trainable=True,
        )
    def call(self, input_tensor):   
        pi = tf.constant(math.pi)
        e = tf.constant(math.e)

        space = tf.constant([value/10 for value in range(1,1000 )], dtype=tf.float32)
        space = tf.reshape(space, [1,999])
        space = tf.tile(space, [self.num_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代码:https://github.com/DavidIstrati/PDNN

本文训练代码:https://www.kaggle.com/davidistrati/pdnn-demo/notebook

作者:Istrati David

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:42:26  更:2021-11-11 12:43:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:31:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码