w1_numpy+基础函数(包括sigmoid等)实践


这一部分是跟着 吴恩达《深度学习》L1W2作业1完成的。今天好热啊…台风要来了

一、 numpy的使用

1.矩阵定义与输出

  • 定义方式 变 量 = n p . a r r a y ( [ 元 素 1 , 元 素 2 , . . . ] ) 变量 = np.array([元素1 , 元素2 ,...]) =np.array([12...])
    e.g.:x = np.array([1, 2, 3])
  • 输出方式:print(变量名)
    e.g.: print(sigmoid(x))

2. 矩阵的运算

import numpy as np
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])

#矩阵加法 输出[2 4 6]
print(x+y)  

#矩阵乘法 输出[1 4 9]
print(x*y) 

#矩阵转置为?.T 
print(y.T)

#.dot(?)矩阵相乘 输出14
print(y.dot(x))

#输出[4 8 12]
print(x*4)

3. 重塑数组

深度学习中两个常用的numpy函数是np.shapenp.reshape()

  • X.shape用于获取矩阵/向量X的shape(维度)。多个维度使用时,用X.shape[0]...X.shape[n]
  • X.reshape(...)用于将X重塑为其他尺寸。

图像由shape为 ( l e n g t h , h e i g h t , d e p t h = 3 ) (length,height,depth = 3) (length,height,depth=3)的3D数组表示。你读取图像作为算法的输入时,会将其转换为维度为的向量。换句话说,将3D阵列“展开”或重塑为1D向量。
练习:实现image2vector() ,该输入采用维度为(length, height, 3)的输入,并返回维度为(lengthheight3, 1)的向量。例如,如果你想将形为(a,b,c)的数组v重塑为维度为(a*b, 3)的向量。

执行以下操作:

#重塑数组--从3D变为向量
def image2vector(x):
    return x.reshape(x.shape[0]*x.shape[1]*x.shape[2], 1)

检验代码:

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 ("image2vector(image) = " + str(image2vector(image)))

输出:

image2vector(image) = [[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]]

二、 代码实现部分

1. sigmoid function

复习内容:

  • sigmoid函数是一种非线性的逻辑函数, s i g m o i d ( x ) = 1 1 + e − x sigmoid(x) = \frac{1}{1+e^{-x}} sigmoid(x)=1+ex1
  • 对于给定矩阵 X = [ x 1 x 2 . . . x n ] s i g m o i d ( X ) = [ 1 1 + e − x 1 1 1 + e − x 2 . . . 1 1 + e − x n ] X =\begin{bmatrix} x_1 \\ x_2 \\ ... \\ x_n \end{bmatrix} sigmoid(X) = \begin{bmatrix} \frac{1}{1+e^{-x_1}} \\ \frac{1}{1+e^{-x_2}} \\ ... \\ \frac{1}{1+e^{-x_n}} \end{bmatrix} X=x1x2...xnsigmoid(X)=1+ex111+ex21...1+exn1

矩阵x的整体sigmoid函数代码实现:

import numpy as np
def sigmoid(x):
    s = 1/(1 + np.exp(-x))
    return s
x = np.array([1,2,3])
print(sigmoid(x))

2. Sigmoid gradient

计算梯度来使用反向传播优化损失函数。

复习内容:

  • sigmoid函数的特性: σ ′ ( x ) = σ ( x ) × σ ( 1 − x ) \sigma' (x) = \sigma(x)\times\sigma(1-x) σ(x)=σ(x)×σ(1x)
    手写的第一个梯度函数:
#sigmoid梯度函数
def dir_sigmoid(x):
    s = sigmoid(x)
    ds = s*(1 - s)
    return ds

3. 行标准化

在进行梯度下降时,经常会用到行标准化归一,以实现梯度下降收敛速度更快的效果。

  • 行标准化公式: x ∣ ∣ x ∣ ∣ \frac{x}{||x||} xx
  • 在计算时, ∣ ∣ x ∣ ∣ = n p . l i n a l g . n o r m ( x , a x i s = 1 , k e e p d i m s = T r u e ) ||x|| = np.linalg.norm(x, axis = 1, keepdims = True) x=np.linalg.norm(x,axis=1,keepdims=True)

代码实现:

#行标准化
def normalizeRows(x):
    x_norm = np.linalg.norm(x, axis = 1,keepdims=True)
    return x/x_norm

代码验证:

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

正确输出:

normalizeRows(x) = [[0.         0.6        0.8       ]
 [0.13736056 0.82416338 0.54944226]]

4 .实现L1和L2损失函数

  • 损失函数用于评估模型的性能。 损失越大,预测( y ^ \hat{y} y^) 与真实值( y y y)的差异也就越大。 在深度学习中,我们使用诸如Gradient Descent之类的优化算法来训练模型并最大程度地降低成本。
  • L1损失函数定义为: L 1 ( y ^ , y ) = ∑ i = 0 m ∣ y ( i ) − y ^ ( i ) ∣ L_1(\hat{y},y) = \sum_{i = 0}^m|y^{(i)} - \hat{y}^{(i)}| L1(y^,y)=i=0my(i)y^(i)

实现代码:

#L1损失函数
def L1(yhat, y):
    loss = np.sum(np.abs(yhat - y))
    return loss
#验证,输出 L1 = 1.1
yhat = np.array([.9, 0.2, 0.1, .4, .9])
y = np.array([1, 0, 0, 1, 1])
print("L1 = " + str(L1(yhat,y)))

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44986601/article/details/119040995
conseillé
Classement