吴恩达深度学习(一)之神经网络和深度学习

第一周 深度学习概论

结构化与非结构化数据

结构化数据: 结构化数据意味着数据的基本数据库,即x(特征)和y都有一个很好的定义
非结构化数据: 比如音频,原始音频或者你想要识别的图像或文本中的内容。这里的特征可能是图像中的像素值或文本中的单个单词。(特征没有明确的定义)

深度学习快速发展的三大原因

1.更快的计算能力
2.更多的数据
3.更好的算法

联系方式

Contact us: feedback@deeplearning.ai

Companies: enterprise@deeplearning.ai

Universities: academic@deeplearning.ai

第二周 神经网络基础

神经网络矩阵设计准则

𝑥:表示一个𝑛𝑥维数据,为输入数据,维度为(𝑛𝑥, 1);
w:表示一个𝑛𝑥维数据,为参数数据,维度为(𝑛𝑥, 1)
𝑦:表示输出结果,取值为(0,1);
(𝑥(𝑖), 𝑦(𝑖)):表示第𝑖组数据,可能是训练数据,也可能是测试数据,此处默认为训练数
据;
𝑋 = [𝑥(1), 𝑥(2), . . . , 𝑥(𝑚)]:表示所有的训练数据集的输入值,放在一个 𝑛𝑥 × 𝑚的矩阵中,其中𝑚表示样本数目;
𝑌 = [𝑦(1), 𝑦(2), . . . , 𝑦(𝑚)]:对应表示所有训练数据集的输出值,维度为1 × 𝑚。
在这里插入图片描述

逻辑回归

定义法则

该课程用右侧定义法则,不用左侧的
在这里插入图片描述

代价函数

在这里插入图片描述

梯度下降运作机制

在这里插入图片描述
最低点左边的斜率<0,右边>0,注意自动迭代到最低点后就会停止迭代。红色部分代表代码中的表示准则

利用计算图计算逻辑回归的梯度下降

注意:计算图中的前向传播与反向传播都需要一步一步来,其实反向传播就是求导的链式法则
公式回顾:
在这里插入图片描述
a = σ ( z ) = 1 1 + e − z a = \sigma (z) = \frac{1}{ {1 + {e^{ - z}}}} a=σ(z)=1+ez1
∂ σ ( z ) ∂ z = − ( − e ( − z ) ) ( 1 + e − z ) 2 = 1 1 + e − z × e ( − z ) 1 + e − z = a × ( 1 − a ) \frac{ {\partial \sigma (z)}}{ {\partial z}} = - \frac{ {( - {e^{( - z)}})}}{ { { {(1 + {e^{ - z}})}^2}}} = \frac{1}{ {1 + {e^{ - z}}}} \times \frac{ { {e^{( - z)}}}}{ {1 + {e^{ - z}}}} = a \times (1 - a) zσ(z)=(1+ez)2(e(z))=1+ez1×1+eze(z)=a×(1a)

单个训练样本

在这里插入图片描述

多个训练样本
非向量化(循环,能用向量就不用)

在这里插入图片描述

在这里插入图片描述
两重循环,第一重遍历每个输入(1:m),第二层,在每个输入中,都要更新所有参数的dw1,…,dwn,db(1:nx+1)

向量化(要远快于循环)

对比上文的循环
#迭代一千次
#维度说明:dw,db,Y,A,Z,W:(nx,1),X:(x(1),…,x(m)),
x(i) :(nx,1)

for iterator in range(1000):
𝑍 = 𝑤T𝑋 + 𝑏 = 𝑛𝑝. 𝑑𝑜𝑡(𝑤. 𝑇, 𝑋) + 𝑏
𝐴 = 𝜎(𝑍)
𝑑𝑍 = 𝐴 − 𝑌
𝑑𝑤 =1/𝑚∗ 𝑋 ∗ 𝑑z𝑇
𝑑𝑏 =1/𝑚∗ 𝑛𝑝. 𝑠𝑢𝑚(𝑑𝑍)
𝑤: = 𝑤 − 𝑎 ∗ 𝑑𝑤
𝑏: = 𝑏 − 𝑎 ∗ 𝑑b

Python/Numpy 广播机制

(1,n)复制m次,(m,1)复制n次
在这里插入图片描述

在这里插入图片描述

Python/Numpy 矩阵创建与维度验证准则

在这里插入图片描述
注意:第一种是完全错误的,永远不要用,因为它在python 中的维度是(5,),这种绝对不能用,因为可能会发生未知错误,第二种,第三种是可以用的,可以用assert检验维度,发现维度错误,可以多多使用reshape(o(1),非常快)

代码

参考的dalao.
注意,图片要归一化
结果中存在一定的过拟合现象,要加入正则化,以后再说

import numpy as np
import matplotlib.pyplot as plt
from lr_utils import load_dataset

#数据准备
train_set_x,train_set_y,test_set_x,test_set_y,classes=load_dataset()
#查看数据维度
print(train_set_x.shape)
print(train_set_y.shape)
print(test_set_x.shape)
print(test_set_y.shape)
#看一个小猫
plt.imshow(test_set_x_orig[2])
plt.show()
#将输入和标签设置成为你需要的输入维度,这两句一个意思
train_set_x=train_set_x.reshape(train_set_x.shape[0],-1).T
test_set_x=test_set_x.reshape(test_set_x.shape[0],test_set_x.shape[1]*test_set_x.shape[2]*test_set_x.shape[3]).T
print(train_set_x.shape)
print(test_set_x.shape)
#归一化
train_set_x=train_set_x/255
test_set_x=test_set_x/255

#sigmoid
def sigmoid(z):
    return 1/(1+np.exp(-z))

#逻辑回归传播算法(一次迭代)
def propagate(X,Y,W,b):    
    #前向传播
    m=X.shape[1]
    A=sigmoid(np.dot(W.T,X)+b)#(1,12288)*(12288,209)->(1,209)  
    #代价函数
    cost=(-1/m)*np.sum(np.multiply(Y,np.log(A))+np.multiply((1-Y),np.log(1-A)))
    cost = np.squeeze(cost)
    #反向传播
    dz=A-Y
    dw=(1/m)*np.dot(X,dz.T)#(12288,209)*(209,1)
    db=(1/m)*np.sum(dz)    
    return dw,db,cost 

#梯度下降
def Gradient_descent(X,Y,W,b,iteration,learning_rate):
    costs=[]
    for i in range(iteration):
        dw,db,cost=propagate(X,Y,W,b)
        W=W-learning_rate*dw
        b=b-learning_rate*db
        if i%100==0:
            print("迭代{0}次,代价函数为{1}".format(i,cost))
            costs.append(cost)
    return W,b,costs    

#预测结果
def prediction():
#初始化参数都为0
    W=np.zeros((train_set_x.shape[0],1))#(12288,1)
    b=0 
    W,b,costs=Gradient_descent(train_set_x,train_set_y,W,b,2000,0.005)
    
    #展示代价变化
    fig,ax=plt.subplots(figsize=(12,8))
    ax.plot(np.arange(20), costs, 'r')
    ax.set_xlabel("iteration(per hundred)")
    ax.set_ylabel("cost")
    plt.show()
    
    #预测模型
    predict_train_y=np.zeros_like(train_set_y)
    predict_test_y=np.zeros_like(test_set_y)
    A_train=sigmoid(np.dot(W.T,train_set_x)+b)
    A_test=sigmoid(np.dot(W.T,test_set_x)+b)
    
    for i in range(train_set_x.shape[1]):
        predict_train_y[0,i]=1 if A_train[0,i]>0.5 else 0
    for i in range(test_set_x.shape[1]):
        predict_test_y[0,i]=1 if A_test[0,i]>0.5 else 0
    
    #打印训练集与测试集准确率
    print('训练集识别准确率:{0}%'.format(100-np.mean(abs(train_set_y-predict_train_y))*100))
    print('测试集识别准确率:{0}%'.format(100-np.mean(abs(test_set_y-predict_test_y))*100)) 

prediction()       

第三周 浅层神经网络

神经网络的表示

在这里插入图片描述
注意:这是一个两层神经网络,因为输入层不算(规定)

神经网络前向传播的输出

单个样本输入

注意
1.w[1],…,w[4]的维度都是(3,1),b就是ML中的那个偏执单元
2.对于w,可以理解为每一行有与输入相同数量(3个)的参数,如对于w[1][1] 便代表了w11,w21,w31因为输出有4个,所有共有4行

在这里插入图片描述
在这里插入图片描述

多样本输入

注意:
1.横向是训练样本,纵向是隐藏单元
2.z[1](i) 代表了第i个输入样本下的第一个隐藏层(未激活),so on…

在这里插入图片描述

激活函数

种类

在这里插入图片描述
规则:
1.默认选择Relu
2.sigmoid只用于二分类的输出层
3.不同的层次可以选择不同的非线性激活函数

激活函数对应的导数

1.sigmoid:
a = σ ( z ) = 1 1 + e − z a = \sigma (z) = \frac{1}{ {1 + {e^{ - z}}}} a=σ(z)=1+ez1
∂ σ ( z ) ∂ z = − ( − e ( − z ) ) ( 1 + e − z ) 2 = 1 1 + e − z × e ( − z ) 1 + e − z = a × ( 1 − a ) \frac{ {\partial \sigma (z)}}{ {\partial z}} = - \frac{ {( - {e^{( - z)}})}}{ { { {(1 + {e^{ - z}})}^2}}} = \frac{1}{ {1 + {e^{ - z}}}} \times \frac{ { {e^{( - z)}}}}{ {1 + {e^{ - z}}}} = a \times (1 - a) zσ(z)=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值