d2l学习_第二章预备知识

news2024/11/8 21:27:10

x.1 Data Manipulation

数据操作。在Pytorch中常用的数据操作如下:

对于张量,即torch.Tensor类型的数据,你的任何操作都要把他想象成一个指针,因为等于运算符a=b,会将b的张量内存地址赋值给a。

'''torch.Tensor类型的基本使用'''

# 集中常见的初始化torch.Tensor的方法

import torch

# one dimension
x = torch.arange(12)
print(x, x.shape, x.dtype, x.numel(), )

# reshape
y = x.reshape(3, -1)
print(y)

# multi dimensions
a = torch.zeros((2, 3, 4))
b = torch.ones((2, 3, 4))
c = torch.randn((2, 3, 4))
d = torch.tensor([[2, 2, 2], [3, 3, 3]])
print(a, '\n', b, '\n', c, '\n', d)


# 运算符: 运算符的运算是按照元素进行的
e = a + b

# concat 拼接,指定拼接的dim
f = torch.cat((a, b), dim=0)
print(f)

# sum计算求和统计量
g = b.sum()
print(g)

# 判断位置是否相同,常用于做mask
k = a == b
print(k)

# 广播机制,在进行四则运算的时候,当矩阵形状不同时,会先扩展为形状相同再进行计算。但是很多情况下我并不知道怎么使用。常用的是矩阵加一个标量。
h = torch.arange(6).reshape(3, 2)
i = torch.arange(2).reshape(1, 2)
print(h)
print(i)
j = h+i
print(j)

# 切片和索引。同python中的list使用
a[0, 0, 0:3] = 7
print(a)

# 我们使用id()进行内存定位。Y=[expresion Y]会重新分配Y的内存;Y[:]=和Y+=都不会重新分配内存。建议多用后者,这样做可以减少内存开销。
before = id(y)
y = y + 1
print(id(y) == before)

before = id(y)
y += 1
print(id(y) == before)

before = id(y)
y[:] = y + 1
print(id(y) == before)

# 类型转换
l = x.numpy()
m = torch.tensor(l)
print(type(l), type(m))

# 提出tensor 的标量
n = torch.tensor([[1.]])
print(type(n.item()), type(float(n)))

x.2 Data Preprocessing

数据预处理。数据预处理常常使用Pandas库。

常用操作如下:

'''pandas的基本使用'''

import pandas as pd
import torch

# 存储数据/读取数据
import pandas as pd
data_file = "./_.csv"
data = pd.read_csv(data_file)
print(data)
data.to_csv(data_file)

# 创建Pandas DataFrame
DF_NAME = [
    "channel",
    "position",
    "dir_name",
]
# 创建空DataFrame
df_rows_num = 10
df = pd.DataFrame(
    data=None, 
    index=range(df_rows_num),
    columns=DF_NAME,
)
print(df)

# 新增新的一行数据
# add one row - method 1: generage a dictionary, then using .loc[]  || recommanded ||
df_one_row_dict = {
    "channel":  "retardance",
    "position": 4,
    "dir_name": "None",
}
df.loc[0, :] = df_one_row_dict
# add one row - method 2: generate one dataframe, then using concat.
df_one_row_dict = {
    "channel":  ["retardance"],
    "position": [4],
    "dir_name": ["None"],
}
df_one_row = pd.DataFrame(df_one_row_dict)
df = pd.concat([df, df_one_row], axis=0)
print(df)

# 筛选数据
inputs, targets = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

# 类型转换 - 转为numpy
numpy_data = df.to_numpy()
print(numpy_data)
# 转为tensor: 用.values只取值(将index剔除);用.astype("float64")指定ndarray的数据类型。
df_position = df.loc[:, "position"]
df_position = df_position.dropna(axis=0, how="all")
print(df_position)
torch_data = torch.tensor(df_position.values.astype("float64"), dtype=torch.float64)    # ndarray转换类型
print(torch_data)

x.3 Linear Algebra

在线性代数这个阶段,我们首先需要知道scalars标量, vectors向量, matrices矩阵, tensors张量以及它们的基本操作例如reduction降维, non-reduction sum非降维求和, dot products点积, matrix-vector products矩阵向量积, Matrix-Matrix Multiplication矩阵-矩阵乘法, Norms范数

从scalars到tensors是升维的过程,其中scalar是0维张量,vector是1维,matrix是2维,而tensor是多维。例如想象立方体,除了长宽还有一个维度用来表示厚度;又如JPG图片的解释形式,三个维度表示R, G, B。

对于张量,它的数加a是各元素都加a,数乘同理。而对于两个相同shape的张量,张量相加就是逐元素相加,hadamard product哈马达积就是逐元素相乘(逐元素指的是对应位置的元素)。

对于张量的降维是本章难点,首先维度的排列是从第0维到第n维,例如[[]]具有两维度,从外层至内层依次是第0维,第1维。而用来降维的函数有sum()和mean(),其中可以指定维度,如axis=0即在第0维上降维squeeze掉,如下:

请添加图片描述

巧记:在哪个维度进行sum,即将该维度上所有元素相加,如[[0, 1], [1, 2]]在0维度相加,即将0维所有元素[0, 1]和[1, 2]相加,最终变成了[1, 3]

点积即投影,对应元素相乘再相加。矩阵-向量乘和矩阵-矩阵乘即数学上的矩阵乘法。

范数常见于描述距离,常见有L1范数MAE,L2范数MSE,Lp范数的表达如下:

请添加图片描述

附录该小节代码:

'''一些数学知识,关于线性代数的'''

# 统计学中一行数据叫一个样本,一列数据叫一个特征feature,最后一列往往是标签label

import torch

# 标量 - 指0维数据
a = torch.tensor(1.)
print(a)

# 向量 - 指1维数据
b = torch.arange(12)
print(b, b[7], len(b), b.shape)

# 矩阵 - 指多维数据
c = torch.arange(12).reshape(3, 4)
print(c)
# 矩阵转置
# d = torch.transpose(c, 1, 0)
d = c.transpose(1, 0)
print(d)

# 两个矩阵的哈马达积用*
e = torch.arange(12, dtype=torch.float32).reshape(3, 4)
# f = e         # id 相同
# f = e.clone() # id 不同
f = e + 0       # id 不同
print(id(e) == id(f))
g = f * e   # 哈马达积
print(g)

# 矩阵求和sum(); 求均值mean(); 
# 你除了知道这两个API的作用外,你还应该知道这两个函数是用来降维的。
h = g.sum(axis=[0, 1])
i = g.mean(axis=[0, 1])
print(h, i)

# 两个向量的点积用.dot()
j = torch.ones(4, dtype=torch.float32)
k = j.clone()
l = j.dot(k)
print(l)

# 矩阵-向量乘法用.mv
m = torch.arange(12).reshape(6, 2)
n = torch.ones(2, dtype=torch.long) # shpae=[2, 1, 1, 1, ...]补全是往后补1
print(n)
o = m.mv(n)
print(o)

# 矩阵-矩阵乘法用.mm
p = m.transpose(1, 0)
q = m.mm(p)
print(q)

# 向量二范数(又叫L2范数)就是平方和的平方根, 用norm()二范数的英文
r = torch.tensor([3., 4.])
s = r.norm()
print(s)

# 向量一范数(又叫L1范数)就是绝对值的和
t = r.abs().sum()
print(t)

# 矩阵的Frobenius范数类似向量的二范数,就是各个元素平方和的平方根
u = torch.randn(3, 4)
v = u.norm()
print(v)

x.4 Calculus

在微积分中最重要的就是基于链式法则的偏导数计算,将求得的偏导连起来就是梯度方向,梯度即fx下降最快的反方向,如下:

请添加图片描述

引入微积分的例子只是说明在Pytorch中的tensor是会自动微分的,当你调用y.backward()时候会自动计算y的梯度并更新模型的存储梯度信息的矩阵,以至于在后面的optimizer.step()中更新模型的存储权重信息的矩阵。

关于微积分的代码部分:

'''关于微积分的学习'''

# 我们往往使用python进行参数的训练。在使用c/c++将模型部署到硬件/软件上。

# 微分。用导数定义求导。
def f(x):
    return 3 * x ** 2 - 4 * x

def numerical_lim(f, x, h):
    return (f(x + h) - f(x)) / h

h = 0.1
for i in range(5):
    print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}') 
    h *= 0.1


# torch或者tf相比较于numpy好用的地方有两点, 1. 分别是可以传入GPU进行计算 2. 可以自动微分(automatic differentiation)
# 其中torch会根据搭建的模型构建一个计算图(computational graph)来跟踪计算; 而反向传播(backpropagate)则是根据计算图计算每个参数的偏导数。
import torch

x = torch.arange(4.)
x.requires_grad_(True)  # 对x开启梯度跟踪
y = 2 * x.dot(x)    # 搭建好了computational graph
y.backward()    # backpropagate
print(x.grad)   # 输出梯度
print(x.grad == 4 * x)  # 判断梯度对不对

# 将张量的梯度设置为0用.grad.zero_()。否则会梯度爆炸。而这个梯度清零经常包围在backward()前后,即:
# optimizer.zero_grad()
# loss.backward()   # 这里的loss相当于你的目标函数y = 2 * x.dot(x)
# optimizer.step()
x.grad.zero_()  # 梯度清零
y = x.sum()
y.backward()
print(x.grad)

# 将张量从计算图中分离出来使用.detach()
x.grad.zero_()
y = x * x 
u = y.detach()
z = u * x   

z.sum().backward() # 这里在x的backpropagate,即计算z关于x的偏导数时候,因为.detach()的存在,到u就截止了。
print(x.grad == u)
# --- 这里你一定觉得很奇怪为什么要加sum(),这是因为backward()这个函数只对标量进行计算。当你的计算结果是向量的时候,就得使用sum()或者mean()进行降维,常使用sum().
# 参考链接:https://zhuanlan.zhihu.com/p/427853673

x.5 Probability and Statistics

概率论与数理统计将再开个大的章节进行学习。Maybe 线性代数也是如此。

'''概率论与统计学的知识'''

# 随机变量

# 联合概率

# 条件概率

# 全概率公式

# 贝叶斯公式

# 独立性

# 期望和方差
# --- 在这里我们需要注意的是期望并不等于均值。期望是随变取值乘以随变取值的概率,均值就是随变的平均值。
# --- 为什么我们常常认为期望等于均值呢?是因为我们经常碰到的是高斯分布(正态分布),正态分布的是数学期望等于μ;或者当随便取值等概率的时候,期望也等于均值。

x.6 Pythonic

常见用dir()来查看module中有哪些func, class, attributes等;使用help()来查看API使用方法。查阅文档很有帮助的函数包括如下:

import torch

dir(torch)
help(torch.ones)
'''一些很pythonic的东西'''

# 查看一个module脚本文件有什么函数,类,全局变量等。可以使用dir(file_name) | built-in function

# 查看帮助,一个函数怎么调用等可以使用help(function_name)
# 参考https://zhuanlan.zhihu.com/p/263351646

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

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

相关文章

day02-JavaScript-Vue

1 JavaScript html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 1.5.1.3 JSON对象 自定义对象 在 JavaScript 中自…

linux(信号发送后)

目录: 1.引入什么是合适的时候 2.内核态和用户态 3.信号的处理 4.sigaction函数 -------------------------------------------------------------------------------------------------------------------------------- 1.引入什么是合适的时候 2.信号什么时候被处…

你真的会PPT配色吗?来看看这篇吧,瞬间让你的PPT高大上起来

本文档使用技巧如下截图 在色彩里使用其它填充颜色 选取这个“吸管” 用于吸别人的颜色 我曾经为了出一个“惊艳”的PPT,光吸管用了不下150次。 好的艺术家复制,伟大的艺术家偷窃!--毕加索 下面就给出几大常用配色 各位在使用时注意看这些“色卡”的规律,那就是反差色…

安卓系统浏览器开发

预置某个浏览器为系统默认的浏览器 描述: 当系统存在多个浏览器时,如何预置某个浏览器为系统默认的浏览器? 方法: 1.在PackageManagerService.java中的构造函数结尾添加:setDefaultBrowser(); 2.setDefaultBrowser()的具体实现&#xff…

TDengine 合作伙伴 +1,这次是「DaoCloud道客」

随着我国数字经济持续快速发展,各行各业都在积极拥抱云技术,上云成为企业加快数字化转型步伐的关键一步。在此过程中,越来越多的企业开始意识到云原生技术的重要性,利用云原生更快地开发和部署应用程序,提高应用程序的…

智慧信访大数据挖掘平台解决方案

TipDM数据挖掘建模平台由泰迪自主研发,面向大数据挖掘项目的工具。平台使用JAVA语言开发,采用B/S结构,用户不需要下载客户端,可通过浏览器进行访问。平台提供了基于Python、R以及Hadoop/Spark分布式引擎的大数据分析功能。平台支持…

人民大学加拿大女王大学金融硕士——为什么这么多人选金融行业呢

又是一年毕业季,越来越多的新人涌入职场,金融行业依然是择业人们的香饽饽。为什么大家会选金融行业呢?金融行业是一个充满挑战但也充满魅力的行业。在这个快节奏的行业中,人们不断地面对着机遇和挑战,而这个行业也为那…

TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL

编辑:ll TLD5097EL-ASEMI代理英飞LED驱动TLD5097EL 型号:TLD5097EL 品牌:Infineon(英飞凌) 封装:SSOP-14-EP-150mil 类型:LED驱动、汽车芯片 TLD5097EL特性 输入电压范围宽,从4.5 V到45 V 极低关断…

【FATE联邦学习】FATE 自定义Trainer

背景 自己定义了模型后,需要自行定义训练方式。 这里文档给了方法,但是大部分还是需要自己看源码摸索。 https://fate.readthedocs.io/en/latest/tutorial/pipeline/nn_tutorial/Homo-NN-Customize-Trainer/https://fate.readthedocs.io/en/latest/tu…

如何按需下载和安装Win10补丁

如何按需下载和安装Win10补丁 一般我们都是通过系统自带的Windows更新来直接安装补丁,这种方式虽然方便,但是耗时久,而且更新体量也大,会占用很多空间,其实我们完全可以按需下载和安装,下面就给大家介绍方法…

FPGA量子类比机制-FPQA,将在量子运算设计中引发一场新的革命

1980年代现场可程式化逻辑门阵列(FPGA)的出现彻底改变了电子设计。大约40年后,现场可程式化量子位元阵列(FPQA)可望在量子运算电路设计中引发一场类似的革命。 1980年代现场可程式化逻辑闸阵列(FPGA)的出现彻底改变了电子设计。FPGA允许设计人员创建适合特定应用的…

3DCAT亮相糖酒会,为元宇宙展会提供实时云渲染支持

4月12日,第108届全国糖酒商品交易会(下文简称“糖酒会”)在成都正式开幕,吸引了众多酒类企业和行业人士的参与。 图片源自新华社 本次糖酒会上,某展会采用了“双线”模式,除了线下的实体展位,还…

burpsuite工具的使用(详细讲解)

一)前言 我已经在之前详细的说明了burpsuite的安装过程,如果不了解的可以看 burpsuite安装教程 :http://t.csdn.cn/uVx9X 在这了补充说明一下,在安装完burpsuite并设置完代理后,会出现如果访问的url是使用http协议的…

变频器需要定期更换的器件有哪些

导语:​变频器是由许多电子零件构成,例如半导体元件等,在使用和维护当中就涉及到更换部件的问题,由于变频器组成或物理特性的原因,在一定的时期内会产生劣化,因而会降低变频器的特性,甚至会引起…

python---实现一个简化版本的人生模拟器

1.游戏开始的时候,设定初始属性—颜值 体质 智力 家境 2.开始游戏,随机生成性别和出生点 3.针对每一年,都生成人生经历(依靠一定的随机因素当前角色属性) 需要import random一下 一些函数 代码的部分运行情况,由于代码过长此处不予展示!这个部分只写了幼年时期发生的事件!

分布式项目 12 用jsonp来完成单点登录功能(两个系统之间进行信息交互)

在项目中使用ctrlH ,来快速查找相关的hrl请求。 首先全部的请求会进过jt-web,在进行对其他系统的通信。 说明:当点击“登录”或者"免费注册"跳转到登录或者注册页面。 在jt-web项目中,声明UserController资源&#…

【建议收藏】自动化测试框架开发教程

在自动化测试项目中,为了实现更多功能,我们需要引入不同的库、框架。 首先,你需要将常用的这些库、框架都装上。 pip install requests pip install selenium pip install appium pip install pytest pip install pytest-rerunfailures pip …

Vue 项目环境搭建和创建准备工作

一. 学习目标 掌握 Vue 项目创建的依赖环境掌握 Vue 项目创建过程 二. 学习内容 掌握搭建 Vue 项目准备环境掌握 Vue 项目创建过程了解 Vue 项目各子目录 三. 学习过程 1. 准备工作 (1)安装Node.js 打开node.js官网:Node.js &#xff0…

SpringBoot中事务失效的六个原因

SpringBoot中事务失效的原因🚩 常见的事务失效原因包括如下六个: 1. 事务方法非public修饰 由于Spring的事务是基于AOP的方式结合动态代理来实现的。因此事务方法一定要是public的,这样才能便于被Spring做事务的代理和增强。 而且,在Spri…

uniapp 横向滑动list(不同内容)分部问题:scroll-view,swiper overflow-x

横向滑动list,可使用标签: 1:scroll-view 2:swiper 3:overflow-x 正常来讲横向滑动的话 ,需要特殊设置,只用view 设置display:flex,的话 无法横向滑动,右边的就会隐…