(这里是最终成品的 GitHub 地址)

(这里是本章用到的 GitHub 地址)

推荐先修章节:Python · 神经网络(二*)· 层

Python · 神经网络(三)· 网络

由于分形这个东西是在 tensorflow 的基础上实现的且相当麻烦、所以我就没在我自己的结构里面实现分形。因此,我自己实现的网络中只有一个类,某种意义上也好看一些

在讲网络的实现之前,需要先提到的是:正如我们在上一章 (二*)最后提到的、Layer 是需要分成主层(Layer)和附加层(SubLayer)两种的。那么 SubLayer 是干嘛的呢?它可以在 Layer 的输出的基础上进行一些变换以得到更好的输出

典型的 SubLayer 有 Dropout 和 Normalize。它们的定义和功效我以后有时间的话会讲,现在我们只需要有这样一个感觉:SubLayer 通常可以优化 Layer 的输出;SubLayer 之间及 SubLayer 和其根 Layer(定义下面会说)之间的关联不应是可更新的关联(因为 SubLayer 更应该是一个“优化器”而不应是一个传统意义上的神经网络中的可更新的层)

那么 SubLayer 和 Layer 之间的结构关系就比较清楚了。具体而言,有:SubLayer 是附加在 Layer 后面的

一个 Layer 和若干 SubLayer 共同组成一个整体

SubLayer 会有一个域记录其附加的对象(爸爸)

SubLayer 会有一个域记录其根 Layer(定义为最老的爸爸)(……)

Layer 会有一个域记录附加在其后的第一个 SubLayer (孩子)

Layer 会有一个域记录其最年轻的孩子,不妨把它称为最后之作(喂!)

这样说可能有点太抽象(是肯!定!太!抽!象!好!吧!),我们画张图来看:

(嗯。好丑。)

知道 Layer 和 SubLayer 之间的大概关系后、就可以着手实现网络了(目前为止我们的 SubLayer 只有 CostLayer 一种,所以下面代码实现里面没有出现 SubLayer)。思路和 tensorflow 版本的差不多、亦即要先实现两个功能:加入 Layer 与 Layer 之间的关联

加入 Layer 本身

其中加入关联这一步要比 tensorflow 版本的要简单很多:

def _add_weight(self, shape):

self._weights.append(np.random.randn(*shape))

self._bias.append(np.zeros((1, shape[1])))

加入 Layer 本身这一步则几乎一模一样:

def add(self, layer):

if not self._layers:

self._layers, self._current_dimension = [layer], layer.shape[1]

self._add_weight(layer.shape)

else:

_next = layer.shape[0]

layer.shape = (self._current_dimension, _next)

self._add_layer(layer, self._current_dimension, _next)

唯一的区别在于在加入第二个 Layer 或者之后的 Layer 时,最后调用了一个 _add_layer 方法。这个方法能够协调 Layer 和 SubLayer 之间的关系,是我们搭建网络结构的关键所在:

def _add_layer(self, layer, *args):

_parent = self._layers[-1]

_current, _next = args

self._layers.append(layer)

if isinstance(layer, CostLayer):

_parent.child = layer

self.parent = _parent

self._add_weight((1, 1))

self._current_dimension = _next

else:

self._add_weight((_current, _next))

self._current_dimension = _next

这里可能需要进行一些说明:当 layer 不是 CostLayer 时,做的事(else 块里的东西)和 tensorflow 版本的一样

当 layer 是 CostLayer 时,我们只需在我们存储权重和偏置量的列表中放一个占位符、同时要更新一下父子关系(……)

以上就是与Python · 神经网络(三)· 层对应的、用纯 Numpy 写的结构。虽然代码很简单,不过涉及到的概念、理念可能有些太多,我们来整理一下:网络中有两种层:Layer 和 SubLayer。其中 Layer 是传统意义的 Layer, BP 算法更新层之间的关联时只会更新 Layer 之间的关联

SubLayer 是一种“优化器”,它能优化从 Layer那里得到的输出。它会在前向传导算法中用到、但在 BP 算法中、它会有三种行为:SubLayer 之间的关联以及 SubLayer 和根 Layer 之间的关联不会被更新、因为它们只是占位符

SubLayer 作为优化器本身可能会有一些参数,这些参数可能会被 BP 算法更新、但影响域仅在该 SubLayer 内部(Normalize 是一个很好的栗子)

Layer 之间的关联的更新是通过更新最后之作和下一层 Layer 之间关联完成的:

(……捂脸)

最常见的两种 SubLayer 就是 Dropout 和 Normalize(Batch Normalization)了,如果想要知道怎么将它们加入我们的网络的话、知道这些理念是必要的。事实上,在这个框架搭建完成后,我们完全可以尝试使用诸如 Dropout + Normalize + Dropout 这样的结构会发生什么(虽然它可能非常不合理、但至少能去尝试)。而由于算法是用 Numpy 写的,我们甚至可以随便自定义 SubLayer 并尝试它和其它 SubLayer 的组合效果。这可能对一部分观众老爷比较有用 ( σ'ω')σ

如果弄懂了 Layer 和 SubLayer 之间的关系、加上已经支持的(比较简单的)自定义激活函数的话,可能就能初步应用它来扩展出属于自己的比较复杂的神经网络模型了。如果再能够理解这篇文章里介绍的 Optimizers 的思想,我们就能自定义梯度下降算法、从而就可以对神经网络进行相当大的变装了

希望观众老爷们能够喜欢~

python神经网络作用_Python · 神经网络(三*)· 网络相关推荐

  1. python 神经网络工具_python神经网络工具箱

    盘点·GitHub最著名的20个Python机器学习项目 我们分析了GitHub上的前20名Python机器学习项目,发现scikit-Learn,PyLearn2和NuPic是贡献最积极的项目.让我 ...

  2. 神经网络python识别词语_Python 神经网络是这样识别手写字符哒?

    当谷歌的 AlphaGo 战胜了人类顶级棋手,人工智能开始更多进入大众视野.而谷歌 AI 教父认为:"AlphaGo 有直觉神经网络已接近大脑". 千百年来,人类试图了解智能的机制 ...

  3. python对编写神经网络作用_神经网络(BP)算法Python实现及应用

    本文实例为大家分享了Python实现神经网络算法及应用的具体代码,供大家参考,具体内容如下 首先用Python实现简单地神经网络算法: import numpy as np # 定义tanh函数 de ...

  4. python的神经网络编程_Python神经网络编程 第二章 使用Python进行DIY

    使用神经网络识别手写数字: import numpy # scipy.special for the sigmoid function expit(),即S函数 import scipy.specia ...

  5. python调试神器_Python里三个最高逼格的调试神器

    调试是开发过程中不可避免的一个环节,在Python中我们使用print.logging.assert等方法进行调试既简单又实用,但毕竟有其局限性.今天这篇文章为大家带来三个工具,其中有Python的内 ...

  6. python 格式化字符串_Python字符串三种格式化输出

    字符串格式化输出是python非常重要的基础语法,今天就把三种格式化输出做一个简单的总结,希望对大家有帮助. 格式化输出:内容按照一定格式要求进行输出. 1.使用占位符%输出 python2.6版本之 ...

  7. python property作用_python中@property的作用和getter setter的解释

    @property作用: python的@property是python的一种装饰器,是用来修饰方法的. 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同 ...

  8. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...

    一. CMDB后台管理 CMDB管理主要分为采集资产.API接口.后台管理.这里主要介绍CMDB后台管理. - 采集资产 - API - 后台管理- 资产列表- 业务线列表- 用户列表- 组列表... ...

  9. python面向对象思路_Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

最新文章

  1. LabVIEW色彩分类识别(基础篇—15)
  2. cornerHarris函数
  3. 一段话系列-领域模型是什么?
  4. 让人迷糊的 socket udp 连接问题
  5. Centos7中安装python3.7、pip3以及pipenv(亲测有效)
  6. 【学习笔记】第二章——信号量机制 用信号量实现互斥、同步
  7. python标签控件是_Python 图形用户界面编程
  8. solr学习篇(三) solr7.4 连接MySQL数据库
  9. 【转】oracle order by 处理NULL 值
  10. 黑客帝国代码雨(bat)
  11. lottie android 卡顿,lottie动画设计_免异常总结
  12. cad批量打印_CAD不懂批量打印的进来 详细讲解一下
  13. 安卓6.0获取相机权限
  14. 一元二次方程共轭复根c语言,共轭复根怎么求(共轭虚根α和β怎么求)
  15. 列宽一字符等于多少厘米_【excle列宽等于】excel里面的列宽和行高单位是多少?多少等于1厘米?怎么对比的?...
  16. 怎样用ipad录制游戏视频?ipad如何录制视频?
  17. CAPICAPICOM的一些知识[转]
  18. php的left join,Left Join
  19. 彻底搞懂递归的时间复杂度
  20. java编程惯用法_java惯用法转载

热门文章

  1. win7优化设置_5项优化,至少提升20%!
  2. Java script生成apk_lua脚本实现自动生成APK包
  3. angular 权限 php,PHP,Angular,HTACCESS-仅允许来自源域的请求
  4. EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?
  5. ICDAR 2019论文:自然场景文字定位技术详解
  6. 客户端自动化测试研究
  7. 会议交流|大模型与图学习等知识图谱相关技术实践探索
  8. 论文浅尝 | 基于神经网络的推理(DeepMind Relational Reasoning)
  9. 论文浅尝 | 基于神经网络的实体识别和关系抽取联合学习
  10. 一文盘点PaddlePaddle官方九大自然语言处理模型