目录
1.神经网络
1)神经网络的概述
2)神经网络的本质
3)向量化的解释
2.激活函数
1)sigmoid函数和tanh函数
2)ReLU函数(修正线性单元)和Leaky ReLU函数
3)神经网络的梯度下降法计算
3.代码中的前后向传播
1.神经网络
1)神经网络的概述
显而易见 ,神经网络分为三层。输入层,输入特征X(也可以用表示,能向下传递激活值,它是一个四维向量,python中表示为4*1的矩阵)。中间为隐藏层,“隐藏”就是输入到输出中的值,我们在训练中是看不见啊的。最后一层只带有一个节点,这个就是输出层,它负责输出并预测y帽的值(隐藏层维度举例(4,3)前面一个数表示隐藏层节点4,后面的数表示输入层特征3;输出层也有相关的向量维度(1,4)前者为输出层的节点数1,后者为隐藏层的节点数4)。
一般符号的约定是输入层不看作一个标准的层,只记隐藏层和输出层,因此上图的也称之为双层神经网络,第一层也指的是第一层的隐藏层。所以的右上角含义为第0层,即输入层。
2)神经网络的本质
这个图代表了回归计算的两个步骤,而神经网络的本质就是重复这些步骤很多次,所以神经网络的本质是为函数。下面附带如何在python代码中实现定义sigmoid函数:
def sigmoid(z):"""参数:z - 任何大小的标量或numpy数组。返回:s - sigmoid(z)"""s = 1 / (1 + np.exp(-z))return s
3)向量化的解释
图中右侧上部为单个样本实现向量化(实现正向传播)的四个公式,需从1到m遍历,下部为多个样本向量化实现的公式(在符号表示中,大写的为多样本的符号,小写为单样本符号)。推导
此图为的吴恩达老师的推导过程,上部的划掉以0作为特殊值方便理解。等号前中的一系列值还需要加上才是真正的值。
2.激活函数
1)sigmoid函数和tanh函数
sigmoid函数的图像在上面,tanh是下面的。但用老师的话tanh函数几乎在所有场合都比sigmoid函数更优越,例外是输出层(使得y帽的值介于0到1之间不是-1到1)和在制作二分类的时候 。
sigmoid函数的导数可以简化为:a'=a(1-a) tanh函数导数:a'=1-
两个函数的缺点:当z值很大或很小的时候,梯度值会接近于零(ReLU函数能很好解决这个问题)。
2)ReLU函数(修正线性单元)和Leaky ReLU函数
ReLU函数的公式为a=max(0,z) 在代码运行中z几乎很难达到0。当不确定隐层用什么函数是可以选择ReLU函数。
Leaky ReLU函数 :a=max(0.01z,z)
ReLU函数和Leaky ReLU函数可以使,在z=0处,令g'(z)为0.01或1(可以自己设置)
总而言之,当不知道用什么函数的时候,可以都试一试看哪个好。g(z)=z可以用于房地产价值预测
3.神经网络的梯度下降法计算
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