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

“神经网络是具有相互连接的节点的计算系统,其工作原理与人类大脑中的神经元非常相似。”——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_outputsself.PDFS = PDFSdef 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.bpdf = 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

神经网络中的概率分布函数相关推荐

  1. R中的概率分布函数及可视化

    R中拥有众多的概率函数,既有概率密度函数,也有概率分布函数,可以调用函数,也可以产生随机数,其使用规则如下所示: 其中前面字母为函数类型,含义如下: [dpqr]distribution_abbrev ...

  2. matlab常见分布的分布函数的命令,Matlab统计工具箱中各类概率分布函数使用方法介绍...

    本帖最后由 winner245 于 2013-4-24 22:47 编辑 1.      Matlab Statistics Toolbox 中概率分布函数介绍 Matlab Statistics T ...

  3. 梳理常见基本的概率分布函数及他们在机器学习中的作用

    在机器学习许多算法里面经常用到的一个建模技巧就是假定某个数据服从某个概率分布.每个概率分布都有一个概率分布函数,输入样本值概率分布函数输出当前这个样本属于某个类的概率.而任何概率分布函数都会存在未知参 ...

  4. TensorFlow 学习(九)—— 初始化函数(概率分布函数 api、常数生成函数)

    在 TensorFlow 中,一个变量的值在被使用之前,其初始化过程需要被明确地调用. 1. 随机数生成函数 tensorflow 下的概率分布函数,一般用于对变量进行初始化,这里的变量显然是指神经网 ...

  5. 神经网络中的注意力机制总结及PyTorch实战

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 0.概述 当神经网络来处理大量的输入信息时,也可以借助人脑的注意力机制,只选择一些关键 ...

  6. 神经网络中激活函数的真正意义?

    神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性?还有哪些属性是好的属性但不必要的? (1)非线性:即导数不是常数.这个条件是多层神经网络的基础,保证多层网络不退化成单层线性网络.这也 ...

  7. 【深度学习篇】--神经网络中的调优二,防止过拟合

    一.前述 上一篇讲述了神经网络中的调优实现,本文继续讲解. 二.L1,L2正则防止过拟合  使用L1和L2正则去限制神经网络连接的weights权重,限制更小 1.对于一层时可以定义如下: 一种方式去 ...

  8. softmax ce loss_神经网络中的蒸馏技术,从Softmax开始说起

    作者:Sayak Paul 编译:ronghuaiyang 导读 从各个层次给大家讲解模型的知识蒸馏的相关内容,并通过实际的代码给大家进行演示. 本报告讨论了非常厉害模型优化技术 -- 知识蒸馏,并给 ...

  9. 【深度学习】神经网络中的蒸馏技术,从Softmax开始说起

    作者:Sayak Paul      编译:ronghuaiyang 导读 从各个层次给大家讲解模型的知识蒸馏的相关内容,并通过实际的代码给大家进行演示. 本报告讨论了非常厉害模型优化技术 -- 知识 ...

最新文章

  1. arduino点阵声音频谱_基于Arduino和频谱分析的LED音乐课节拍器
  2. 入手一个windows ce系统的可以打电话的HPC,测试在上面发表博客
  3. UVA - 1415 Gauss Prime(高斯素数)
  4. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha
  5. mysql获取逻辑日志_Mysql 逻辑架构图及日志系统
  6. 【今日CV 计算机视觉论文速览 91期】Mon, 1 Apr 2019
  7. php7 memcached sasl,Mac安装memcached扩展支持sasl
  8. 几个交换问题的咨询?
  9. c++的set_unexpected不起作用
  10. 求解偏微分方程开源有限元软件deal.II学习--Step 37
  11. 中达优控触摸屏编程视频教程_YKBuilder(中达优控触摸屏编程软件)下载
  12. 【理论】RS-232、RS-485、RS-422通信接口标准介绍
  13. 入门软件测试--功能测试
  14. MT6797处理器怎么样?Helio X20处理器资料介绍
  15. git踩坑——中途才使用.gitignore文件
  16. GKFX捷凯金融外汇官网:gkfx-cn com 投资之父的15条投资法则
  17. 20189200余超 2018-2019-2 移动平台应用开发实践第十周作业
  18. DOS命令——calcs和icacls
  19. INT_MAX INT_MIN及其运算
  20. 如何添加51la代码及隐藏统计图标

热门文章

  1. fieldset标签及相关设置
  2. 流媒体基础知识TS流 PS流 ES流区别
  3. 几种outofmemory的解决方法
  4. 未来的计算机 展望未来作文,以展望未来为题的作文(精选4篇)
  5. k8s中创建pv和pvc
  6. swift3.0中@escaping 和 @noescape 的含义
  7. idea 快捷键 与 常用设置 与 插件
  8. 我爱你中国,我爱你中华民族
  9. Unity 3D入门简介
  10. 《Vim实用技巧(第2版)》——2.6 双剑合璧,天下无敌