机器学习深度学习——预备知识(上)

深大的夏令营已经结束,筛选入营的保研er就筛选了1/3,280多的入营总人数里面双非只有30左右。
最终虽然凭借机试拿到offer了,但是我感受到了自己的明显短板,比如夏令营的舍友就都有一篇核心论文,甚至还有SCI一区一作的。
既然,学历和没过六级这件事在9月份之前都没办法弥补,现在也只有狂肝科研了,希望9月份预推免之前能够赶出来一点点成果也好。
首先把机器学习&&深度学习入门一下,里面包含了一些数学、线性代数、概率论的知识,这刚好也是将来9月预推免的面试中容易被问到的,所以就坚持着全复习完。

机器学习&&深度学习——预备知识(上)

  • 1 数据操作
    • 1.1 入门
    • 1.2 运算符
    • 1.3 广播机制
    • 1.4 索引和切片
    • 1.5 节省内存
  • 2 数据预处理
    • 2.1 读取数据集
    • 2.2 处理缺失值
  • 3 线性代数
    • 3.1 标量
    • 3.2 向量
    • 3.3 矩阵
    • 3.4 张量算法的基本性质
    • 3.5 降维
    • 3.6 点积
    • 3.7 矩阵-向量积
    • 3.8 矩阵-矩阵乘法
    • 3.9 范数

1 数据操作

无非就是两件事:
(1)获取数据
(2)处理并存储数据

1.1 入门

张量表示一个由数组组成的数组,可能有多个维度。一维的叫向量,二维的叫矩阵。
下列直接给出代码和注释查看pytorch对张量的操作:

import torch

# 使用arrange创建一个行向量
x = torch.arange(12)
print(x)

# 可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状
print(x.shape)

# 张量中的元素总数
print(x.numel())

# 改变形状而不改变元素的数量和元素值
X = x.reshape(3, 4)
print(X)

# 输出全0、全1矩阵
print(torch.zeros(2, 3, 4))
print(torch.ones(2, 3, 4))

# 创建一个形状为(3,4)的张量,每个元素都是从均值为0,标准差为1的正态分布中随机采样
print(torch.randn(3, 4))

# 还可以直接创建Python列表
print(torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]))

运行结果:

tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
torch.Size([12])
12
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
tensor([[ 1.5651, -0.2855, -0.4439,  0.5795],
        [-1.3375, -1.3290, -0.1183, -1.0676],
        [ 0.0334, -2.0030, -1.0172,  0.7654]])
tensor([[2, 1, 4, 3],
        [1, 2, 3, 4],
        [4, 3, 2, 1]])

1.2 运算符

代码:

import torch

# 对于相同形状的张量,常见的标准算术运算符:加减乘除和指数
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
ans = (x + y, x - y, x * y, x / y, x ** y)
print(ans)

# 也可以实现求幂,如e^x
print(torch.exp(x))

# 张量也可以端对端的连接起来,只需要提供张量列表并给出沿哪个轴连结
# 下面给出的两个张量:
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
# 可以发现这是二维的,轴就有两个。轴0表示行,轴1表示列
# 按照轴0来连接,也就是连接行
print(torch.cat((X, Y), dim=0))
# 按照轴1来连接,也就是连接列
print(torch.cat((X, Y), dim=1))

# 通过逻辑运算符构建二元张量:
print(X == Y)

# 若对张量中的所有元素求和,会产生单元素张量
print(X.sum())

运行结果:

(tensor([ 3.,  4.,  6., 10.]), tensor([-1.,  0.,  2.,  6.]), tensor([ 2.,  4.,  8., 16.]), tensor([0.5000, 1.0000, 2.0000, 4.0000]), tensor([ 1.,  4., 16., 64.]))
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [ 2.,  1.,  4.,  3.],
        [ 1.,  2.,  3.,  4.],
        [ 4.,  3.,  2.,  1.]])
tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],
        [ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],
        [ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]])
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])
tensor(66.)

1.3 广播机制

如果两个张量的形状不同,可以通过调用广播机制来执行按元素操作:
1、通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
2、对生成的数组执行按元素操作。
代码:

import torch
# a为3×1,b为1×2,那么就将a复制列,b复制行
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
print(a + b)

运行结果:

tensor([[0, 1],
        [1, 2],
        [2, 3]])

1.4 索引和切片

第一个元素的索引是0,最后一个元素索引是-1。这个没什么好说的

1.5 节省内存

运行一些操作可能会导致为新结果分配内存。 例如,如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。
用Python的id()函数演示了这一点, 它给我们提供了内存中引用对象的确切地址。 运行Y = Y + X后,我们会发现id(Y)指向另一个位置。 这是因为Python首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。

before = id(Y)
Y = Y + X
print(id(Y) == before)

最终输出False
但是这并不可取,原因有二:
1、我们不想总是不必要地分配内存。通常情况下,我们希望原地执行这些更新;
2、如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
执行原地操作代码:

# 使用切片表示法将操作的结果分配给先前分配的数组
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))

结果:

id(Z): 139931132035296
id(Z): 139931132035296

如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销:

before = id(X)
X += Y
print(id(X) == before)

输出True

2 数据预处理

为了用深度学习解决现实问题,常要从预处理原始数据开始,而不是从准备好的张量格式数据开始。

2.1 读取数据集

代码如下:

import os
import pandas as pd

os.makedirs(os.path.join('D:/Pytorch', 'data'), exist_ok=True)
data_file = os.path.join('D:/Pytorch', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n') # 定义列(房间数量、巷子类型、房屋价格)
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

# 从创建的CSV文件中加载数据集,需要导入pandas包并调入read_csv函数。
data = pd.read_csv(data_file)
print(data)

运行结果:

   NumRooms Alley   Price
0       NaN  Pave  127500
1       2.0   NaN  106000
2       4.0   NaN  178100
3       NaN   NaN  140000

2.2 处理缺失值

”NaN“项代表缺失值,可使用插值法解决,用一个替代之弥补缺失值。
通过位置索引iloc,将data分成inputs和outputs,其中前者为data的前两列,后者为最后一列。对于inputs中缺少的数值,用同一列的值替换“NaN”项。
代码:

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

输出:

   NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN

对于inputs中的类别值或离散值,我们将“NaN”视为一个类别。 由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
代码:

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

结果:

   NumRooms  Alley_Pave  Alley_nan
0       NaN        True      False
1       2.0       False       True
2       4.0       False       True
3       NaN       False       True

3 线性代数

3.1 标量

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

print(x + y, x * y, x / y, x ** y)

最终输出:

tensor(5.) tensor(6.) tensor(1.5000) tensor(9.)

3.2 向量

可以视为标量值组成的列表,具有一定现实意义。如:一个预测贷款风险的模型,可能会将每个申请人与一个向量相关联,其分量与其收入、工作年限、过往违约次数和其他因素相对应。
生成向量:

x = torch.arrange(4)

可以直接通过索引来访问任一元素:

x[3]

3.3 矩阵

import torch

# 输出矩阵A
A = torch.arange(20).reshape(5, 4)
print(A)

# 矩阵转置:若B为A的转置,则对于任意i,j都有B(i,j)=A(j,i)
# 输出A的转置
print(A.T)

# 如果是方阵,那么其转置与其相同
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
print(B == B.T)

结果:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15],
        [16, 17, 18, 19]])
tensor([[ 0,  4,  8, 12, 16],
        [ 1,  5,  9, 13, 17],
        [ 2,  6, 10, 14, 18],
        [ 3,  7, 11, 15, 19]])
tensor([[True, True, True],
        [True, True, True],
        [True, True, True]])

3.4 张量算法的基本性质

任何按元素的一元运算都不会改变其操作数的形状。
1、两个矩阵按元素乘法称为Hadamard积;
2、将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

3.5 降维

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
# 直接得到矩阵A的和:
print(A.sum())

# 可以通过指定张量沿哪个轴来降维,如果通过求和所有的行元素来降维,则指定轴0
A_sum_axis0 = A.sum(axis=0)
print(A_sum_axis0, A_sum_axis0.shape)

# 汇总所有列的元素降维
A_sum_axis1 = A.sum(axis=1)
print(A_sum_axis1, A_sum_axis1.shape)

# 沿着行和列对矩阵求和,等价于对所有元素求和
print(A.sum(axis=[0, 1]))

# 求平均值,使用A.mean()或A.sum()/A.numer()
print(A.mean())

# 求平均值也可以沿指定轴降低张量维度
print(A.mean(axis=0))

结果

tensor(190.)
tensor([40., 45., 50., 55.]) torch.Size([4])
tensor([ 6., 22., 38., 54., 70.]) torch.Size([5])
tensor(190.)
tensor(9.5000)
tensor([ 8.,  9., 10., 11.])

3.6 点积

对于两个向量x,y,其点积为x的转置乘y,是相同位置的按元素乘积的和。

import torch

x = torch.arange(4, dtype=torch.float32)
y = torch.ones(4, dtype=torch.float32)
print(x, y, torch.dot(x, y))

# 也可以先按元素乘法,然后进行求和来表示两个向量的点积
print(torch.sum(x * y))

结果:

tensor([0., 1., 2., 3.]) tensor([1., 1., 1., 1.]) tensor(6.)
tensor(6.)

3.7 矩阵-向量积

其实就是一种特殊的矩阵乘法,使用函数torch.mv(A,x)即可实现矩阵A和向量x的积

3.8 矩阵-矩阵乘法

使用torch.mm(A,B)即可实现矩阵A和B的相乘。3.7和3.8的矩阵乘法学过线代都知道,不讲解了。

3.9 范数

非正式的说,向量的范数表示一个向量多大。这里的大小不涉及维度,而是分量的大小。
现代中,向量范数是将向量映射到标量的函数f。给定任意向量x,向量范数要满足一些属性:
在这里插入图片描述
深度学习中常用L1、L2范数,都是Lp范数的特例。
在这里插入图片描述
函数:

L1范数:torch.abs(u).sum()
L2范数:torch.norm(u)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一:Docker 的数据管理1.数据卷2.数据卷容器 二:端口映射三:容器互联(使用centos镜像)四:Docker 镜像的创建1.基于现有镜像创建2&am…

证书文件无法生成.p12

做好的证书文件在生成.p12文件的过程中遇到了.p12选项置灰且无法选择并导出的情况 解决办法 起初认为生成的空白 CertificateSigningRequest 有问题,反反复复尝试几次制作后均无效; 而后发现问题出在了钥匙串访问的选项问题上 ... 将顶部菜单 tab 由"所有选项"切换至…

从不同的使用场景认识STag26

当你买下STag26时, 你买到的是什么? 如果你是商超生鲜区的经理, 你买到的是在促销旺季时的高效与安心。 你不用再担心价格没有及时更新, 导致水果蔬菜的滞销。 毕竟,STag26能够一键改价,实时更新&#x…

项目:点餐系统1

项目简介:实现一个http点餐系统服务器,能够支持用户在浏览器访问服务器获取餐馆首页,进行菜品以及订单管理。 具体模型如下: 用户分类: 管理员:进行订单以及菜品管理(菜品&订单的增删改查&a…

【C#】using

文章目录 global 修饰符using 别名结合“global 修饰符”和“using 别名”static 修饰符来源 global 修饰符 向 using 指令添加 global 修饰符意味着 using 将应用于编译中的所有文件(通常是一个项目)。 global using 指令被添加到 C# 10 中。 其语法为…

LiveGBS流媒体平台GB/T28181功能-视频直播流媒体平台分屏展示设备树分组树记录上次分屏播放记录

LiveGBS视频直播流媒体平台分屏展示设备树分组树记录上次分屏播放记录 1、分屏展示1.1、单屏1.2、四分屏1.3、九分屏1.4、十六分屏 2、分屏记录3、搭建GB28181视频直播平台 1、分屏展示 LiveGBS分屏页面支持,多画面播放,支持单屏、四分屏、九分屏、十六…

Java-API简析_java.net.Proxy类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131881661 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

xcode15启动IOS远程调试

1.用数据线连接IPhone到macOS 2.打开xcode15,然后点击Window->Devices and Simulators 3.选中左边的Devices可看到已连接的IPhone,然后点击Connect via network使其选中. 选择后,左边的IPhone设备的右边出现一个地球图标,表示成功通过网络连接到IPhone 现在可断开数据线的…

GoogleLeNet Inception V1

文章目录 Inception V1Inception Modulenative versionInception module with dimensionality reduction1 * 1网络的降维说明 多个Softmax的输出整体结构 GoogleLeNet主要是把深度扩充到了22层,能增加网络深度而不用担心训练精度和梯度消失问题。 总共是提出了4个版…

Cilium系列-4-Cilium本地路由

系列文章 Cilium 系列文章 前言 在前文中我们提到, cilium install 默认安装后, Cilium 功能启用和禁用情况如下: datapath mode: tunnel: 因为兼容性原因,Cilium 会默认启用 tunnel(基于 vxlan) 的 datapatch 模式,也就是 overlay 网络结…

Python数据分析实战-datafram按某(些)列按值进行排序(附源码和实现效果)

实现功能 Python对datafram按某(些)列进行排序(附源码和实现效果) 实现代码 import pandas as pd# 读取数据 datapd.read_csv(E:\数据杂坛\\UCI Heart Disease Dataset.csv) dfpd.DataFrame(data) print(df.head())# # 按某列的…

【干货分享】如何恢复SOLIDWORKS 零件、装配体和工程图模板?

当我们卸载了SOLIDWORKS或者是购买了一台新笔记本电脑或是丢失了一直在使用的模板时,我们可以通过打开过去的零件、装配体和工程图文件来恢复 SOLIDWORKS 模板。 ▷ 零件模板 打开包含所需自定义属性的上一个部件。 保存零件的副本以避免对原始文件进行意外更改。…

React:从 npx开始

使用 npm 来创建第一个 recat 文件( react-demo 是文件名,可以自定义) npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令,用来简化 npm 中工具包的使用 原始: 全局安装npm i -g create-react-app 2 …

​《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(16)-Charles其他骚操作之大结局​

1.简介 今天就说一些Charles的其他操作、以及抓包跨域的问题和常见的问题如何解决。到此Charles这一系列的文章也要和大家说再见了,其他什么小程序、Android7.0等等的问题可以查看宏哥的Fiddler系列文章,只不过是将Fiddler换成Charles而已。 2.模拟403…

Qt - macOS 安装配置

文章目录 一、关于 QT1.2 Qt的发展史1.3支持的平台1.4 Qt版本1.5 Qt 的优点1.6 成功案例 二、软件安装1、保证已 Xcode 和 Command Line Tools2、下载 QT3、下载 [qtcreator](http://download.qt.io/official_releases/qtcreator/)查看qt版本 三、创建工程Qt 常见用法 四、基础…

83%的企业曾遭受固件攻击,仅29%分配了固件防护预算

近日,微软发布了名为[《Security Signals》的研究报告](https://www.microsoft.com/secured- corepc/assets/downloads/SecuritySignals_ThoughtPaper.pdf)。报告显示, 过去两年中,83%的组织至少遭受了一次固件攻击,而…

第五讲:MySQL中DDL表的修改与删除

1、alter:改变 2、table:表 3、truncate:截断,删节 学习渠道:黑马程序员

excel中的vlookup如何实现根据多个条件查找?

目录 简述问题公式思路通用公式三条件查找公式实例 简述 Excel 中根据一个条件查找非常方便,Excel 提供了内置函数 VLOOKUP。但是实际中往往有多种情形,需要根据多个条件进行查找操作,目前没有现成的内置函数。 本篇介绍 VLOOKPCHOOSE 组合…

利用RLHF优化大模型:提升性能与应用能力

在数据科学不断发展的过程中,大模型在自然语言处理、图像识别、金融预测等各个领域的应用越来越广泛。然而,大模型的训练和优化也面临着越来越多的挑战,例如数据量过大、计算资源不足、超参数调整困难等。传统的机器学习算法往往难以处理这些…

基于whisper和whisperx的语音视频和字幕对齐

环境的安装 创建py310虚拟环境,需要安装Anaconda的Python环境。 Python初学者在不同系统上安装Python的保姆级指引 Win10+Python3.9+GPU版pytorch环境搭建最简流程 Python虚拟环境的安装和使用 还需要提前安装FFmpeg用于音频操作,并添加到环境变量中。 创建一个名称为w…
最新文章