动手学深度学习pytorch(二)-预备知识


在这里插入图片描述

预备知识

由于预备知识大多数都是各位已经掌握的,所以只记录了代码 with 注释。

  • 首先简单介绍了Torch的基础用法
  • 接着引入数据预处理。
  • 然后介绍了线性代数、微积分、概率论等基础数学知识。
  • 其中重点需要关注的是自动微分的使用。
  • 一个tip是介绍查阅文档的方法。

数据操作

import torch  # 导入PyTorch库

x = torch.arange(12)  # 创建一个包含0到11的整型张量
x.shape  # 获取张量x的形状
x.nemel()  # 这里有拼写错误,应为x.numel(),获取张量x的元素总数
X = x.reshape(3, 4)  # 改变形状为3行4列

torch.zeros((2, 3, 4))  # 创建一个形状为2x3x4的零张量
torch.ones((2, 3, 4))  # 创建一个形状为2x3x4的1张量
torch.randn(3, 4)  # 创建一个形状为3x4的随机正态分布张量
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])  # 从列表创建一个张量

x = torch.tensor([1.0, 2, 4, 8])  # 创建一个包含浮点数的张量
y = torch.tensor([2, 2, 2, 2])  # 创建一个整型张量
x + y, x-y, x * y, x / y, x ** y  # 执行张量之间的基本算术运算
torch.exp()  # 应该接收一个张量参数,计算张量的指数函数

X = torch.arange(12, dtype=torch.float32).reshape(3, 4)  # 创建一个形状为3x4的浮点型张量
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]], dtype=torch.float32)  # 创建另一个形状为3x4的浮点型张量
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)  # 在指定维度上连接张量X和Y
X == Y  # 计算X和Y元素是否相等
X.sum()  # 计算张量X所有元素的和
X[-1]  # 获取张量X的最后一个元素
X[1:3]  # 获取张量X的第2到第3行
X[1, 2] = 9  # 将张量X第2行第3列的元素设置为9
X.numpy()  # 将张量X转换为NumPy数组

before = id(Y)  # 获取Y的内存地址
Y = Y + X  # 在原地修改Y,将Y和X相加
id(Y) == before  # 检查Y的内存地址是否改变(通常不会改变)

Z = torch.zeros_like(Y)  # 创建一个与Y形状相同的零张量
before = id(Z)  # 获取Z的内存地址
Z[:] = X + Y  # 将X和Y相加的结果赋值给Z
before == id(Z)  # 检查Z的内存地址是否改变(这里不会改变,因为[:]赋值是原地操作)

A = X.numpy()  # 将X转换为NumPy数组
B = torch.tensor(A)  # 将NumPy数组A转换为张量

a = torch.arange(3).reshape((3, 1))  # 创建一个形状为3x1的张量
b = torch.arange(2).reshape((1, 2))  # 创建一个形状为1x2的张量
a + b  # 计算张量a和b的和,这里会进行广播

数据预处理

import os  # 导入操作系统接口模块
# 创建一个新目录用于存储数据文件,如果目录已存在则不抛出错误
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
# 构建数据文件的完整路径
data_file = os.path.join('..', 'data', 'house_tiny.csv')
# 打开文件用于写入,并写入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')
    
import pandas as pd  # 导入pandas库用于数据处理
# 读取CSV文件到DataFrame
data = pd.read_csv(data_file)
print(data)  # 打印DataFrame
# 分离输入和输出数据,其中输入是前两列,输出是第三列
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 使用均值填充输入数据中的缺失值
inputs = inputs.fillna(inputs.mean())
print(inputs)  # 打印处理后的输入数据
# 删除缺失值最多的列
nan_count = np.sum(data.isnull(), axis=0)  # 计算每列的缺失值数量
# data.drop(columns=[nan_count.idxmax()], inplace=True)  # 删除缺失值最多的列(注释掉未执行)
data.drop(columns=data.columns[np.argmax(nan_count)], inplace=True)  # 删除缺失值最多的列
# 获取输入数据的独热编码,同时处理缺失值
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)  # 打印独热编码后的输入数据
import torch  # 导入PyTorch库用于深度学习
import numpy as np  # 导入NumPy库用于数组操作
# 将DataFrame转换为NumPy数组,并进一步转换为PyTorch张量
X = torch.tensor(inputs.to_numpy(dtype=float))  # 输入数据
y = torch.tensor(outputs.to_numpy(dtype=float))  # 输出数据

线性代数

import torch  # 导入PyTorch库
# 创建一个包含20个元素的数组,并将其重塑为5行4列的张量
A = torch.arange(20).reshape(5, 4)
# 转置张量A
A.T  # 返回张量A的转置
# 重新创建一个包含20个元素的数组,并将其重塑为5行4列的张量
A = torch.arange(20).reshape(5, 4)
# 乘法运算,这里没有定义B,所以这行代码会引发错误
# A * B
# 计算张量A沿着第0轴(列)的总和
A_sum_axis0 = A.sum(axis=0)
# 计算张量A沿着第0轴(列)的累积和
A.cumsum(axis=0)
# 创建一个包含4个元素的数组,数据类型为float32
x = torch.arange(4, dtype=torch.float32)
# 创建一个包含4个元素的数组,数据类型为float32,所有元素为1
y = torch.ones(4, dtype=torch.float32)
# 计算两个一维张量的点积
torch.dot(x, y)
# 使用矩阵向量乘法(MVM)计算A和x的乘积
torch.mv(A, x)
# 创建一个包含4个元素的数组,数据类型为float32,所有元素为1
B = torch.ones(4, 3)
# 计算两个二维张量的矩阵乘积
torch.mm(A, B)
# 创建一个包含两个元素的数组,数据类型为float32
u = torch.tensor([3.0, -4.0])
# 计算向量u的欧几里得范数
torch.norm(u)
# 计算向量u的绝对值之和
torch.abs(u).sum()
# 计算一个大小为4x9的二维张量的欧几里得范数
torch.norm(torch.ones((4, 9)))

微积分

高数内容,此处pass

自动微分

import torch
# 创建一个包含4个元素的数组,数据类型为float,并设置requires_grad为True,表示这个张量需要进行梯度计算
x = torch.arange(4.0)
x.requires_grad_(True)
# 计算x的平方和,并设置其requires_grad为True
y = 2 * torch.dot(x, x)
y.requires_grad_(True)
# 对y进行反向传播,计算其梯度
y.backward()
# 打印x的梯度
x.grad
# 重置x的梯度
x.grad.zero_()
# 计算x的平方
y = x * x
# 将y转换为不可梯度计算的状态,并设置其requires_grad为False
u = y.detach()
u.requires_grad_(False)
# 计算u与x的乘积
z = u * x
# 对z进行反向传播,计算其梯度
z.sum().backward()
# 检查x的梯度是否等于2 * x
x.grad == 2 * x
# 重置x的梯度
x.grad.zero_()
# 对y进行反向传播,计算其梯度
y.sum().backward()
# 检查x的梯度是否等于2 * x
x.grad == 2 * x

概率

%matplotlib inline  # 设置matplotlib以交互方式显示图表
import torch
from torch.distributions import multinomial  # 导入multinomial分布类
from d2l import torch as d2l  # 导入d2l模块的torch子模块
# 创建一个均匀分布的概率向量
fair_probs = torch.ones([6]) / 6
# 使用multinomial分布生成随机样本
# 参数1:试验次数,参数2:每个试验的成功概率
multinomial.Multinomial(1, fair_probs).sample()  # 生成一个随机样本
multinomial.Multinomial(10, fair_probs).sample()  # 生成另一个随机样本
# 将结果存储为32位浮点数以进行除法
counts = multinomial.Multinomial(1000, fair_probs).sample()
counts / 1000  # 相对频率作为估计值
# 生成10次试验的500组随机样本
counts = multinomial.Multinomial(10, fair_probs).sample((500,))
# 计算累积计数
cum_counts = counts.cumsum(dim=0)
# 计算估计的概率
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)
# 设置图表大小
d2l.set_figsize((6, 4.5))
# 绘制每个骰子出现次数的估计概率
for i in range(6):
    d2l.plt.plot(estimates[:, i].numpy(),
                 label=("P(die=" + str(i + 1) + ")"))
# 绘制理论概率线
d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
# 设置图表标签
d2l.plt.gca().set_xlabel('Groups of experiments')
d2l.plt.gca().set_ylabel('Estimated probability')
# 显示图例
d2l.plt.legend();

查阅文档

import torch
# 打印torch.distributions模块中的所有函数和方法
print(dir(torch.distributions))
# 打印torch.ones函数的帮助信息
help(torch.ones)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值