【学习笔记】动手学深度学习


环境配置 - 本地安装

# 以下操作处于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 notebook

数据操作

import torch

# 张量
x = torch.arange(12)
x
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# shape属性,访问形状和元素总数
x.shape
torch.Size([12])

# number of elements
x.numel()
12

X = x.reshape(3, 4)
X
tensor([[ 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]]]).shape
torch.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 == Y
tensor([[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
X
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  9.,  7.],
        [ 8.,  9., 10., 11.]])

X[0:2, :] = 12
X
tensor([[12., 12., 12., 12.],
        [12., 12., 12., 12.],
        [ 8.,  9., 10., 11.]])

# 有些操作不是原地操作 id 相当于C++的指针地址
before = id(Y)
Y = Y+X
id(Y) == before
False

# 原地操作
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) == before
True

# 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)
data
NumRooms 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())
# 因为第二行是字符串,不存在均值,没有发生变化
inputs
NumRooms 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)
inputs
NumRooms 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]))

声明:残城三梦|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 【学习笔记】动手学深度学习


Live In Fly && Live Infinitely