当前位置: 代码迷 >> 综合 >> 【吴恩达Deep Learning】初学者学习记录2(神经网络/前后向传播)
  详细解决方案

【吴恩达Deep Learning】初学者学习记录2(神经网络/前后向传播)

热度:10   发布时间:2023-12-05 17:57:25.0

 

目录

1.神经网络

1)神经网络的概述

2)神经网络的本质 

3)向量化的解释

 2.激活函数

1)sigmoid函数和tanh函数

2)ReLU函数(修正线性单元)和Leaky ReLU函数

3)神经网络的梯度下降法计算

3.代码中的前后向传播


1.神经网络

1)神经网络的概述

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_15,color_FFFFFF,t_70,g_se,x_16

显而易见 ,神经网络分为三层。输入层,输入特征X(也可以用表示,能向下传递激活值,它是一个四维向量,python中表示为4*1的矩阵)。中间为隐藏层,“隐藏”就是输入到输出中的值,我们在训练中是看不见啊的。最后一层只带有一个节点,这个就是输出层,它负责输出并预测y帽的值(隐藏层维度举例(4,3)前面一个数表示隐藏层节点4,后面的数表示输入层特征3;输出层也有相关的向量维度(1,4)前者为输出层的节点数1,后者为隐藏层的节点数4)。

一般符号的约定是输入层不看作一个标准的层,只记隐藏层和输出层,因此上图的也称之为双层神经网络,第一层也指的是第一层的隐藏层。所以的右上角含义为第0层,即输入层。

2)神经网络的本质 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

这个图代表了回归计算的两个步骤,而神经网络的本质就是重复这些步骤很多次,所以神经网络的本质是为函数。下面附带如何在python代码中实现定义sigmoid函数:

def sigmoid(z):"""参数:z  - 任何大小的标量或numpy数组。返回:s  -  sigmoid(z)"""s = 1 / (1 + np.exp(-z))return s

3)向量化的解释

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

 图中右侧上部为单个样本实现向量化(实现正向传播)的四个公式,需从1到m遍历,下部为多个样本向量化实现的公式(在符号表示中,大写的为多样本的符号,小写为单样本符号)。gif.latex?%5Cinline%20a%5E%7B%5B1%5D%7D%3Dz%5E%7B%5B1%5D%7D%3Dw%5E%7B%5B1%5D%7Dx+b%5E%7B%5B1%5D%7D推导gif.latex?%5Cinline%20a%5E%7B%5B2%5D%7D%3Dw%27x+bgif.latex?%5Cinline%20a%5E%7B%5B2%5D%7D%3Dw%5E%7B%5B2%5D%7D%28w%5E%7B%5B1%5D%7Dx+b%5E%7B%5B1%5D%7D%29+b%5E%7B%5B2%5D%7D%3D%28w%5E%7B%5B2%5D%7Dw%5E%7B%5B1%5D%7D%29x+%28w%5E%7B%5B2%5D%7Db%5E%7B%5B1%5D%7D+b%5E%7B%5B2%5D%7D%29%3Dw%27x+b%27

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

此图为gif.latex?%5Cinline%20Z%5E%7B%5B1%5D%7D的吴恩达老师的推导过程,上部的gif.latex?%5Cinline%20b%5E%7B%5B1%5D%7D划掉以0作为特殊值方便理解。gif.latex?%5Cinline%20Z%5E%7B%5B1%5D%7D等号前中的gif.latex?%5Cinline%20z%5E%7B%5B1%5D%281%29%7D一系列值还需要加上gif.latex?%5Cinline%20b%5E%7B%5B1%5D%7D才是真正的值。

 2.激活函数

1)sigmoid函数和tanh函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

sigmoid函数的图像在上面,tanh是下面的。但用老师的话tanh函数几乎在所有场合都比sigmoid函数更优越,例外是输出层(使得y帽的值介于0到1之间不是-1到1)和在制作二分类的时候 。

sigmoid函数的导数可以简化为:a'=a(1-a)   tanh函数导数:a'=1-gif.latex?%5Cinline%20a%5E%7B2%7D

两个函数的缺点:当z值很大或很小的时候,梯度值会接近于零(ReLU函数能很好解决这个问题)。

2)ReLU函数(修正线性单元)和Leaky ReLU函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

ReLU函数的公式为a=max(0,z) 在代码运行中z几乎很难达到0。当不确定隐层用什么函数是可以选择ReLU函数。

Leaky ReLU函数 :a=max(0.01z,z)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

ReLU函数和Leaky ReLU函数可以使,在z=0处,令g'(z)为0.01或1(可以自己设置)

总而言之,当不知道用什么函数的时候,可以都试一试看哪个好。g(z)=z可以用于房地产价值预测

3.神经网络的梯度下降法计算

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWW9yeV9f,size_20,color_FFFFFF,t_70,g_se,x_16

a = np.random.randn(4,3)
b = np.sum(a, axis = 1,keepdims = True) 
b.shape = (4,1)

其中keepdims = True 的目的是使得b.shape =(4,1)而不是(4,) 

3.代码中的前后向传播

根据课堂中所教内容可以在代码中实现以下代码

前向传播:

def linear_forward(X,parameters):"""向前传播 + 激活:param X::param parameters::return A2::return A_cache: 缓存"""# 数据接收W1 = parameters["W1"] b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]# 向前传播并激活Z1 = np.dot(W1, X) + b1A1 = np.tanh(Z1)Z2 = np.dot(W2, A1) + b2A2 = sigmoid(Z2)A_cache = {"A1": A1,"A2": A2}return A2, A_cache

反向传播:

def linear_backward(parameters,A_cache,X,Y):"""向后传播,计算梯度:param parameters::param A_cache::param X::param Y::return grads: 字典 - dW1,db1,dW2,db2"""m = X.shape[1]W1 = parameters["W1"]W2 = parameters["W2"]A1 = A_cache["A1"]A2 = A_cache["A2"]dZ2 = A2 - YdW2 = (1 / m) * np.dot(dZ2, A1.T)db2 = (1 / m) * np.sum(dZ2, axis=1, keepdims=True)dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))dW1 = (1 / m) * np.dot(dZ1, X.T)db1 = (1 / m) * np.sum(dZ1, axis=1, keepdims=True)grads = {"dW1": dW1,"db1": db1,"dW2": dW2,"db2": db2}return grads

 

 

  相关解决方案