从零开始学人工智能(3)--Python · 神经网络(二)· 层

感谢关注天善智能,走好数据之路↑↑↑

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。


作者:射命丸咲 Python 与 机器学习 爱好者

知乎专栏:https://zhuanlan.zhihu.com/carefree0910-pym

最终成品的 GitHub 地址:https://github.com/carefree0910/MachineLearning/tree/master/NN

本章用到的 GitHub 地址:https://github.com/carefree0910/MachineLearning/blob/master/Zhihu/NN/Layers.py


这一章主要讲核心结构 层(Layer)的实现

那么思想我们都有了,关键就是怎么把它翻译成代码。为使观众老爷们不会一步迈得太大,我们先不考虑和卷积神经网络(CNN)以及各种附加层(Dropout、Normalize 等)的兼容问题、而只考虑普通的神经网络。

我们上一章说了、我们关键要把所有层的爸爸定义好,所以我们要先考虑一个层的基本功能应该有哪些:

形状。这个挺直观,因为为了能够和上一层与下一层水乳交融(喂),层与层之间的形状要彼此契合(喂喂喂)

没了。

确实如果只用实现最简单的神经网络的话,定义一个形状足矣。所以代码也很清晰了:

class Layer(metaclass=ABCMeta):

def__init__(self,shape):

self.shape=shape

接下来就可以直接实现 Duang 的部分了!鼓掌!!(喂

def activate(self,x,w,bias):

returnself._activate(tf.matmul(x,w)+bias)

这里面涉及许多东西,我们一个个来看它们的数学内涵(至于数学内涵是什么意思以及为什么要这么做请参见这篇文章:https://zhuanlan.zhihu.com/p/24482386):

w:上一层与当前层之间的权重

bias:当前层的偏置量

tf.matmul:这里面 tf 是 tensorflow 的缩写(今后同理),matmul 是“矩阵乘法”的意思。也就是说,这个函数相当于做了个矩阵乘法 并返回其结果

细心的观众老爷可能会注意到这里面藏了一个叫 self._activate 的函数;事实上,这正是 Duang 的核心所在,我们来看看它在爸爸里面是怎么定义的:

@abstractmethoddef_activate(self,x):

pass

和你想的一样吗?

注意我前面说过,爸爸是不干活的,只有他生的孩儿才干活;所以爸爸理应将这个 Duang 的部分交给他孩儿自己去 Duang

可以说到这为止,一个最简单的爸爸就定义完了。我们最后让他生一个儿子看看:

class Sigmoid(Layer):

def_activate(self,x,predict):

returntf.nn.sigmoid(x)

tf.nn.sigmoid 是 tensorflow 自带的 Sigmoid 激活函数。相当方便不是吗科科科!

不过可能有比较厉害的观众老爷会发现:你这个东西不是没定义梯度下降的过程吗!没错,这正是 tensorflow 的厉害之处,它会帮你处理所有梯度下降相关的问题。

有些观众老爷可能会有所不满……没关系!!为了让每个观众老爷都满意,我自己写了一套完整的梯度下降算法,包括各种 Optimizers 像 Adams 啊 RMSProp 啊之类的都有!

不过那个就是比较深的内容了,大概会作为附加章节给出……毕竟是自己实现的,比 cpu 版的 tensorflow 要慢两三倍,比 gpu 版的……咳咳咳……

以上,大概讲述了如何最简洁快速地定义 层(Layer)这个类;接下来我们会定义一个最简单的 神经网络(NN)类、也就是上一章说的框架来封装这个 Layer 类、并看看我们的初步结果如何

希望观众老爷们能喜欢~

你可能感兴趣的:(从零开始学人工智能(3)--Python · 神经网络(二)· 层)