深度学习入门笔记

深度学习入门笔记

  • 感知机
    • 逻辑与门
    • 与非门
    • 或门
    • 多层感知机
    • 异或门
  • 神经网络
    • 激活函数
    • 输出层设计
    • 损失函数
      • 均方误差 MSE
      • 交叉熵误差
    • 反向传播算法
      • 计算图
      • 局部计算
      • 计算图反向传播
      • 反向传播
    • 参数更新
    • 训练过程
    • 总结

该篇文章为本人学习笔记的一部分。笔记基于《深度学习入门 基于python理论实践》这本书学习,尽可能简单的分享吧。

感知机

接收多个信号,输出一个信号。
感知机示意图
x1,x2是输入信号,w1,w2是权重,y是输出信号。信号送往神经元时,都会乘以相对应的权重(x1w1, x2w2)。神经元计算传来的信号总和,当总和超过一定阈值则输出1,否则输出0。
y = { 0 , ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 , ( w 1 x 1 + w 2 x 2 > θ ) y = \begin{cases} 0, & {(w_1x_1 + w_2x_2 \leq \theta)}\\\\ 1, & {(w_1x_1 + w_2x_2 \gt \theta)} \end{cases} y= 0,1,(w1x1+w2x2θ)(w1x1+w2x2>θ)

逻辑与门

通过感知机来表示 逻辑与门。也就是说需要找到(w1,w2,θ) 相应的权重和偏置,满足条件。如:(0.5,0.5,0.7)满足条件,即 (0.5 * x1 + 0.5 * x2 <= 0.7 时为0, > 0.7时为1)当然(0.5,0.5,0.8)也可以。

import numpy as np
def AND(x1,x2):w = np.array([0.5,0.5,-0.7])x = np.array([x1,x2,1])temp = np.sum(w*x)if temp <= 0:return 0else:return 1

与非门

和与门相反

import numpy as np
def NAND(x1,x2):w = np.array([-0.5,-0.5,0.7])x = np.array([x1,x2,1])temp = np.sum(w*x)if temp <= 0:return 0else:return 1

或门

import numpy as np
#或门
def OR(x1,x2):w = np.array([1.0,1.0,-0.5])x = np.array([x1,x2,1])temp = np.sum(w*x)if temp <= 0:return 0else:return 1

或门
将x1,x2,作为横竖坐标,并将(0,0),(1,0),(0,1),(1,1)点画到坐标中,每个点Y如果是0,画○,如果是1,画×. 不难得出权重。

多层感知机

异或门

那么异或门如何表示。
仅当x1,x2当中的一方为1时才会输出1。
在这里插入图片描述
可以通过或门,与非门加上与门去完成。

def XOR(x1,x2):s1 = NAND(x1,x2)s2 = OR(x1,x2)y = AND(s1,s2)return y

在这里插入图片描述

神经网络

神经网络和感知机相似,最大区别就在于激活函数。
在这里插入图片描述

激活函数

常见激活函数有Sigmoid,ReLu,LeakyRelu等等。
感知机函数形式
h ( x ) = { 0 , ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 , ( w 1 x 1 + w 2 x 2 > θ ) h(x) = \begin {cases} 0, &{(w_1x_1 + w_2x_2 \leq \theta)} \\\\ 1, &{(w_1x_1 + w_2x_2 \gt \theta)} \end {cases} h(x)= 0,1,(w1x1+w2x2θ)(w1x1+w2x2>θ)
变形
h ( x ) = { 0 , ( w 1 x 1 + w 2 x 2 + b ≤ 0 ) 1 , ( w 1 x 1 + w 2 x 2 + b > 0 ) h(x) = \begin {cases} 0, &{(w_1x_1 + w_2x_2 + b \leq 0)} \\\\ 1, &{(w_1x_1 + w_2x_2 + b \gt 0)} \end {cases} h(x)= 0,1,(w1x1+w2x2+b0)(w1x1+w2x2+b>0)
激活函数就是前面的感知机的简化变形
h ( x ) = { 0 , ( x ≤ 0 ) 1 , ( x > 0 ) h(x) = \begin {cases} 0, &{(x \leq 0)} \\\\ 1, &{(x\gt0)} \end {cases} h(x)= 0,1,(x0)(x>0)
此处h(x)就是激活函数。
sigmoid
h ( x ) = 1 1 + e ( − x ) h(x) = \frac {1}{1 + e^{(-x)}} h(x)=1+e(x)1
阶跃函数
就是一个阈值,超过就是1,没超过就是0
ReLu
h ( x ) = { x , ( x > 0 ) 0 , ( x ≤ 0 ) h(x) = \begin {cases}x, &{(x \gt 0)}\\\\ 0, &{(x \leq 0)} \end{cases} h(x)= x,0,(x>0)(x0)
在这里插入图片描述
为什么要有激活函数:激活函数都是非线性的,如果是线性函数,h(x) = c * x,叠加三层就成了c * c * c * x 相当于 a * x将毫无意义。

输出层设计

神经网络可分为两类问题:分类问题,回归问题
分类问题:属于哪一类
回归问题:预测数值
恒等函数:数值原样输出,用于回归问题。
Softmax函数:用于分类问题
y k = e a k ∑ i = 1 n e ( a i ) y_k = \frac {e^{a_k}}{\sum_{i=1}^{n}e^{(a_i)}} yk=i=1ne(ai)eak
softmax可以让输出的值总和为1,可以理解为softmax的输出解释为“概率”

输出神经元数量: 按照类别数量设定。

损失函数

表示神经网络性能的“恶劣程度”的指标,当前神经网络对监督数据在大多程度上不拟合,大多程度不一致。

均方误差 MSE

E = 1 2 ∑ k ( y k − t k ) 2 E = \frac {1}{2} \sum_k (y_k - t_k)^2 E=21k(yktk)2
yk : 神经网络的输出

tk : 监督数据

k : 数据维数

交叉熵误差

E = − ∑ k t k l o g ( y k ) E = -\sum_k t_klog(y_k) E=ktklog(yk)
小例子,MNIST手写数据集训练图像识别,MNIST数据集6w训练样本,1w测试样本,每张图28 x 28像素。标签为one_hot_label (一个大小为10的数组,图像的数字对应数组位置上的元素为1,其余为0)。训练中采用的交叉熵误差。详细代码见我博客地址

反向传播算法

这部分算是比较重要的,权重的更新依靠这个方法。
书上的例题:太郎在超市买了2个100日元一个的苹果,消费税是10%,请计算支付金额。
在这里插入图片描述
很简单的计算:100 * 2 * 1.1即可。
将x2和x1.1节点中的数字取出,符号单独放在○当中。
在这里插入图片描述
从左往右为正向传播
从右往左是反向传播

计算图

计算图:就是将计算过程用图的方式存下来。

局部计算

简单来说就是只用关注当前的简单计算部分,其他复杂的部分不需要管。意思就是计算偏导的那种感觉。

计算图反向传播

在这里插入图片描述
假设y = f(x)就是将信号E乘以节点的局部导数,然后传递到下一个节点。如果假设y = x^2 那么导数为2x,那么向下传播的值就是 E*2x,这里的x是正向传递时记录的。
链式法则
f ( x , y ) = ( x + y ) 2 令 u = ( x + y ) ∂ f ∂ x = ∂ f ∂ u ∂ u ∂ x = 2 ( x + y ) ∂ f ∂ y = ∂ f ∂ u ∂ u ∂ y = 2 ( x + y ) f(x,y) = (x + y)^2 \\ 令u = (x + y) \\ \frac{\partial f}{\partial x} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial x} = 2(x + y) \\ \\ \frac{\partial f}{\partial y} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial y} = 2(x + y) \\ f(x,y)=(x+y)2u=(x+y)xf=ufxu=2(x+y)yf=ufyu=2(x+y)
在这里插入图片描述

反向传播

对于每个层,都有forward方法和backward方法,对应正向反向传播。在训练时创建网络时,将每一层存在一个列表当中,顺序正向传播。当需要计算梯度时,将列表翻转,依次执行backward方法进行反向传播,求得梯度。
在这里插入图片描述在这里插入图片描述
加法正向和反向示意图
在这里插入图片描述在这里插入图片描述
乘法示意图
在这里插入图片描述
回到苹果的问题,计算过程反向传播过程。

参数更新

SGD随机梯度下降算法举例。其他更新的算法有很多Adam,Momentum,AdaGrad等等。
W ′ = W − η ∇ f ( W ) W' = W - \eta \nabla f(W) W=Wηf(W)
W W W为旧的权重, W ′ W' W更新的权重, η \eta η学习率, ∇ f ( W ) \nabla f(W) f(W)为损失函数在W权重上的导数。

训练过程

以MNIST数据集为例,简单写个训练过程伪代码。用pytorch或TensorFlow会更方便些。

# 加载数据集
(x_train,t_train),(x_test,t_test) = load_mnist(normalize=True)
# 创建网络
network = MultiLayerNet(input_size=784,hidden_size_list=[100,100,100,100,100,100],output_size=10)
# 优化器
optimizer = SGD(network.parameters(), lr = 0.01)
# 损失函数
loss_func = MSE()
# 参数设置
max_epochs = 201
train_size = x_train.shape[0]
batch_size = 100
# 训练轮数
for i in range(max_epochs):# 随机选择训练样本batch_mask = np.random.choice(train_size,batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]optimizer.zero_grad() # 梯度参数归零out = network(x_batch) # 正向传播loss = loss_fun(out, t_batch) # 计算损失loss.backward() # 反向传播optimizer.step() # 梯度参数更新if(best > loss.item()):best = loss.item()save_network(network) # 指标更好,保存当前网络

本文章只是简单介绍一些基础学习笔记,一些优化的trick并没有讲。比如BatchNormization,dropout,过拟合的处理等等。

总结

    个人感觉其实神经网络其实就是一个万能的拟合器,训练神经网络的过程,就是让计算机自己从大量的数据中寻找一条公式。这些数据有输入,输出结果,就是中间的函数映射是未知的,寻找的就是这些未知的映射。我们创建的神经网络,就是假定了函数的很多参数,通过损失函数,丈量与实际真实结果之间的距离。目标就是缩小之间的距离,而这个过程就相当于寻求一个函数的最低点,最低点的特征是导数为0,因此反向传播求导是获取了探寻最低点的方向,学习率就是前进的步长。然而最低点其实也是局部最优,为了更好的找到全局最优,也有很多的优化策略,比如余弦退火。
    这里只介绍了一些基础算法过程,到后面的卷积神经网络原理也是一样的。

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

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

相关文章

在Linux下搭建go环境

下载go go官网&#xff1a;All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上&#xff0c;也可以直接web下载&#xff1a; wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压&#xff1a; tar -x…

关于前端布局的基础知识

float 横向布局 float 实现横向布局&#xff0c;需要向横着布局的元素添加float 其值left right 存在问题 如果使用float 所在父级五高度&#xff0c;会导致下方的元素上移 top的高度被吞了 解决方法&#xff1a; 给父级元素设置高度&#xff1a;不推荐&#xff0c;需要给父级…

专题◉万字长文!盘点过去一年最出圈的Prompt项目教程,有3份在悄悄更新

1. OpenAI 官方出品 | 提示工程最权威的教程 (最新版) 2023年6月&#xff0c;OpenAI 发布了一篇〖*GPT Best Practice (GPT 最佳实践)* 〗教程&#xff0c;详细介绍 ChatGPT Prompt 交互策略&技巧&#xff0c;并且给出了示例说明。 一年时间过去了&#xff0c;OpenAI 不…

Axure RP实战:打造高效文字点选验证码

Axure RP实战&#xff1a;打造高效文字点选验证码 前言 在数字时代&#xff0c;网络安全和用户体验是设计在线表单时的两大关键考量。 验证码作为一种验证用户身份的技术&#xff0c;已经从简单的数字和字母组合&#xff0c;发展到了更为复杂和用户友好的形式。 今天&#…

数量关系:成本售价利润问题

问&#xff1a;某品牌服装&#xff0c;甲店进货价比乙店便宜10%&#xff0c;两店同时按20%的利润定价&#xff0c;这样1件商品乙店比甲店多赚4元&#xff0c;乙店的定价是多少元?() A 200 B 216 C 240【正确答案】 D 300标准答案&#xff1a;设乙店的进货价为x,则甲店的为0.9x…

灵办AI:解锁办公新境界,让工作更智能、更高效!

在这个信息爆炸的时代&#xff0c;我们每个人都在寻找能够提升效率、简化工作流程的工具。如果您正在寻找一个能够全方位提升工作效率的AI助手&#xff0c;那么灵办AI绝对值得您的关注。 为什么选择灵办AI&#xff1f; 在众多AI工具中&#xff0c;灵办AI凭借其卓越的性能和独…

Python数据采集与网络爬虫技术实训室解决方案

在大数据与人工智能时代&#xff0c;数据采集与分析已成为企业决策、市场洞察、产品创新等领域不可或缺的一环。而Python&#xff0c;作为一门高效、易学的编程语言&#xff0c;凭借其强大的库支持和广泛的应用场景&#xff0c;在数据采集与网络爬虫领域展现出了非凡的潜力。唯…

【微信小程序】导入项目

1.在微信开发工具中&#xff0c;点击【导入项目】 2.在打开的界面中执行2个步骤 1.找到要导入项目的路径2.AppID要改成自己的AppID 3.package.json包初始化【装包之前要确保有package.json文件】 1.在【资源管理器】空白处&#xff0c;点击鼠标右键&#xff0c;选择【】&am…

显示中文字体问题解决:ImportError: The _imagingft C module is not installed

使用opencv写入中文时&#xff0c;用以下代码会导致乱码&#xff1a; cv2.putText(im0, f"{label}:{score}", (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,255,0), 3)因此需要借助PIL库写入中文字符&#xff0c;用法如下&#xff1a; import cv2 from PIL impo…

一个简单的springboot项目(有源码)

开发一个springboot项目 代码迭代整合工具 gitee建模意义程序处理方式开发功能的步骤web服务网络状态码 web应用的开发分层springboot的作用 springboot框架搭建框架中各组件作用框架的演变如何提取hive中的表结构创建springboot 工程的引导模版 要选择aliyun &#xff0c;否则…

回顾MVC

Tomcat是servlet的容器,想用HttpServlet需要导入tomcat jar包 下图是没用springmvc时的场景&#xff0c;首先在web.xml里面配置访问路径为/Hello然后 通过get请求去调用login方法最后重定向到index.jsp中 index.jsp里面的内容 重定向到index.jsp中 在控制台获取到username里面的…

uniapp video标签无法播放视频

当video标签路径含有中文以及特殊字符视频就会无法播放 解决方法使用encodeURIComponent对路径进行加密处理 videoSrc data.coursewareFile? ${appConfig.apiUrl encodeURIComponent(data.coursewareFile)}: "";最后效果

突破编程 C++ 设计模式(组合模式)详尽攻略

在软件开发中&#xff0c;设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性&#xff0c;还能帮助团队更好地进行协作。在这篇文章中&#xff0c;我们将深入探讨组合模式——一种结构型设计模式。 组合模式允许你将对象组合成树形结…

FUNCTION_ALV 下拉框的实现

下拉框可以用drdn_field或者使用DRDN_HNDL&#xff0c;这个文章主要是下拉框的基本使用&#xff0c;核心就是在fieldcat内表里面设置好下拉框的字段或者组的编号 文章目录 drdn_field使用DRDN_HNDL复制状态完整代码核心代码运行结果 drdn_field 使用DRDN_HNDL 复制状态 完整代码…

不仅仅是文化:解决常见安全问题根源

今年&#xff0c;GitLab对DevSecOps专业人士的年度调查发现了一些与组织文化相关的问题&#xff0c;这些问题可能会阻碍工程团队和安全团队之间的更深层次协调。 大多数(58%)的安全受访者表示&#xff0c;他们很难让开发部门优先修复漏洞&#xff0c;52%的人表示&#xff0c;繁…

fastjson序列化时过滤字段的方法

在使用fastjson进行序列化时&#xff0c;可能需要根据实际需求过滤掉某些字段&#xff0c;以避免将敏感信息或不必要的字段发送到客户端。fastjson提供了多种灵活的方式来实现这一需求。以下整理了fastjson序列化时过滤字段的几种常用方法。 方法一&#xff1a;使用fastjson的…

【CVPR‘23】CompletionFormer:用于深度补全的 Transformer 网络!已开源

【CVPR23】CompletionFormer:用于深度补全的 Transformer 网络! 摘要方法3.1 RGB 和深度嵌入3.2 联合卷积注意力和 Transformer 编码器3.3 解码器3.4 SPN 精化和损失函数主要贡献实验结果论文地址:https://openaccess.thecvf.com/content/CVPR2023/papers/Zhang_CompletionF…

【专项刷题】— 链表

1、2两数相加 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 只要有任意一个链表还没有为空的时候就继续加&#xff0c;当链表为空的时候但是t不尾0&#xff0c;还是进入循环进行操作 代码&#xff1a; public ListNode addTwoNumbers(ListNode l1, ListNode l2) {…

Git学习(001 git介绍以及安装)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第1p-第p4的内容 文章目录 介绍Git介绍GitLab介绍 概述Git安装版本控制工具介绍 介绍 Git介绍 GitLab介绍 相当于中央仓库 概述 Git安装 进入官网(下载当前版本 2.43.0) …

AD原理图Update成PCB时提示Comparator Results的原因

在使用AD20把原理图转换成PCB时&#xff0c;AD提示 【原理图导入PCB时提示ECO的原因】 解释是&#xff1a; 原理图中存在元件未添加PCB封装。 验证 1、从右下角的panels打开messages 2、Validate PCB Project 3、warning中的确提示有元器件缺少封装 在更改添加了原理图中的元…