神经网络基础

二分分类

假若有一张图片作为输入,如图1所示。用户想输出识别此图的标签,如果是猫输出1,否则输出0,我们用y来表示输出的结果标签。

图1

计算机保存一张图片,要保存三个独立矩阵,分别对应图片中的红、绿、蓝三个颜色通道。如果输入的图片像素是64×64,就有三个64×64的矩阵分别对应图片中的红、绿、蓝三种像素的亮度。要把这些像素亮度值放进一个特征向量中,就要把这些像素值都提取出来放入一个特征向量x。为了把这些像素值提取出放入特征向量,我们会得到一列很长的列向量,把图片中所有的红、绿、蓝像素强度值都列出来,如果图片是64×64的,那么向量x的总维度64×64×3,因为这是三个矩阵的元素总量。

图 2

在二分分类问题中,目标是训练出一个分类器,它以图片的特征向量x作为输入,预测输出的结果标签y是1还是0,也就是预测图片中是否有猫。

Logistic回归

图 3logistic回归

线性回归参数列表

  • 输入值:n维特征向量x
  • 权重:n维向量w
  • 拦截器:实数b
  • 输出值:y = (向量x的装置乘以向量x)+实数b

Logistic回归

线性回归的值通常为复数或者比1大得多,而这样的概率是没有意义的,我们希望y的值介于0和1之间,因此我们将sigmoid(z)函数作用于y上。如果线性回归的结果很大,则logistic回归的结果很接近1,相反线性回归的值很小或者为负数,则logistic回归的结果很接近0。

图4 sigmoid函数

Logistic回归损失函数

损失函数

损失函数又叫损失误差。损失函数可以用来衡量算法的运行情况,我们通常希望损失函数的值越小越好。它可以定义损失为y帽和y的差的平方,或者它们差的平方的二分之一。我们通过定义损失函数L来衡量你的预测输出值y帽和y的实际值有多接近。误差平方是一个合理的选择,但是用误差平方,梯度下降法就不太好用了。

图 5损失函数

在logistic回归中,我们会定义一个不同的损失函数,它起着与误差平方相似的作用。如果y=1,第二项为0,为了让损失函数尽可能小,我们让y帽尽可能大。如果y=0,第一项为0,为了让损失函数尽可能小,我们让y帽尽可能小。

成本函数

成本函数衡量的是模型在全体训练样本上的表现。它是所有训练样本的损失函数和的平均值,其中y帽是用一组特点的参数w和b通过logistic回归算法得到的预测输出值,y是基本真值标签。损失函数只适用于单个训练样本中参数w和b的效果,而成本函数则用于在全部训练集上衡量参数w和b的效果。因此,在训练logistic回归模型时,我们要找到合适的参数w和b,就需要让成本函数J尽可能的小。

图 6成本函数

梯度下降法

图 7梯度下降法

梯度下降法所做的就是从初始点开始朝最陡的下坡方向走一步,直至走到全局最优解或接近全局最优解。 在logistic回归中,即通过反复更新参数w和b的值,使得成本函数最小。

计算流程图

J = 3×(a+b×c)

图 8计算流程图

一个计算流程图就是正向或者说从左到右的计算来计算成本函数J,如果需要优化函数,则方向。从右到左计算导数。

向量化

向量化通常是消除代码中显示for循环语句的艺术。深度学习中,在训练大量数据集时,深度学习算法表现才更加优越。因此代码运行速度快显得非常重要,否则如果它运行在一个大的数据集上面,你的代码可能花费很长时间去运行,你会发现你将要等待非常长的时间去得到结果。所以在深度学习领域中,向量化已经变成一个关键的技巧。

 

import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
#平均花费2毫秒
print(“Vectorized version:”+str(1000*(toc-tic))+ “ms”)
c = 0
tic = time.time()
for i in range(1000000)
	c+= a[i]*b[i]
toc = time.time()
#平均花费500毫秒
print(“for loop:”+str(1000*(toc-tic))+ “ms”)
#经验法则是 只要有其它办法 就不要显示使用for循环

向量化logistic回归

#正向传播一步迭代的向量化实现
#同时处理所有m个训练样本
#X作为训练输入
#使用向量化高速计算激活函数
Z=np.dot(w.T,X)+b
#这里有个Python巧妙的地方,在这个地方b是一个实数,当是当你把这个
#向量加上这个实数时,Python会自动的把实数b,扩展成一个1×m的行向
#量,在Python中这叫做广播。
#后续可以通过向量化同时计算整个训练集预测值a

向量化logistic回归的梯度输出

for iter in range(1000):
    Z = np.dot(w.T,X)+b
    A = σ(Z)
    #反向传播(导数)
    dz = A - Y
    dw = 1/m * np.dot(Z.T,X)
    db = 1/m * np.sum(dz)
    w = w - a*dw
    b = b - a*db

Python中的广播

#广播是一种手段,可以让Python代码执行得更快。
import numpy as np
A = np.array([56.0,0.0,4.4,68.0],
	       [1.2,104.0,52.0,8.0],
               [1.8,135.0,99.0,0.9])
cal = A.sum(axis=0) # axis=0意味着竖着相加
print(cal) #[59,239,155.4,76.9]
percentage = 100*A/cal.reshape(1,4)#矩阵A除以这个1乘4的矩阵
#广播的实质其实是一种向量扩展

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值