深度学习入门笔记

news2024/11/13 12:01:37

深度学习入门笔记

  • 感知机
    • 逻辑与门
    • 与非门
    • 或门
    • 多层感知机
    • 异或门
  • 神经网络
    • 激活函数
    • 输出层设计
    • 损失函数
      • 均方误差 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 0
    else:
        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 0
    else:
        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 0
    else:
        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.coloradmin.cn/o/2096768.html

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

相关文章

Navicat连接Mongodb成功了,但是无法显示数据库怎么办?

不知道你是否遇到过&#xff1f;Navicat连接Mongodb成功了&#xff0c;但是无法显示数据库怎么办&#xff1f; 解决办法 这个问题比较坑&#xff0c;对于第一次接触的小伙伴&#xff0c;可能会一脸懵逼&#xff0c;原因就是在Navicat中默认会不显示隐藏的项目&#xff0c;如果不…

产品/运营经理的数据分析思维和学习路径

数据分析是产品经理和运营同学必知必会的技能之一&#xff0c;该技能会贯穿到产品经理和运营同学的整个职业生涯。 产品经理不需要成为数据分析方面的专家&#xff0c;但分析哪些数据、如何分析数据、如何用数据辅助决策、如何用数据驱动业务&#xff0c;这些是产品和运营同学…

C++学习笔记之指针(基础)

C学习笔记之指针&#xff08;基础&#xff09; https://www.runoob.com/cplusplus/cpp-pointers.html C/C中的指针内容是早就盛名在外了&#xff0c;当然了&#xff0c;想要随心所欲地使用也是要做很多功课的&#xff0c;先简单了解下吧~ 首先&#xff0c;我们需要了解一点内存…

STM32基础篇:RTC × Unix时间戳 × BKP

Unix时间戳 最早是在Unix系统使用的&#xff0c;之后很多由Unix演变而来的系统也都继承了Unix时间戳的规定。目前&#xff0c;Linux、Windows、安卓这些系统&#xff0c;其底层的计时系统都是使用Unix时间戳。 Uinx时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/…

论文速读|ReKep:空间时间理论的关系关键点约束,用于机器人操作

项目地址&#xff1a;ReKep | Spatio-Temporal ReasoningReKep | Spatio-Temporal Reasoning of Relational Keypoint Constraints for Robotic ManipulationReKep | Spatio-Temporal Reasoning ReKep&#xff08;Relational Keypoint Constraints&#xff09;是一种基于视觉的…

Nebula: 无服务器计算中的性能和能源效率 - WebAssembly与Docker的比较研究

这篇论文的标题是《Nebula: Performance and Energy Efficiency in Serverless Computing - A Comparative Study of WebAssembly and Docker》&#xff0c;作者是 Marius Nilsen Kluften&#xff0c;来自奥斯陆大学&#xff08;University of Oslo&#xff09;的信息学系。论文…

android仿assistivetouch悬浮窗实现(带功能实现)

一、悬浮窗点击后的界面&#xff1a; 主要有四个功能&#xff0c;返回、应用程序、退出和主界面。其他功能也可以类似添加。 界面布局代码就不贴出来了&#xff0c;源码&#xff08;切记需要签名才能让功能实现&#xff09;&#xff1a;下载地址 二、主要是检测系统启动或者a…

时序数据库荣登巅峰,被央视报道了!

8月30日&#xff0c;事务处理性能委员会TPC正式公布了最新的国际权威数据库性能基准榜单&#xff0c;“清华系”发起研制的Apache IoTDB开发的国产化时序数据库软件TimechoDB&#xff0c;在性能和系统成本维度上双双打破世界纪录。在央视《24小时》节目中&#xff0c;1分34秒重…

《黑神话:悟空》与游戏经济学的深度剖析

《黑神话&#xff1a;悟空》作为近年来备受瞩目的国产3A游戏大作&#xff0c;自其发布以来&#xff0c;不仅在游戏界内引起了轰动&#xff0c;更在多个消费领域产生了深远的影响。这款游戏不仅以其卓越的品质和深刻的文化内涵吸引了大量玩家的关注&#xff0c;还通过一系列连锁…

神策埋点 sensorsdata.es6.min.js、sensorsdata.min.js 触发eslint 语法检查,导致打包不成功

问题描述&#xff1a; 在使用神策埋点时&#xff0c;下载的web js sdk&#xff0c;打包时eslint 语法检查&#xff0c;会导致打包不成功。npm start没问题。 主要错误是&#xff1a; Line 1:204272: Expected an assignment or function call and instead saw an expression …

[Python]之深拷贝与浅拷贝

Python之深拷贝与浅拷贝 概述: ​ 大白话解释就是 深拷贝拷贝的多, 浅拷贝拷贝的少. 深浅拷贝区别就是: 拷贝的层级的多与少. 深浅拷贝都能操作可变类型 和 不可变类型, 但是深浅拷贝一般操作的都是 可变类型, 几乎不会出操作不可变类型的. 可变类型 和 不可变类型的划分依…

openssl RSA 密钥(key)、证书签名请求(csr)、证书(cer)的生成和例子

1. RSA 密钥(key)、证书签名请求&#xff08;csr&#xff09;、证书&#xff08;cer&#xff09;的生成顺序 2. 具体操作 a. 生成 RSA 密钥&#xff08;私钥&#xff09; openssl genrsa -aes256 -out ca.key 2048b. 生成证书签名请求(csr) # C-----国家&#xff08;Country…

Oracle超详细(数据库编程)

目录 一、数据类型 &#xff08;一&#xff09;数值型数据类型 &#xff08;二&#xff09;字符型数据类型 &#xff08;三&#xff09;日期和时间型数据类型 &#xff08;四&#xff09;大对象和二进制数据类型 &#xff08;五&#xff09;其他数据类型 &#xff08;六&…

离散余弦变换(Discrete Cosine Transform, DCT),信号去噪

介绍 离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;是一种常用的信号处理工具&#xff0c;特别是在数据压缩、图像处理和模式识别等领域中。DCT的基本思想是将信号从空间域或时间域转换到频率域&#xff0c;以揭示信号中的频率成分。与离散傅里叶变换&…

C/C++网络编程--文件分块传输

文件分块传输是网络编程中一个常见的任务&#xff0c;尤其是在处理大文件时&#xff0c;将文件分块可以提高传输效率&#xff0c;简化错误处理&#xff0c;并可以实现并发传输。下面&#xff0c;写个从客户端向服务器发送大型数据的demo。 客户端 客户端有两点需要注意&#…

vue组件中的数据传递(2)--子组件传父组件

两种情况 子主动传 vue 父传子 子传父实现方式_vue父传子-CSDN博客 vue父子组件传值&#xff0c;父传子&#xff0c;子传父_父传子 且随时变化-CSDN博客 父主动要 Vue2.0的三种常用传值方式、父传子、子传父、非父子组件传值_父传子传-CSDN博客

File Transfer Server 文件传输服务器插件

您需要在本地不同设备之间传输文件吗?现在你可以做到了,你不必安装任何专用服务器。 文件传输服务器为您的游戏或应用程序添加了将文件从任何受支持的平台传输到任何受支持平台的能力。从移动到独立,从移动到移动等(查看支持的平台) 优势: -完整的源代码可用。 -不需要预…

【揭秘心梗元凶】不容忽视的七大生活习惯,竟是心梗“幕后推手”!

在这个快节奏的时代&#xff0c;心梗&#xff08;急性心肌梗死&#xff09;这一健康杀手正悄然逼近&#xff0c;威胁着越来越多人的生命安全。心梗不仅发病急骤&#xff0c;后果往往也极为严重。那么&#xff0c;心梗究竟是如何引起的&#xff1f;今天&#xff0c;我们就来揭开…

Leetcode面试经典150题-239.滑动窗口最大值

解法都在代码里&#xff0c;不懂就留言或者私信 官方定级hard难度&#xff0c;其实是medium&#xff0c;确实字节考过 class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length 1) {return new int[]{nums[0]};}/**我们要返回的是一个数组&#…

SoM的理解

对于终端客户来说&#xff0c;要思考到底怎么做一款产品。目前好像主流的就是SoC和SoM。以前联发科是有Turnkey项目&#xff0c;不过我记得我参与的项目&#xff0c;都是直接拿原厂的参考设计&#xff0c;基本上就是改一个壳&#xff0c;电路板&#xff0c;IO啥的都不动&#x…