Pytorch实战
1、安装
-
安装 conda, Python工具大全,方便管理多个 Python 环境,必须选择跟自己环境配套的版本。
-
https://www.anaconda.com
-
-
网速慢的,可以参考国内源,也可以去这里看看:
-
torch · PyPI
-
Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
-
- PyTorch的安装, 结合自己想要安装的环境,动态选择即可。
- PyTorch
#环境初始化~/miniconda3/bin/conda init#创建虚拟环境conda create --name deeplearning python=3.9#激活环境conda activate deeplearning#安装插件pip install torch==1.12.0 torchvision==0.13.0 numpy==1.21.5 matplotlib==3.5.1 requests==2.25.1 pandas==1.2.4python -m pip install -U pippython -m pip install -U matplotlib#退出环境conda deactivate#列出当前有哪些环境conda env list#删除环境conda env remove deeplearning
2、张量的基本操作
import torch
# tensor([0,1,2,3,4,5,6,7,8,9,10,11])
x1 = torch.arange(12)
# 返回张量的维度信息,torch.Size([12])
x1.shape
# 返回张量的元素个数12
x1.numel()# 2个3行4列的全0矩阵
torch.zeros(2,3,4)
# 2个3行4列的全1矩阵
torch.ones(2,3,4)
# 随机生成一个3行4列的矩阵,元素值服从标准正态分布
torch.randn(3,4)
# 指定初始化一个张量
y1 = torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
# 将y的形状改为4行3列,将元素重新排列
y1.reshape(4,3)x2 = torch.tensor([1,2,4,8])
y2 = torch.tensor([2,2,2,2])
# 对应位置的元素相乘,返回一个新的张量
print(x2 * y2)
# x2对于元素的y2次幂
print(x2 ** y2)
# 对x2的每个元素计算e的幂次方,即e的x2次幂
print(torch.exp(x2))x3 = torch.arange(12, dtype=torch.int).reshape((3,4))
y3 = torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
res2 = torch.cat((x3,y3), dim=0) # dim=0表示按行拼接,结果为6行4列
res3 = torch.cat((x3,y3), dim=1) # dim=1表示按列拼接,结果为3行8列
print(res2)
print(res3)x3 == y3 # 对应位置的元素相等,返回True,否则返回False# 广播
a = torch.arange(3).reshape((3,1)) # 3行1列
b = torch.arange(2).reshape((1,2)) # 1行2列
print(a)
print(b)
print(a+b) # 广播机制,将a和b扩展为3行2列,然后对应位置的元素相加,结果为3行2列# 索引和切片
y3[-1] # 索引和切片,X[-1]表示最后一行,结果为1行4列
y3[1:3] # 索引和切片,X[-1]表示最后一行,X[1:3]表示第2行和第3行,结果为2行4列
y3[1,2] = 9 # 索引和切片,X[1,2]表示第2行第3列的元素,赋值为9,下标从0开始
print(y3)# 节省内存(不推荐)
# 对向量的操作后都会生成一个新的向量,即分配一片新的内存
z1 = torch.zeros_like(y3) # 生成一个和y3相同形状的全0矩阵,结果为3行4列
print('id(z1):', id(z1)) # id(z1)表示z1的内存地址
z1[:] = x3 + y3 # 将x3和y3的对应位置的元素相加,结果再赋值给z1
print('id(z1):', id(z1)) # id(z1)表示z1的内存地址
# z1的地址保持不变,x3+y3没有新分配地址,这样就节省了内存# 转换为其他Python对象
A = x3.numpy() # 将张量x3转换为numpy数组,结果为3行4列
B = torch.tensor(A) # 将numpy数组A转换为张量,结果为3行4列
print(type(A)) # <class 'numpy.ndarray'>
print(type(B)) # <class 'torch.Tensor'>c = torch.tensor([3.5]) # 生成一个张量,元素值为3.5
d = c.item() # 将张量c转换为Python标量,结果为3.5
print(type(c)) # <class 'torch.Tensor'>
print(type(d)) # <class 'float'>
print(float(c))
print(int(c))
3、预处理
# 创建数据集
os.makedirs(os.path.join('.', 'data'), exist_ok=True)
data_file = os.path.join('.', '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')# 读取数据集
import pandas as pd
data = pd.read_csv(data_file)
print(data)
# 将house_tiny数据的空值进行处理
inputs,outputs = data.iloc[:,0:2],data.iloc[:,2] # `iloc` 用于基于整数位置的索引,即index_location# get_dummies 是 pandas 库中的一个函数,用于将类别型数据转换为独热编码(one-hot encoding)的形式。
# 独热编码是将分类变量转换为机器学习模型可理解格式的技术,将每个分类创建一个列,1代表命中该分类,0代表未命中;
# 如果将分类按1,2,3编码,会让大模型认为每个分类之间存在大小关系。
inputs = pd.get_dummies(inputs, dummy_na=True)
# NumRooms Alley Price
# 0 NaN Pave 127500
# 1 2.0 NaN 106000
# 2 4.0 NaN 178100
# 3 NaN NaN 140000
# 处理数值型数据的缺失值,将其替换为该列的均值
inputs = inputs.fillna(inputs.iloc[:,0].mean())
print(inputs)# 将pandas的DataFrame转换为PyTorch的Tensor
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
print(X)
print(y)