# 以下操作处于conda环境下
conda env list # 查看建立过的环境
conda env remove d2l-zh # 如果发现建立过名为d2l-zh的环境可以删掉重建
conda create -n d2l-zh python=3.8 # 建立名字为d2l-zh的环境
conda activate d2l-zh # 激活刚刚创建的环境
# 下载需要的包 (下载比较慢可以加上国内源 -i https://pypi.douban.com/simple)
pip install jupyter d2l torch torchvision
# 下载代码
wget https://zh-v2.d2l.ai/d2l-zh.zip
unzip d2l-zh.zip
jupyter notebookimport torch
# 张量
x = torch.arange(12)
xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])# shape属性,访问形状和元素总数
x.shapetorch.Size([12])# number of elements
x.numel()12X = x.reshape(3, 4)
Xtensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])# 产生全为0的2*3*4
torch.zeros((2, 3, 4))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.]]])# # 产生全为1的2*3*4
torch.ones((2, 3, 4))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.]]])# 特定的一个值
torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]])tensor([[[2, 1, 4, 3],
[1, 2, 3, 4],
[4, 3, 2, 1]]])torch.tensor([[[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]]).shapetorch.Size([1, 3, 4])# 计算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 3])
x+y, x-y, x*y, x/y, x**y(tensor([ 3., 4., 6., 11.]),
tensor([-1., 0., 2., 5.]),
tensor([ 2., 4., 8., 24.]),
tensor([0.5000, 1.0000, 2.0000, 2.6667]),
tensor([ 1., 4., 16., 512.]))# 更多的运算
torch.exp(x)tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])# 将张量连结起来
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]])
# dim 按第i维合并
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)(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.]]))# 按照元素值进行判断
X == Ytensor([[False, True, False, True],
[False, False, False, False],
[False, False, False, False]])# 对张量中的所用元素求
X.sum()tensor(66.)# 维度一样,形状不同,复制拓展成一样再加(广播机制)
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b, a+b(tensor([[0],
[1],
[2]]),
tensor([[0, 1]]),
tensor([[0, 1],
[1, 2],
[2, 3]]))# 读取
X[-1], X[1:3](tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]]))#写入
X[1, 2] = 9
Xtensor([[ 0., 1., 2., 3.],
[ 4., 5., 9., 7.],
[ 8., 9., 10., 11.]])X[0:2, :] = 12
Xtensor([[12., 12., 12., 12.],
[12., 12., 12., 12.],
[ 8., 9., 10., 11.]])# 有些操作不是原地操作 id 相当于C++的指针地址
before = id(Y)
Y = Y+X
id(Y) == beforeFalse# 原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X+Y
print('id(Z):', id(Z))id(Z): 1988936663664
id(Z): 1988936663664# 后续没有重复使用X,减少内存开销
before = id(X)
X += Y
id(X) == beforeTrue# NumPy张量
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)(numpy.ndarray, torch.Tensor)# 大小为1的张量转外为Python的标量
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)(tensor([3.5000]), 3.5, 3.5, 3)# 创建一个人工数据集,存在csv中
import os
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, 107500\n')
f.write('4, NA, 185500\n')
f.write('NA, NA, 140000\n')# 读取csv文件 - pandas
import pandas as pd
data = pd.read_csv(data_file)
dataNumRooms | Alley | Price | |
|---|---|---|---|
0 | NaN | Pave | 127500 |
1 | 2.0 | NA | 107500 |
2 | 4.0 | NA | 185500 |
3 | NaN | NA | 140000 |
# 处理缺失的数据 - 插值和删除
# 一种常用的是,有缺失就丢掉
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
# 因为第二行是字符串,不存在均值,没有发生变化
inputsNumRooms | Alley | |
|---|---|---|
0 | 3.0 | Pave |
1 | 2.0 | NA |
2 | 4.0 | NA |
3 | 3.0 | NA |
inputs = pd.get_dummies(inputs, dummy_na=True)
inputsNumRooms | Alley_ NA | Alley_ Pave | Alley_nan | |
|---|---|---|---|---|
0 | 3.0 | 0 | 1 | 0 |
1 | 2.0 | 1 | 0 | 0 |
2 | 4.0 | 1 | 0 | 0 |
3 | 3.0 | 1 | 0 | 0 |
import torch
X, Y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, Y(tensor([[3., 0., 1., 0.],
[2., 1., 0., 0.],
[4., 1., 0., 0.],
[3., 1., 0., 0.]], dtype=torch.float64),
tensor([127500, 107500, 185500, 140000]))