deeplearning 课后作业(课程一第二周作业1)

2019-09-24  本文已影响0人  此间不留白

1. Python和Numpy编程基础

deeplearning.ai官网地址:https://www.deeplearning.ai/
coursera地址:https://www.coursera.org/specializations/deep-learning
网易视频地址:https://163.lu/nPtn42
课程一第二周课后作业1-1

numpy是一个python中基础的科学计算包,以下练习中,将会实现一些数学中的基础函数,如np.log(),np.exp()等。

对于机器学习中的逻辑回归激活函数,表达式为\delta = \frac{1}{1+e^{-z}},对于此公式,考虑到参数z是一个实数,可以简单的使用python中的math实现。

import math
def sigmoid(z):
  return 1/(1+math.exp(-z))

以上实现中,实际能够传入的参数z只能是一个数字,而在机器学习或者深度学习中,实际需要传入的参数是一个向量,所以math.exp()并不适用,可以使用numpy.exp()实现,如下所示:

import numpy as np
def sigmoid(z):
  sigmoid = 1/(1+np.exp(-z))
  return sigmoid

对于一个向量而言,np.exp()的实现过程就是对向量中的每一个元素计算np.exp(),可以如下图表示:

在之前的学习中,需要计算梯度优化使用反向传播算法的损失函数,对于此梯度的计算公式可以如下表示:
\delta'(z) = \delta(z)*(1-\delta(z))

代码实如下所示:

def sigmoid_derivative(z):
  s = sigmoid(z)
  ds = s(1-s)
  return ds

关于深度学习中,numpy中最常用到的两个跟矩阵或者向量形状有关的函数是shape()reshape()

  1. shape():返回当前矩阵或者向量的大小。
  2. reshape():将当前数组转化为特定形状。

具体一些用法如下所示;
将一个三维图像矩阵(shape=(length,height,depth)),转化为一维数组(shape = (lenght×height×depth,1))以便于处理,具体实现方法可以由以下代码所示:

def image2vector(image):
    v = image.reshape(image.shape[0] * image.shape[1] * image.shape[2], 1)  
    return v

机器学习或者深度学习中,常常用到的一个数据预处理技巧是标准化,标准化后的数据能够使得算法运行速度更快,关于数据标准化的公式如下所示:

normal = \frac{x}{||x||}

其中,||x||表示范数,对于一个向量[x_1,x_2……x_n],其范数计

算公式为\sqrt{x_1^{2}+x_2^{2}+···x_n^{2}}

numpy已经提供了用于计算范数的函数,所以其数据标准化的处理过程可以用以下代码实现:

def normalizeRows(x):
    x_norm = np.linalg.norm(x, axis = 1, keepdims = True)
    x = x / x_norm
    return x

为了理解python中的广播机制,一种行之有效的方法是操作两个维数不同的矩阵。使用numpy中的softmax函数理解python中的广播机制,可以将softmax函数认为是你的算法需要实现二分类或者更多分类时的数据标准化函数,其数学表示如下所示:

其实现代码如下所示:

import numpy as np
def softmax(x):
  x_exp = np.exp(x)
  x_sum = np.sum(x_exp,axis=1,keepdims = True)
  return x_exp/x_sum

2. 关于两个损失函数的实现

在深度学习中,损失函数常用来评估模型性能,如果损失函数的值越大,代表着模型的预测值与真实值之间的差值越大,深度学习中常用梯度下降算法来优化算法以最小化损失函数。

L1损失函数的定义如下所示:
\begin{align*} & L_1(\hat{y}, y) = \sum_{i=0}^m|y^{(i)} - \hat{y}^{(i)}|\end{align*}

其代码实现如下所示:

def L1(y,yhat):
  loss = np.sum(np.abs(y-yhat))
  return loss

L2损失函数的定义如下所示:
\begin{align*} & L_2(\hat{y},y) = \sum_{i=0}^m(y^{(i)} -\hat{y}^{(i)})^2 \end{align*}
注意:对于一个向量[X] = [x_1,x_2,···x_n]np.dot()的计算过

程为:np.dot(x,x) =\sum_{i=0}^{n}x_i^{2},所以L2损失函数的一种有效计算方式是利用dot()函数,具体实现代码如下所示:

def L2(y,yhat):
  loss = np.sum(np.dot((y-yhat),(y-yhat).T))
  return loss
上一篇下一篇

猜你喜欢

热点阅读