吴恩达深度学习_1_Week2神经网络的编程基础(1)

神经网络编程基础


1、向量化时间效益的比较
2、激活函数的生成
3、梯度输出
4、重塑矩阵/向量尺寸
5、规范化数据


第一门课:神经网络和深度学习
第二周:神经网络的编程基础

一、向量化时间效益的比较

在矩阵/向量运算中,使用np.dot(a,b)可以大大减少时间

# 神经网络的编程基础---向量化
import numpy as np
import time                    # 导入时间库

a = np.array([1, 2, 3, 4])     # 创建一个数组
print(a)
a = np.random.rand(1000000)
b = np.random.rand(1000000)    # 通过round随机得到两个一百万维度的数组
tic = time.time()              # 测量一下当前时间

# 向量化版本
c = np.dot(a,b)
toc = time.time()
print("向量化的版本时间:" + str(1000*(toc-tic)) + "ms")

# 非向量化版本
c = 0
tic = time.time()
for i in range(1000000):
    c+= a[i]*b[i]
toc = time.time()
print("循环版本时间:" + str(1000*(toc-tic)) + "ms")

二、激活函数的生成

比较math.exp(x)和np.exp(x)的不同,激活函数𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑥)=1/(1+𝑒−𝑥次方)
在这里插入图片描述

# 使用激活函数sigmoid(x),分别用math.exp()和np.exp()
import math
import numpy as np

# 用exp()表示指数函数,在"math"库下
def math_sigmoid(x):
    s = 1 / (math.exp(-x) + 1)
    return s
print(math_sigmoid(1))

# 在numpy下使用激活函数---由于深度学习中大多使用矩阵和向量,用math无法满足需求
# 在numpy下输出将会广播成与输入同样的尺寸
def np_sigmoid(y):
    w = 1 / (np.exp(-y) + 1)
    return w
y = np.array([1, 2, 3])
print(np_sigmoid(y))

三、梯度输出

在这里插入图片描述

# 𝑠𝑖𝑔𝑚𝑜𝑖𝑑_𝑑𝑒𝑟𝑖𝑣𝑎𝑡𝑖𝑣𝑒(𝑥)=𝜎′(𝑥)=𝜎(𝑥)(1−𝜎(𝑥))
import numpy as np

def sigmoid(x):
   s = 1/(np.exp(-x)+1)
   return s

def sigmoid_derivative(x):
    ds = sigmoid(x)*(1-sigmoid(x))
    return ds

x = np.array([1,2,3])
print(str(sigmoid_derivative(x)))

四、重塑矩阵/向量尺寸

在这里插入图片描述

# 使用np.shape()和np.reshape()
# X.shape 用来得到矩阵/向量X的尺寸;X.reshape用来重塑尺寸
# 例如:将v(a,b,c)重塑成v(a*b,c)---> v=v.reshape((v.shape[0]*v.shape[1],v.shape[2]))
import numpy as np

# task:将(length,height,3) 变成 (length*height*3 , 1)
def image2vector(image):
    v = image.reshape((image.shape[0] * image.shape[1] * image.shape[2], 1))   # 不要忘记双层括号
    return v
    
image = np.array(
    [[[0.67826139, 0.29380381],
      [0.90714982, 0.52835647],
      [0.4215251, 0.45017551]],
     [[0.92814219, 0.96677647],
      [0.85304703, 0.52351845],
      [0.19981397, 0.27417313]],
     [[0.60659855, 0.00533165],
      [0.10820313, 0.49978937],
      [0.34144279, 0.94630077]]])

print(str(image2vector(image)))

五、规范化数据

在这里插入图片描述

# 规范化数据,本例指归一化x -->𝑥/‖𝑥‖
import numpy as np

# 实现normalizeRows()以规范化矩阵的行,将此函数应用于输入矩阵 x 后,x 的每一行都应该是单位长度(即长度 1)的向量
def normalizeRows(x):
    x_norm = x / (np.linalg.norm(x, axis=1, keepdims=True))     # 计算每一行的长度,得到一个列向量
    return x_norm

x = np.array([[0, 3, 4], [1, 6, 4]])
print(str(normalizeRows(x)))

六、python中的广播

在这里插入图片描述

# 使用numpy实现softmax函数-需要对两个或多个类进行分类时使用的规范化函数
import numpy as np

def softmax(x):
    # 对矩阵的每一元素指数化成softmax所需形式x_exp
    x_exp = np.exp(x)
    # 创造一个x_sum,对于每一行的x_exp使用求和np.sum(...,axis=1,keepdims=True)
    x_sum = np.sum(x_exp,axis=1,keepdims=True)
    # 通过x_exp除以x_sum,计算出softmax(x)
    s = x_exp/x_sum
    return s

x = np.array([[9,2,5,0,0],[7,5,0,0,0]])
print(str(softmax(x)))

七、损失函数

在这里插入图片描述

# 损失函数用于评估模型的性能,在深度学习中,可以使用梯度下降等优化算法来训练模型并最大限度地降低成本
import numpy as np

# 𝐿1(𝑦̂ ,𝑦)=∑|𝑦(𝑖)−𝑦̂ (𝑖)| ,使用abs()绝对值
def L1(yhat, y):
    loss = np.sum(np.abs(y - yhat))
    return loss

yhat = np.array([0.9, 0.2, 0.1, 0.4, 0.9])
y = np.array([1, 0, 0, 1, 1])
print(L1(yhat, y))

# 𝐿2(𝑦̂ ,𝑦)=∑(𝑦(𝑖)−𝑦̂ (𝑖))2 ,使用power(x,y)---计算x的y次方
def L2(yhat,y):
    loss = np.sum(np.power((y-yhat),2))
    return loss

print(str(L2(yhat,y)))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值