首页 > 编程 > Python > 正文

纯用NumPy实现神经网络的示例代码

2020-02-15 23:21:23
字体:
来源:转载
供稿:网友

摘要: 纯NumPy代码从头实现简单的神经网络。

Keras、TensorFlow以及PyTorch都是高级别的深度学习框架,可用于快速构建复杂模型。前不久,我曾写过一篇文章,对神经网络是如何工作的进行了简单的讲解。该文章侧重于对神经网络中运用到的数学理论知识进行详解。本文将利用NumPy实现简单的神经网络,在实战中对其进行深层次剖析。最后,我们会利用分类问题对模型进行测试,并与Keras所构建的神经网络模型进行性能的比较。

Note:源码可在我的GitHub中查看。

在正式开始之前,需要先对所做实验进行构思。我们想要编写一个程序,使其能够创建一个具有指定架构(层的数量、大小以及激活函数)的神经网络,如图一所示。总之,我们需要预先对网络进行训练,然后利用它进行预测。

上图展示了神经网络在被训练时的工作流程。从中我们可以清楚的需要更新的参数数量以及单次迭代的不同状态。构建并管理正确的数据架构是其中最困难的一环。由于时间限制,图中所示的参数不会一一详解,有兴趣可点击此处进行了解。

神经网络层的初始化

首先,对每一层的权重矩阵W及偏置向量b进行初始化。在上图中,上标[l]表示目前是第几层(从1开始),n的值表示一层中的神经元数量。描述神经网络架构的信息类似于Snippet 1中所列内容。每一项都描述了单层神经网络的基本参数:input_dim,即输入层神经元维度;output_dim,即输出层神经元维度;activation,即使用的激活函数。

nn_architecture = [  {"input_dim": 2, "output_dim": 4, "activation": "relu"},  {"input_dim": 4, "output_dim": 6, "activation": "relu"},  {"input_dim": 6, "output_dim": 6, "activation": "relu"},  {"input_dim": 6, "output_dim": 4, "activation": "relu"},  {"input_dim": 4, "output_dim": 1, "activation": "sigmoid"},]

Snippet 1.

从Snippet 1可看出,每一层输出神经元的维度等于下一层的输入维度。对权重矩阵W及偏置向量b进行初始化的代码如下:

def init_layers(nn_architecture, seed = 99):  np.random.seed(seed)  number_of_layers = len(nn_architecture)  params_values = {}  for idx, layer in enumerate(nn_architecture):    layer_idx = idx + 1    layer_input_size = layer["input_dim"]    layer_output_size = layer["output_dim"]    params_values['W' + str(layer_idx)] = np.random.randn(      layer_output_size, layer_input_size) * 0.1    params_values['b' + str(layer_idx)] = np.random.randn(      layer_output_size, 1) * 0.1  return params_values            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表