当前位置: 首页 > news >正文

深度学习基础小鱼书笔记

深度学习基础Python小鱼书笔记(部分)

感知机

1.基础公式:

w1x1+w2x2>θ w_1x_1+w_2x_2>\thetaw1x1+w2x2>θ

w_1 w_2 为权重,x_1 x_2 为输入信号,y 为输出信号(输出0或1)

此时神经元被激活,y的值为1;反之,y的值为0。其实就是模仿生物学中的神经元。
w1x1+w2x2+b>0 w_1x_1+w_2x_2+b>0w1x1+w2x2+b>0
此式子加了个b(偏置),实际上b就是(-theta),这样直接和0比较就能判断神经元是否被激活。

2.与Numpy的联系:
>>> import numpy as np >>> x = np.array([0, 1]) #输入 >>> w = np.array([0.5, 0.5]) # 权重 >>> b = -0.7 #偏置 >>> w*x array([ 0. , 0.5]) >>> np.sum(w*x) 0.5 >>> np.sum(w*x) + b-0.19999999999999996 # 大约为-0.2(由浮点小数造成的运算误差)

直接使用"numpy"中对于数组进行相乘,相加直接实现或与非门的模仿

3.各种门的实现:
#与门:defAND(x1,x2):x=np.array([x1,x2])w=np.array([0.5,0.5])b=-0.7tmp=np.sum(w*x)+biftmp<=0:return0else:return1#与非门:defNAND(x1,x2):x=np.array([x1,x2])w=np.array([-0.5,-0.5])# 仅权重和偏置与AND不同!b=0.7tmp=np.sum(w*x)+biftmp<=0:return0else:return1#或门:defOR(x1,x2):x=np.array([x1,x2])w=np.array([0.5,0.5])# 仅权重和偏置与AND不同!b=-0.2tmp=np.sum(w*x)+biftmp<=0:return0else:return1

Q:这个b的取值有点随机…为什么去0.7,0.2而不取0.6,0.3等等?

  1. 这些值不是唯一的:存在一个连续的范围可以工作
  2. 作者的选择是合理的:在可行范围内选择了简单、对称的值
  3. 对于教学目的:使用这些值可以让读者看到三种门的相似性和差异性
  4. 实际应用中:这些参数通常通过训练(如感知机学习算法)得到,而不是手动设置
4.异或门

(单层感知机局限性)

仅当x1或x2中的一方为 1时,才会输出1(“异或”是拒绝其他的意思)

x1x2y
000
101
011
110

————单层感知机是无法实现这个异或门的————感知机也有局限

Why?

可以在坐标轴上面画一个有各种情况构成的(x1,x2)的四个点,以及他们对应的y值(三角形表示1,圆形表示0),看能不能在坐标轴上画一条直线把它们分开。如下图,无法在坐标轴上面画出一条直线把三角形和圆形分开。

解决方案?

改为非线性曲线,用弯曲的曲线来分成两个区域————看下一节多层感知机,可以由此实现非线性的功能

5.多层感知机

(异或门的实现以及感知机的高级功能)

通过组合各个感知机,能实现多种感知机包括异或门

x1x2s1s2y
00100
10111
01111
11010

如上述表格,正好满足异或门的要求

#代码实现defXOR(x1,x2):s1=NAND(x1,x2)s2=OR(x1,x2)y=AND(s1,s2)returny

通过叠加层(加深层),感知机能进行更加灵活的表示。

6.Summary

感知机这一章结束!

看完这一章,我掌握了或门,与门,非门,异或门的逻辑含义,并通过公式了解到如何在Python中实现感知机的功能。还有很重要的多层感知机,可以表达出单层感知机达不到的非线性作用。

Q:不会构建多层感知机,比如说那个异或门我就看的很懵,是怎么构建出来的?

Q:对于那几个基本的逻辑门还是需要再去熟悉一下。

神经网络

1.基本概况
机器自动找到合适的权重

​ 神经网络的一个重要性质就是从数据中自己学习的到合适的参数权重

结构

输入层————中间层————输出层

​ 几层网络的判定:输入层,隐藏层,输出层总数减一(表示神经元有权重的数量)

2.激活函数

感觉就像感知机的基础公式,就是展现了实现原理

激活函数计算过程:把前面感知机加权计算过程的结果转为某个数a,然后再通过某个函数判断正负即可。————此类超过阈值就激活的函数被称之为阶跃函数,此类函数就正好是感知机的应用。阶跃函数是激活函数的一种。

其他激活函数:

sigmoid函数


h(x)=11+e−x h(x) = \frac{1}{1 + e^{-x}}h(x)=1+ex1

根据图像,我感觉他是相较于那么激烈的函数是比较平缓的。

阶跃函数在使用时的 Numpy技巧

1.缺陷:

使用单独值传递时,不能传递数组,会导致对于传入数据不太方便,只能传递浮点数

def step_function(x): if x > 0: return 1 else: return 0

2.改进

把Numpy数组传入,然后将其中的数按照政府改为布尔类型,再改为000111类型。从而实现Numpy数组的传入。

>>> import numpy as np >>> x = np.array([-1.0, 1.0, 2.0]) >>> x array([-1., 1., 2.]) >>> y = x > 0 >>> y array([False, True, True], dtype=bool) >>> y = y.astype(np.int) >>> y array([0, 1, 1]) #数组中大于0的转换为1,小于0的转换为0。从而实现数组类型的转换

Q:这个技巧具体有什么用?我现在还看不太出来:之后再看我估计我就能看懂了

函数的图型表示

使用图形来表示上述阶跃函数。(用到matplotlib)

import numpy as np import matplotlib.pylab as plt def step_function(x): return np.array(x > 0, dtype=np.int) x = np.arange(-5.0, 5.0, 0.1) y = step_function(x) plt.plot(x, y) plt.ylim(-0.1, 1.1) # 指定y轴的范围 plt.show() #np.arange(-5.0, 5.0, 0.1)在−5.0到5.0的范围内,以0.1为单位,生成NumPy数组([-5.0, -4.9, ..., 4.9]).step_function()以该NumPy数组为参数,对数组的各个元素执行阶跃函数运算,并以数组形式返回运算结果。

对于上述代码还是有点不太熟练。

这个函数的理解:

生成了把阶跃函数转化为010101形式,展示出-5–5的函数图像

图像如下图:

sigmoid函数的代码实现
def sigmoid(x): return 1 / (1 + np.exp(-x)) >>> x = np.array([-1.0, 1.0, 2.0]) >>> sigmoid(x) array([ 0.26894142, 0.73105858, 0.88079708]) #Q为什么能对于Numpy数组用?展现出了它的广播功能,只要注意与上面的阶跃函数不太一样罢了。

对于广播功能,怎么再这个函数中得到应用的?

两种函数的比较

阶跃函数与sigmoid函数:

阶跃函数sigmoid函数
连续变化性剧烈平缓
返回值0和1多种小数等

共同点:

  • 两者的结构均是“输入小时,输出接近0(为0); 随着输入增大,输出向1靠近(变成1)”。也就是说,当输入信号为重要信息时, 阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时, 两者都输出较小的值。

  • 还有一个共同点是,不管输入信号有多小,或者有多 大,输出信号的值都在0到1之间

  • 二者都是非线性函数(线性函数是一条笔直的直线)

  • 为了发挥叠加层所 带来的优势,激活函数必须使用非线性函数

  • 如果是线性的还不如直接用函数表示,因为线性是一条直线,展示不出多层神经网络带来的优势

ReLU函数

含义:ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输 出0

def relu(x): return np.maximum(0, x)
3.多维数组的运算
多维数组
  • 通过np.dim()函数获得数组的维度
  • 通过__.shape函数获得数组的形状 注意,返回的结果是个元组(是因为一维数组的情况下也要返回和多维数组的情况下一致的结果)
  • 通过__.shape[]函数获得数组某一行的形状 获得一个数字

二维数组也被称作矩阵

矩阵乘法

矩阵的乘积是通过左边矩阵的行(横向)和右边矩阵的列(纵 向)以对应元素的方式相乘后再求和而得到的

哦哦,大致理解,不过这种矩阵乘法的方式有点陌生,需要再去记一记

公式对应:np.dot(A, B)

np.dot()接收两个NumPy数组作为参数,并返回数组的乘积。这里要注意的是,np.dot(A, B)和np.dot(B, A)的 值可能不一样。和一般的运算(+或*等)不同,矩阵的乘积运算中,操作数(A、 B)的顺序不同,结果也会不同

!!顺序不同,结果也有可能不同!!

在运行矩阵乘法时:

  • 保持一致!
    • 注意要是矩阵的0维的列数和相乘矩阵的行数相等,否则无法进行乘法,会出现错误

结果C矩阵也是由A和B共同决定的,矩阵C的形状是由**矩阵A的行数矩阵B的列数构成的**

通过矩阵的乘积一次性完成计算的技巧,在 实现的层面上可以说是非常重要的

4.三层神经网络的实现

主要是理解那个 w 的符号含义,在后续写公式时很有用。例题如下:


一般地,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数, 多元分类问题可以使用softmax函数。

溢出

指的是在计算过程中,出现了比精度更长的数,导致程序对于数据的处理没有那么准确,容易出现错误。比如说softmax函数中的分母,就很容易出现内存溢出导致计算错误。

softmax函数

对于上式所说的内存溢出的问题,可以利用它的一个特性来解决,就是在指数上减去数组中最大的一个数。

def softmax(a): c = np.max(a) exp_a = np.exp(a - c) # 溢出对策 sum_exp_a = np.sum(exp_a) y = exp_a / sum_exp_a return y

特性:输出总和是1./体现在将输出都转换为其所占的比例中。

因此,可以将其解释为概率。

解释为概率又有什么用处呢?

在下一章会有不小的用处

在MNIST数据集上实现数字的识别

具体实践看我手写的文件夹,其中我进行了对于MNIST数据集的实操演练。

神经网络的学习

概述

就像我们人学习去识别数字,文字等,我们往往很容易去识别出什么数字是什么数字,但是我们很难用程序去精确量化分析来区别它们之间的差别。

所以,机器学习来了:

神经网络的就是来解决这些问题的————通过一个完全没有人为干预的程序实现对于难以描述区别的图像进行区分与分类。

正像我之前在做人脸识别小组作业的过程中学习到的三元组优化损失,人脸识别也正如此,先统一人脸,正如书中所提出的正规化,提高程序的鲁棒性。三元组优化损失我觉得正是训练机器学习的一个方法。“黑箱原理”,不问过程直接出结果。端到端机器学习:从输入数据到输出数据过程全程没有人工参与。

关于对于数据的处理

数据分为两类:训练数据(也叫做监督数据)与测试数据 (他们的作用不言而喻)

泛化能力是机器学习的最终目标:就是让机器能够在最大准确率上能够识别出从未见过的数字等。

判断结果对于某个数据集过于成功而对于其他数据集表现得很糟糕,这种现象被称为过拟合,会导致其泛化能力比较弱。

根据以上分析,我可以推断得出:

1.数据的收集也非常重要,我觉得数据如果收集的“多样性”较高,它的过拟合我觉得就不太可能出现。

损失函数

作为指标帮助神经网络寻找最佳权重

一般使用均方误差交叉熵误差

这两种误差我还是不太清楚,他们具体代表的表达式我不太理解

即当前的 神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。

Q欸,如果误差越小,表明其与数据拟合度越高,也可能出现过拟合么

如果给损失函数乘上一个负值,就可以解释为“在多大程度上不坏”, 即“性能有多好”

均方误差:


yk是表示神经网络的输出tk表示监督数据k表示数据的维数

最后的结果为整数,越小越说明它的拟合效果越好,程序的结果越好。

ONE—HOT表示:对于输出正确的数据表示为1,其他为0.

def mean_squared_error(y, t): return 0.5 * np.sum((y-t)**2)
交叉熵误差

tk中只有正确解标签的索引为1,其他均为0(one-hot表示)

def cross_entropy_error(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta))
计算总共的平均的损失

​ 由于前面的误差仅仅是对于单个数据进行误差的计算,而对于大量数据的平均损失计算,去全部计算是不现实的。而如果我们去从庞杂的数据中去随机找寻一部分,有这一部分的平均来近似表示总共的损失作为指标,是解决问题的方法。

np.random.choice(60000,10)#会从0到59999之间随机选择10个数字
  • np.sum((y-t)**2)
###### 交叉熵误差 [外链图片转存中...(img-6FVVSUJl-1772937414098)] tk中只有正确解标签的索引为1,其他均为0(one-hot表示) ```Python def cross_entropy_error(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta))
计算总共的平均的损失

​ 由于前面的误差仅仅是对于单个数据进行误差的计算,而对于大量数据的平均损失计算,去全部计算是不现实的。而如果我们去从庞杂的数据中去随机找寻一部分,有这一部分的平均来近似表示总共的损失作为指标,是解决问题的方法。

np.random.choice(60000,10)#会从0到59999之间随机选择10个数字
http://www.jsqmd.com/news/454229/

相关文章:

  • 三门问题贝叶斯法是所求非所问——错位解析(数学等价概率不等价)
  • SmolVLM模型结构
  • 从组合总和到回溯模板:大厂算法面试的万能钥匙
  • P1437 敲砖块 Sol
  • 游戏上市公司合同系统实施复盘(一):当“功能落地”遇上“蓝图未定”,我们错在哪?
  • # 别追着新工具跑了!真实的小公司AI Coding落地生存指南
  • 2026最新防腐涂料及工程推荐!水池/混凝土/储罐/地坪/钢结构适用权威榜单 - 十大品牌榜
  • 多动症是什么?主要有哪些早期识别及治疗方法?
  • MySQL进阶版第二课时
  • 说说湖南成人专升本培训,哪家品牌靠谱且性价比高? - 工业设备
  • 计算机毕业设计springbootNBA体育赛事直播平台 基于SpringBoot的篮球赛事在线直播与数据管理系统 基于Java的NBA球赛实时转播与信息服务平台
  • YOLO26改进75:全网首发--c3k2模块添加FFCM模块:在空间域和频域同时执行卷积操作,兼具局部-全局特征捕获能力与高效性
  • 聊聊上海好用的DTSS认证服务商,上海擎标口碑如何? - 工业品网
  • 基于ANSYS的小型温室的温湿度场对流分析(任务书+开题报告+文献综述+仿真+毕业论文+答辩PPT)
  • 行业内有实力的百度推广公司推荐
  • 计算机毕业设计springboot校园药送达 高校医药配送服务平台 校园智慧药品快送系统
  • ubuntu 安装 Redis
  • OpenClaw基础-4-三分钟完成QQ机器人接入
  • Linux生态下HTTP协议解析+进阶HTTPS证书:抓包、拆解与问题排查实战
  • 博图中水处理系统PLC程序设计:电机智能启停与轮训实现
  • Redis 核心原理解析:跨越次元壁的“快”
  • WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程
  • 改了Windows用户文件夹名称之后,IntelliJ IDEA打不开
  • 上海普陀区有实体样板间可参观的公寓装修公司
  • 前端实习后的感受:实习要注意什么?实习怎么提升效率?
  • Virus-BeautyCode
  • 高清4k手机电脑壁纸
  • Jmeter分布式压测,一篇搞定。。。
  • 【ASP.NET CORE】 4. 集成配置系统、分层架构
  • 什么是Lambda表达式,为什么要用Lambda表达式,你在哪里使用过