01.神经网络和深度学习 W2.神经网络基础

文章目录

    • 1. 二分类
    • 2. 逻辑回归
    • 3. 逻辑回归损失函数
    • 4. 梯度下降
    • 5. 导数
    • 6. 计算图导数计算
    • 7. 逻辑回归中的梯度下降
    • 8. m个样本的梯度下降
    • 9. 向量化
    • 10. 向量化的更多例子
    • 11. 向量化 logistic 回归
    • 12. 向量化 logistic 回归梯度输出
    • 13. numpy 广播机制
    • 14. 关于 python / numpy 向量的说明
    • 作业

参考:
吴恩达视频课
深度学习笔记

1. 二分类

  • 判断图片中动物是猫?不是猫? 特征向量 是 3通道的RGB矩阵 展平
    在这里插入图片描述

2. 逻辑回归

在这里插入图片描述

3. 逻辑回归损失函数

几种常见的损失函数

L(y^(i),y(i))=−(y(i)log⁡(y^(i))+(1−y(i))log⁡(1−y^(i)))L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\left(y^{(i)} \log \left(\hat{y}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right)L(y^(i),y(i))=(y(i)log(y^(i))+(1y(i))log(1y^(i)))
交叉熵损失函数,常用于二分类问题。

代价函数:

  • 所有的样本的损失函数的平均值
    J(w,b)=1m∑i=1mL(y^(i),y(i))=−1m∑i=1m[y(i)log⁡(y^(i))+(1−y(i))log⁡(1−y^(i))]J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \left(\hat{y}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right]J(w,b)=m1i=1mL(y^(i),y(i))=m1i=1m[y(i)log(y^(i))+(1y(i))log(1y^(i))]

目标就是找到合适的参数,使得代价函数最小化

4. 梯度下降

如何寻找合适的 w,bw,bwb 使得代价函数最小呢?

迭代的过程中,不断的在各参数的偏导数方向上更新参数值,α\alphaα 是学习率
w:=w−α∂J(w,b)∂wb:=b−α∂J(w,b)∂b\begin{array}{l}w:=w-\alpha \frac{\partial J(w, b)}{\partial w} \\ \\ b:=b-\alpha \frac{\partial J(w, b)}{\partial b}\end{array}w:=wαwJ(w,b)b:=bαbJ(w,b)

5. 导数

函数在某一点的斜率,在不同的点,斜率可能是不同的。

6. 计算图导数计算

链式求导法则:
在这里插入图片描述

7. 逻辑回归中的梯度下降

z=wTx+by^=a=σ(z)L(a,y)=−(ylog⁡(a)+(1−y)log⁡(1−a))\begin{array}{l}z=w^{T} x+b \\ \hat{y}=a=\sigma(z) \\ \mathcal{L}(a, y)=-(y \log (a)+(1-y) \log (1-a))\end{array}z=wTx+by^=a=σ(z)L(a,y)=(ylog(a)+(1y)log(1a))

sigmoid 函数:f(z)=11+e−zf(z)=\frac{1}{1+e^{-z}}f(z)=1+ez1
sigmoid 求导:
∂f(z)∂z=−1∗−1∗e−z(1+e−z)2=e−z(1+e−z)2=1+e−z−1(1+e−z)2=11+e−z−1(1+e−z)2=11+e−z(1−11+e−z)=f(z)(1−f(z))\begin{aligned} \frac{\partial f(z)}{\partial z} &=\frac{-1 *-1 * e^{-z}}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{e^{-z}}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1+e^{-z}-1}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1}{1+e^{-z}}-\frac{1}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1}{1+e^{-z}}\left(1-\frac{1}{1+e^{-z}}\right) \\ &=f(z)(1-f(z))\end{aligned}zf(z)=(1+ez)211ez=(1+ez)2ez=(1+ez)21+ez1=1+ez1(1+ez)21=1+ez1(11+ez1)=f(z)(1f(z))

在这里插入图片描述
∂L∂a=−ya+1−y1−a∂L∂z=∂L∂a∂a∂z=(−ya+1−y1−a)∗a(1−a)=a−y∂L∂w1=∂L∂z∂z∂w1=x1(a−y)nameddw1∂L∂w2=∂L∂z∂z∂w2=x2(a−y)nameddw2∂L∂b=∂L∂z∂z∂b=a−ynameddb\begin{aligned} \frac{\partial\mathcal{L}}{\partial a} &= -\frac{y}{a}+\frac{1-y}{1-a}\\ \frac{\partial\mathcal{L}}{\partial z} &= \frac{\partial\mathcal{L}}{\partial a}\frac{\partial{a}}{\partial z} = \bigg(-\frac{y}{a}+\frac{1-y}{1-a}\bigg)*a(1-a)=a-y\\ \frac{\partial\mathcal{L}}{\partial w_1} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial w_1} = x_1(a-y) \quad named \quad dw_1\\ \frac{\partial\mathcal{L}}{\partial w_2} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial w_2} = x_2(a-y) \quad named \quad dw_2\\ \frac{\partial\mathcal{L}}{\partial b} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial b} = a-y \quad\quad\quad named \quad db\\ \end{aligned} aLzLw1Lw2LbL=ay+1a1y=aLza=(ay+1a1y)a(1a)=ay=zLw1z=x1(ay)nameddw1=zLw2z=x2(ay)nameddw2=zLbz=aynameddb

w1:=w1−α∗dw1w2:=w2−α∗dw2b:=b−α∗db\begin{array}{l}w_1:=w_1-\alpha *dw_1 \\ w_2 :=w_2-\alpha *dw_2 \\ b:=b-\alpha* db\end{array}w1:=w1αdw1w2:=w2αdw2b:=bαdb

8. m个样本的梯度下降

假设有m个样本,样本有2个特征

// 伪代码 from http://www.ai-start.com/dl2017/html/lesson1-week2.html
J=0; dw1=0; dw2=0; db=0;
for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw1 += x1(i)dz(i); // 全部样本的梯度累加dw2 += x2(i)dz(i);db += dz(i);// 求平均值
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db
  • 显式的使用 for 循环是很低效的,要使用向量化技术 加速计算速度

9. 向量化

使用 numpy 等库实现向量化计算,效率更高

import numpy as np #导入numpy库
a = np.array([1,2,3,4]) #创建一个数据a
print(a)
# [1 2 3 4]
import time #导入时间库
a = np.random.rand(1000000)
b = np.random.rand(1000000) #通过round随机得到两个一百万维度的数组tic = time.time() #现在测量一下当前时间
#向量化的版本
c = np.dot(a,b)
toc = time.time()
print(c)
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()
print(c)
print('For loop:' + str(1000*(toc-tic)) + 'ms')#打印for循环的版本的时间

上面例子,向量化计算快了600多倍

250241.79388712568
Vectorized version:0.9975433349609375ms
250241.7938871326
For loop:687.734842300415ms

10. 向量化的更多例子

J=0; db=0;
dw = np.zeros((nx,1)) // numpy向量化
for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw += x(i)dz(i); // 向量化,全部样本的梯度累加db += dz(i);// 求平均值
J /= m;
dw /= m;// 向量化
db /= m;// 更新参数 w, b
w = w - alpha*dw
b = b - alpha*db

这样就把内层的 dw1,... dwn 的计算使用向量化了,只用1层 for 循环,还可以做的更好,往下看

11. 向量化 logistic 回归

逻辑回归前向传播步骤:

  • 对每个样本进行计算
    z(1)=wTx(1)+bz^{(1)}=w^{T} x^{(1)}+bz(1)=wTx(1)+b
  • 计算激活函数,得到预测值 y`
    a(1)=σ(z(1))a^{(1)} = \sigma(z^{(1)})a(1)=σ(z(1))

在这里插入图片描述
可以使用 numpy 来计算:

  • Z=np.dot(wT,X)+bZ = np.dot(w^T, X)+bZ=np.dot(wT,X)+b,+ b 会对每个元素操作,是 numpy 的广播机制
  • A=[a(1)a(2)…a(m)]=σ(Z)A=\left[a^{(1)} a^{(2)} \ldots a^{(m)}\right]=\sigma(Z)A=[a(1)a(2)a(m)]=σ(Z)

这样就没有显式使用 for 循环,计算非常高效

12. 向量化 logistic 回归梯度输出

Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)dZ=A−Ydw=1m∗X∗dZTdb=1m∗np.sum(dZ)w:=w−a∗dwb:=b−a∗db\begin{array}{l}Z=w^{T} X+b=n p . d o t(w . T, X)+b \\ A=\sigma(Z) \\ d Z=A-Y \\ d w=\frac{1}{m} * X * d Z^{T} \\ d b=\frac{1}{m} * n p . sum(d Z) \\ w:=w-a * d w \\ b:=b-a * d b\end{array}Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)dZ=AYdw=m1XdZTdb=m1np.sum(dZ)w:=wadwb:=badb

非向量化、向量化对比:
在这里插入图片描述

  • 这样就向量化的计算,完成了逻辑回归的 1 次迭代,要完成 n_iter 次迭代就在外层加一层 for 循环,这个 for 是省不了的

13. numpy 广播机制

import numpy as npA = np.array([[56, 0, 4.4, 68],[1.2, 104, 52, 8],[1.8, 135, 99, 0.9]
])cal = A.sum(axis=0)  # 按列求和
print(cal)percentage = 100 * A / cal.reshape(1, 4)
print(percentage)
[ 59.  239.  155.4  76.9]
[[94.91525424  0.          2.83140283 88.42652796][ 2.03389831 43.51464435 33.46203346 10.40312094][ 3.05084746 56.48535565 63.70656371  1.17035111]]

axis指明运算 沿着哪个轴执行,在numpy中,0轴是垂直的,也就是,而1轴是水平的,也就是行

  • 例1
A = np.array([[1, 2, 3, 4]])
b = 100
print(A+b)

在这里插入图片描述

[[101 102 103 104]]
  • 例2
A = np.array([[1, 2, 3],[4, 5, 6]])
B = np.array([100, 200, 300])
print(A+B)

在这里插入图片描述

[[101 202 303][104 205 306]]
  • 例3
A = np.array([[1, 2, 3],[4, 5, 6]])
B = np.array([[100], [200]])
print(A + B)

在这里插入图片描述

[[101 102 103][204 205 206]]
  • 广播机制与执行的运算种类无关

在这里插入图片描述

14. 关于 python / numpy 向量的说明

在这里插入图片描述
在这里插入图片描述

  • 总是使用 nx1 维矩阵(列向量),或者 1xn 维矩阵(行向量)
  • 为了确保所需要的维数时,不要羞于 reshape 操作

作业

01.神经网络和深度学习 W2.神经网络基础(作业 - 逻辑回归 图片识别)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库物理存储结构管理遇到的问题与解决

问题一:当我创建一个重做日志文件放入重做日志文件组中的时候,查询数据字典发现新创建的重做日志文件的状态为“不合法”。 解决方案: 通过查阅相关资料了解到 新建的重做日志文件组成员状态为INVALID,这是由于新建的成员文件还没有被…

01.神经网络和深度学习 W3.浅层神经网络

文章目录1. 神经网络概览2. 神经网络的表示3. 神经网络的输出4. 多样本向量化5. 激活函数6. 为什么需要 非线性激活函数7. 激活函数的导数8. 随机初始化作业参考: 吴恩达视频课 深度学习笔记 1. 神经网络概览 xW[1]b[1]}⟹z[1]W[1]xb[1]⟹a[1]σ(z[1])\left.\begin…

01.神经网络和深度学习 W2.神经网络基础(作业:逻辑回归 图片识别)

文章目录编程题 11. numpy 基本函数1.1 编写 sigmoid 函数1.2 编写 sigmoid 函数的导数1.3 reshape操作1.4 标准化1.5 广播机制2. 向量化2.1 L1\L2损失函数编程题 2. 图片🐱识别1. 导入包2. 数据预览3. 算法的一般结构4. 建立算法4.1 辅助函数4.2 初始化参数4.3 前向…

PL/SQL程序设计以及安全管理实验遇到的问题及解决

问题一:当我书写PL/SQL语句调用所创建的函数时,报“此范围不存在名为XXX函数名”的错误。 解决: 我通过查阅相关资料,了解到:这种情况主要是调用的函数的参数或者函数名书写错误, 然而,我经过仔…

PowerDesigner使用教程 —— 概念数据模型 (转)

一、概念数据模型概述 概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充。它从用户的观点出发对信息进行建模,主要用于数据库的概念级设计。 通常人们先将现实世界抽…

阿里云 超级码力在线编程大赛初赛 第1场(第245名)

文章目录1. 比赛结果2. 题目1. 树木规划2. 正三角形拼接3. 大楼间穿梭4. 对称前后缀1. 比赛结果 通过了 3 题,第245名,进入复赛了,收获 T恤 一件,哈哈。 2. 题目 1. 树木规划 题目链接 描述 在一条直的马路上,…

01.神经网络和深度学习 W3.浅层神经网络(作业:带一个隐藏层的神经网络)

文章目录1. 导入包2. 预览数据3. 逻辑回归4. 神经网络4.1 定义神经网络结构4.2 初始化模型参数4.3 循环4.3.1 前向传播4.3.2 计算损失4.3.3 后向传播4.3.4 梯度下降4.4 组建Model4.5 预测4.6 调节隐藏层单元个数4.7 更改激活函数4.8 更改学习率4.9 其他数据集下的表现选择题测试…

[编程启蒙游戏] 2. 奇偶数

文章目录1. 游戏前提2. 游戏目的3. python代码1. 游戏前提 孩子知道奇偶数是什么,不知道也没关系 还可以采用掰手指演示,伸出两个手指能配对,所有伸出来的手指都两两配对了,伸出来的手指个数就是偶数如果还有1个没有找到朋友的手…

过压保护(1)

征一个简单、可靠的电源过压保护电路 http://www.amobbs.com/thread-5542005-1-1.html 防过压:过压之后TVS导通,电流由正极流经自恢复保险再流经TVS到负极,自恢复保险升温,阻值变大,相当于断开,等电流撤去&…

spring boot+thmyleaf ModelAndView页面传值

如上图所示,当我们从后台通过ModelAndView进行传值的时候, 一定要注意,千万不要向上图那样开头加上反斜杠,开头加反斜杠,系统会默认为相对路径, 虽然也能找到相应的视图(html)&#…

LeetCode 214. 最短回文串(字符串哈希)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。 找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入: "aacecaaa" 输出: "aaacecaaa"示例 2: 输入: "abcd" 输出: "…

转:c#委托事件实现窗体传值通信

C#实现Winform窗口间数据交互的三种方法介绍 2010-03-15 来自:CNBLOG 字体大小:【大 中 小】摘要:本文分别介绍C#实现Winform窗口间数据交互的三种方法:修改子窗体的构造函数、给窗体添加属性或方法、通过委托的方法&#xff0c…

LeetCode 1566. 重复至少 K 次且长度为 M 的模式

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。 模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。 …

R语言的安装与配置

一、什么是 R 语言 R 编程语言被广泛应用在统计科学和商业领域。 在各种编程语言排名中 R 语言的排名都很靠前。 它是一款集成了数据操作、统计,以及可视化功能的优秀开源软件。免费,开源是 R 重要的特点。 二、什么是 RStudio RStudio 是用亍 R 编程的…

R语言第一讲

一、R语言入门推荐 推荐四本材料书:R CookBook :hhtp://www.cookbook-r.com/R in Action http://www.amazon.com/R-Action-Robert-Kabaccoff/dp/1935182390Ggplot2:Elegant Graphics for Data Analysis(User R):hhtp://www.amazon.com/ggplo…

LeetCode 1567. 乘积为正数的最长子数组长度

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 示例 1: 输入:nums [1,-2,-…

LeetCode 1568. 使陆地分离的最少天数(DFS)

文章目录1. 题目2. 解题1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地。 岛屿由水平方向或竖直方向上相邻的 1 (陆地)连接形成。 如果 恰好只有一座岛屿 ,则认为陆地是 连通的 &…

LeetCode 1569. 将子数组重新排序得到同一个二叉查找树的方案数(DP)

文章目录1. 题目2. 解题1. 题目 给你一个数组 nums 表示 1 到 n 的一个排列。 我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉查找树(BST)。 请你统计将 nums 重新排序后,统计满足如下条件的方案数:重排后得到的二叉查…

ADS1.2开发环境创建与简要介绍

ADS1.2下建立工程 1.运行ADS1.2集成开发环境(CodeWarrior for ARM Developer Suite),点击File|New,在New对话框中,选择Project栏,其中共有7项,ARM Executable Image是ARM的通用模板。选中它即可生成ARM的执…