很多时候我们看到使用人工神经网络进行训练的问题都是一些分类问题,比如很有名的数字分类问题,其输入的是一个28*28像素的图片,但最终输出是一个数字。这类的问题对于我们来说是比较自然的,由多的原因得到一个结果。
但是最近我看到有一个葡萄酒的分类问题,讨论的问题的输入和输出的维度是相同的。这样的问题并不是没有,只是比较少,所以我认为值得讨论。不过在应用方面,存在一定的弊病:输入和输出的维度相同,使得它的应用范围存在一定的局限性,这是其一;其二,输入的内容信息量较大,输出的内容信息量也比较大,实质上我们并没有办法直观地了解输出的结果究竟怎么样,也无法直观地证明我们的训练结果是有效的,所以我们不得不再对输出的结果进行追加一步的处理。
数据集我会附在文章的后面,大家有兴趣可以自行下载。
接下来我们可以看看训练的过程。
一、随机指定种子
np.random.seed(1)
二、初始化参数
我们需要搭建一个人工神经网络,在此,我们使用的模型是:线性>>ReLU>>线性>>sigmod模型
def initialize_parameters_deep(layers_dims): """ 此函数是为了初始化多层网络参数而使用的函数。 参数: layers_dims - 包含我们网络中每个图层的节点数量的列表 返回: parameters - 包含参数“W1”,“b1”,...,“WL”,“bL”的字典: W1 - 权重矩阵,维度为(layers_dims [1],layers_dims [1-1]) bl - 偏向量,维度为(layers_dims [1],1) """ np.random.seed(3) parameters = {} L = len(layers_dims) for l in range(1,L): parameters["W" + str(l)] = np.random.randn(layers_dims[l], layers_dims[l - 1]) / np.sqrt(layers_dims[l - 1]) parameters["b" + str(l)] = np.zeros((layers_dims[l], 1)) #确保我要的数据的格式是正确的 assert(parameters["W" + str(l)].shape == (layers_dims[l], layers_dims[l-1])) assert(parameters["b" + str(l)].shape == (layers_dims[l], 1)) return parameters
三、向前传播的线性部分
def linear_forward(A,W,b): """ 实现前向传播的线性部分。 参数: A - 来自上一层(或输入数据)的激活,维度为(上一层的节点数量,示例的数量) W - 权重矩阵,numpy数组,维度为(当前图层的节点数量,前一图层的节点数量) b - 偏向量,numpy向量,维度为(当前图层节点数量,1) 返回: Z - 激活功能的输入,也称为预激活参数 cache - 一个包含“A”,“W”和“b”的字典,存储这些变量以有效地计算后向传递 """ Z = np.dot(W,A) + b assert(Z.shape == (W.shape[0],A.shape[1])) cache = (A,W,b) return Z,cache
四、向前传播的线性激活函数
def linear_activation_forward(A_prev,W,b,activation):
"""
实现LINEAR-> ACTIVATI