深度学习笔记(3) 向量化逻辑回归

  • 1. 向量化运算的优势
  • 2. 向量化编程
  • 3. 举例

1. 向量化运算的优势

python的向量化运算速度快,是非常基础的去除代码中for循环的艺术

可以看出相同的运算,时间相差接近335倍


2. 向量化编程

训练输入一个 (nx × m)的矩阵 X
首先计算Z:[z(1) z(2)…z(m) )]=[wT x(1), wT x(2)…wT x(m)] + [b b…b]
[b b…b] 是一个 1×m矩阵或者是一个 m 维的行向量
WT X是一个 m 维的行向量
w 转置乘以 x(1) , x(2) 一直到 x(m)
所以 w 转置是一个1×n行向量,w是一个 n 维的列向量

最终得到了另一个 1×m 的向量:
[z(1) z(2)… z(m)] = wT X + [b b…b] = [wT x(1)+b,wT x(2)+b … wT x(m)+b]

Numpy 表示Z:Z = np.dot(w.T, X) + b
Python广播(broadcasting)功能自动把实数 b 扩展成 1×m 的行向量

A = [a(1) a(2)…a(m)] = σσσ(Z),一次性计算所有 a
即同一时间内完成m个训练样本的前向传播向量化计算

目标是一次迭代实现一次梯度下降并且不使用for循环,而是向量,可以这么做:


过程中可以用维持 assert(Z.shape == (1,m)) 或者重组 Z. reshape(1,m) 来确保的矩阵或向量所需要的维数


3. 举例

输入x是3个数值(a,b,c),如果a+c>b,则输出 y = 1,否则 y = 0
利用逻辑回归中的梯度下降,构建一个简单的神经网络
此处使用标准化和正则化,有助于优化机器学习,在后续文章再作详细介绍

首先,定义激活函数:

import numpy as np
import matplotlib.pyplot as pltdef sigmoid(z):  # 激活函数a = 1 / (1 + np.exp(-z))return a

接下来,定义激活函数的导数:

def d_sigmoid(a):  # 激活函数的导数return a * (1 - a)

导入数据:

X = np.array([[0.1, 1.1, 0.5], [1.1, 0.1, 1.5], [0.3, 1.4, 0.7], [1.4, 0.1, 1.1], [0.5, 1.8, 0.9], [1.0, 0.6, 1.8],[0.7, 1.9, 0.1], [1.1, 0.2, 1.3], [0.9, 2.1, 0.8], [1.5, 0.1, 1.8], [0.1, 1.8, 0.6], [1.5, 0.3, 1.9],[0.3, 1.7, 0.2], [1.7, 0.4, 1.5], [0.5, 1.1, 0.3], [1.6, 0.6, 1.8], [0.7, 1.5, 0.2], [1.5, 0.8, 1.2],[0.9, 1.9, 0.5], [1.9, 1, 2.6]])
X = X.T  # 转置Xy = np.array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])m = X.shape[1]
X = (X - np.mean(X)) / np.linalg.norm(X, ord=2, axis=1, keepdims=True)  # 标准化输入

初始化权重和超参数

w1 = np.random.randn(3, 4) * np.sqrt(1 / 3)  # 权重初始化
b1 = np.random.randn(4, 1)
w2 = np.random.randn(4, 1) * np.sqrt(1 / 4)
b2 = np.random.randn(1, 1)
alpha = 1  # 学习效率
lambd = 0.03  # 正则化参数
cost = np.zeros(500)  # 初始化记录代价的列表

迭代:

for i in range(0, 500):  # 迭代500次# 向前传播Z1 = np.dot(w1.T, X) + b1A1 = sigmoid(Z1)Z2 = np.dot(w2.T, A1) + b2A2 = sigmoid(Z2)# 反向传播dz2 = (A2 - y)dw2 = np.dot(A1, dz2.T) / m + lambd * w2 / mdb2 = np.sum(dz2, axis=1, keepdims=True) / mdz1 = np.dot(w2, dz2) * d_sigmoid(A1)dw1 = np.dot(X, dz1.T) / m + lambd * w1 / mdb1 = np.sum(dz1, axis=1, keepdims=True) / m# 更新权重w2 = w2 - alpha * dw2b2 = b2 - alpha * db2w1 = w1 - alpha * dw1b1 = b1 - alpha * db1# 记录代价(损失、误差)cost[i] = -1 / m * np.sum(y * np.log(A2) + (1 - y) * np.log(1 - A2))

运行上面的一个简单的神经网络,得到在学习过程中的代价记录图:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置正常显示中文
plt.plot(cost, "b", label='代价')  # 设置曲线数值
plt.xlabel("迭代次数")  # 设置X轴的名字
plt.ylabel("代价")  # 设置Y轴的名字
plt.title("代价变化图")  # 设置标题
plt.legend()  # 设置图例
plt.show()  # 显示图表


可以看出,代价在迭代500次后已经逐渐接近于0,说明预测的准确度很接近100%

显示所求的权重w和b

print("w1:" + str(w1) + "\nw2:" + str(w1))  # 显示权重
print("b1:" + str(b1) + "\nb2:" + str(b2))
w1:[[ 3.53485299  2.41501319 -1.69594659 -0.46506595][-3.95670511 -2.90826621  2.73447831  1.24344382][ 3.1645732   2.29206756 -2.2545134  -0.80372522]]
w2:[[ 3.53485299  2.41501319 -1.69594659 -0.46506595][-3.95670511 -2.90826621  2.73447831  1.24344382][ 3.1645732   2.29206756 -2.2545134  -0.80372522]]
b1:[[ 0.01965446][-0.02949129][ 0.05821271][-1.00424847]]
b2:[[-2.5647781]]

再利用求出的w和b进行预测验证:

def predict(x):  # 预测函数x = np.array([x])x = (x.T - np.mean(x)) / np.linalg.norm(x, ord=2, axis=1, keepdims=True)z1_test = np.dot(w1.T, x) + b1a1_test = sigmoid(z1_test)z2_test = np.dot(w2.T, a1_test) + b2a2_test = sigmoid(z2_test)return a2_testprint("predict 0 rate:%f%%" % ((1 - predict([0.1, 0.7, 0.5])) * 100))
print("predict 0 rate:%f%%" % ((1 - predict([0.9, 1.8, 0.5])) * 100))
print("predict 1 rate:%f%%" % (predict([1.2, 1.0, 1.5]) * 100))
print("predict 1 rate:%f%%" % (predict([1.8, 0.1, 1.9]) * 100))
predict 0 rate:99.518280%
predict 0 rate:99.713837%
predict 1 rate:92.412660%
predict 1 rate:99.882484%

可以看出,预测的准确率还是挺高的。

[1] python的代码地址:
https://github.com/JoveH-H/A-simple-explanation/blob/master/easyBPNN.py
[2] jupyter notebook的代码地址:
https://github.com/JoveH-H/A-simple-explanation/blob/master/ipynb/easyBPNN.ipynb


参考:

《神经网络和深度学习》视频课程


相关推荐:

深度学习笔记(2) 神经网络基础
深度学习笔记(1) 深度学习简介


谢谢!

深度学习笔记(3) 向量化逻辑回归相关推荐

  1. 吴恩达深度学习 —— 2.14 向量化逻辑回归的梯度输出

    这一节将学习如果向量化计算m个训练数据的梯度,强调一下,是同时计算. 前面已经说过,在逻辑回归中,有dz(1)=a(1)−y(1)dz^{(1)}=a^{(1)}-y^{(1)}dz(1)=a(1)− ...

  2. 深度学习(入门)——逻辑回归模型(Logistics Regression)

    从逻辑回归开始,是因为这是一个简单的,可以理解成为一个简单的一层的神经网络,后续将逐步深入,了解更复杂的神经网络 一,假设函数 逻辑回归算法适用于二分类问题,例如在输入一个猫的图片到模型中,模型会输出 ...

  3. 神经网络和深度学习(5)-- 逻辑回归

    神经网络和深度学习 上一篇 主目录 下一篇 文章结构 1.逻辑回归 [前言] 逻辑回归学习算法,该算法适用于二分类问题,本节将主要 介绍逻辑回归的 Hypothesis Function(假设函数) ...

  4. 吴恩达深度学习笔记2.2 logistic回归

    regression:回归  supervised:有监督的 logistic回归是一种学习算法被用于有监督学习问题,当y全都是0或1时 例子:判断是否有猫 给定一个由特征向量x代表的图像,那个算法将 ...

  5. [深度学习]Python/Theano实现逻辑回归网络的代码分析

    2014-07-21 10:28:34 首先PO上主要Python代码(2.7), 这个代码在Deep Learning上可以找到. 1 # allocate symbolic variables f ...

  6. 深度学习4线性回归,逻辑回归

    y是连续的则是一个回归问题,y是离散的则是一个分类问题,这边就开始考虑y是离散的情况. 对于这样的问题很多,比如判断一个人是否生病,或者判断一个邮件是否是垃圾邮件. 回归时连续型的,一般不用在上述的分 ...

  7. 吴恩达深度学习L1W2——实现简单逻辑回归

    文章目录 一些笔记 写作业 导入数据 取出训练集.测试集 处理数据的维度 标准化数据 sigmoid 函数 初始化参数w.b 前向传播.代价函数.梯度下降 优化 预测函数 模型整合 使用模型 绘制代价 ...

  8. 一文让你完全弄懂逻辑回归和分类问题实战《繁凡的深度学习笔记》第 3 章 分类问题与信息论基础(上)(DL笔记整理系列)

    好吧,只好拆分为上下两篇发布了>_< 终于肝出来了,今天就是除夕夜了,祝大家新快乐!^q^ <繁凡的深度学习笔记>第 3 章 分类问题与信息论基础 (上)(逻辑回归.Softm ...

  9. 一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

    <繁凡的深度学习笔记>第 2 章 回归问题与神经元模型(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net/ http ...

最新文章

  1. Maven最佳实践:划分模块
  2. 计算机专业i7 7500u,8550U比7500U提升多少 8550U和7500U的区别-太平洋电脑网
  3. 记录一下 Linux飞鸽传书 QIpMsg 的下载链接
  4. USB连接TF卡 SD卡硬件电路
  5. 二次封装dojo slider
  6. 人脸识别技术场景应用
  7. Visual studio 的教程
  8. EclipseIDEA使用经验
  9. cw2vec:蚂蚁金服公开最新基于笔画的中文词向量算法
  10. 关于require()和export引入依赖的区别
  11. aar打包依赖 android_快速了解:十四、Android打包编译的进阶流程
  12. [硬核干货]由0到1,突破信息系统项目管理师(呕心沥血经验之谈)!!!
  13. 谷歌浏览器Chrome不能登录不能同步解决方法
  14. MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
  15. 龙芯LoongArch电脑上用dh-make打包deb包
  16. java学习方法和经验
  17. Spring5框架day01之IOC容器
  18. 最帅爬虫_豆瓣读书(加密数据获取)
  19. 先睹为快:甲骨文NoSQL数据库
  20. python斗地主出牌算法_python模拟斗地主发牌

热门文章

  1. 【回文字符串】 最长回文子串O(N) Manacher算法
  2. AsyncTask类浅析
  3. 验证身份证合法性的js
  4. 动态规划复习-HDU1081
  5. 活力四射的Windows Embedded Standard 7
  6. SAP中的“定单状态”
  7. 学习笔记(1):uni-app实战社区交友类app开发-引入自定义图标库
  8. mysql一直出错_为什么我的mysql语句一直报错,找不到错误,望各位大佬指点一番...
  9. BZOJ2176Strange string——最小表示法
  10. NoSQL介绍(七)