动手学深度学习

预备知识

数据操作

数据操作实现

读取和存储数据

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch
#随意0-12
x=torch.arange(12) #使用arange创建一个行向量x
print(x)
print(x.shape) #根据张量的shape属性来访问张量的形状
print(x.numel()) #获取张量中元素的总数(形状的所有元素乘积,检查它的大小)
print(x.reshape(3,4)) #改变张量的形状 但是不改变元素数量和元素值 # x.reshape(-1,4) / x.reshape(3,-1) 通过-1来调用此自动计算出维度的功能
#全0
print(torch.zeros(2,3,4))
#全1
print(torch.ones(2,3,4))
#正态分布(均值0,标准差1)
print(torch.randn(3,4))

运算符

1
2
3
4
5
6
7
8
9
import torch
#进行四则运算
x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(x**y)

广播机制

1
2
3
4
5
6
7
8
9
10
11
12
#1.通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状。 
#2.对生成的数组执行按元素操作。

import torch
a = torch.arange(3).reshape((3, 1)) # 3*1矩阵
b = torch.arange(2).reshape((1, 2)) # 1*2矩阵
print(a)
print(b)
#如果a+b的话因为两个形状不匹配 --> 广播成更大的3*2矩阵
#a将复制列
#b将赋值行
print(a+b)

索引和切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch
x=torch.arange(12).reshape((3, 4))
print(x)

#输出最后一个元素
print(x[-1])
#输出第二个和第三个元素
print(x[1:3]) #下标第一行和第二行

#指定索引写入一个
x[1,2]=9 #第二行第三个元素改为9
print(x)
#指定索引写入很多
x[0:2,:]=111 #第一行和第二行的所有列都改为111
print(x)

节省内存(创建一样大的0矩阵)

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch
#原来的问题!!
Y=torch.arange(12).reshape((3,4))
X=torch.arange(12).reshape((3,4))
before=id(Y)
Y=Y+X
print(id(Y)==before) #Y被赋值新的内存,执行内存中新位置

#原地更新
Z=torch.zeros_like(Y) #创建一个和Y一样大的
print(id(Z))
Z[:]=X+Y
print(id(Z))

深度学习框架定义的张量->Numpy张量(ndarray)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import torch
import numpy as np
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
A=X.numpy()
B=torch.tensor(A)
print(type(A)) #ndarray数组
print(type(B)) #tensor向量

#调用item函数/Python内置函数
a=torch.tensor([3.5])
print(a)
print(a.item()) #调用item函数!!转变为ndarray数组
print(float(a))
print(int(a))

数据预处理(Pandas)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

import torch
import numpy as np
import pandas as pd
import os
#1.读取数据集
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv') #创建 ../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')
data=pd.read_csv(data_file)
print(data)
print()

#2.处理缺失值(插值法和删除法)
inputs=data.iloc[:,0:2] #利用位置索引iloc --> data前两列为inputs data最后一列为outputs
outputs=data.iloc[:,2]
inputs=inputs.fillna(inputs.mean()) #利用均值填充
print(inputs)
print()

##对于inputs中的类别值/离散值
##Alley里面有Pava和NaN两种类型 --> pandas可以自动将此列分为两列(Alley_Pave[设置1]和Alley_nan[设置0]) 缺少的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1
inputs=pd.get_dummies(inputs,dummy_na=True)
print(inputs)

#3.转换为张量格式(数值类型-->张量类型) torch.tensor()函数
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
print(X)
print(y)

线性代数

标量/向量/矩阵/张量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

import torch
import numpy as np
import pandas as pd
import os

#1.标量
x=torch.tensor(3.0)
y=torch.tensor(2.0)
print("x+y:",x+y)
print("x-y:",x-y)
print("x*y:",x*y)
print("x/y:",x/y)
print("x**y:",x**y)
print()

#2.向量([标量值1,标量值2,...,标量值N]) 一阶张量
x=torch.arange(4)
print("x:",x)
print()

#3.矩阵([向量1,向量2]) 二阶张量
A=torch.arange(20).reshape(5,4) #5行4列
print("A:",A) #输出A矩阵
print("A的转置:",A.T) #输出转置
##两个形状相同的矩阵相加
A=torch.arange(20, dtype=torch.float32).reshape(5, 4)
B=A.clone()
print("A:",A)
print("A+B:",A+B)
print()

#4.张量(大写字母)
##处理图像 -->n维数组[高度轴(Red红色)/宽度轴(Green绿色)/通道轴(Blue蓝色)]
X=torch.arange(24).reshape(2,3,4)
print("X:",X)
print()

降维

降维求和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

import torch
import numpy as np
import pandas as pd
import os

x=torch.arange(4,dtype=torch.float32) # 0 1 2 3
print("x:",x)
print("x的总和:",x.sum())
print()

A=torch.arange(20, dtype=torch.float32).reshape(5, 4)
print("A:",A)
print("A的形状:",A.shape)
print("A的总和:",A.sum())
print()

#降维
##每列相加(↑)
A_sum_axis0=A.sum(axis=0) #按照轴0(第一行)将每列往上加到第一个位置[x1,x2,x3,x4]
print("A按照轴0:",A_sum_axis0)
print("A按照轴0的形状:",A_sum_axis0.shape)
print()
##每行相加(←)
A_sum_axis1=A.sum(axis=1) #按照轴1(第一列)将每行往左加到第一个位置[x1,x2,x3,x4]
print("A按照轴1:",A_sum_axis1)
print("A按照轴1的形状:",A_sum_axis1.shape)
print()
##行和列求和
A_sum_axis01=A.sum(axis=[0,1]) #按照轴1(第一列)将每行往左加到第一个位置[x1,x2,x3,x4]
print("A按照轴01:",A_sum_axis01)
print("A按照轴01的形状:",A_sum_axis01.shape)
print()

非降维求和(设置keepdims=True)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

import torch
import numpy as np
import pandas as pd
import os

A=torch.arange(20, dtype=torch.float32).reshape(5, 4)
print("A:",A)
print("A的形状:",A.shape)
print("A的总和:",A.sum())
print()

#非降维求和
sum_A=A.sum(axis=1,keepdims=True) #每行计算往最左边推(行有几个就有几个元素)
print(sum_A)

#沿着某个轴计算A元素的累计总和 --cumsum函数
print(A.cumsum(axis=0)) #第一行=第一行 第二行=第二行+第一行 第三行=第一行+第二行+第三行 ...

点积(dot)

1
2
3
4
5
6
7
8
9
10
11

import torch
import numpy as np
import pandas as pd
import os

x=torch.arange(4,dtype=torch.float32)
y=torch.ones(4,dtype=torch.float32)
print("x:",x)
print("x:",y)
print(torch.dot(x,y)) # 0*0+1*1+2*1+3*1=6

矩阵-向量积(mv)

1
2
3
4
5
6
7
8
9
10
11

import torch
import numpy as np
import pandas as pd
import os

x=torch.arange(4)
A=torch.arange(20).reshape(5,4)
print(x)
print(A)
print(torch.mv(A,x))

矩阵-矩阵乘法(mm)

1
2
3
4
5
6
7
8
9
10
11

import torch
import numpy as np
import pandas as pd
import os

A=torch.arange(20).reshape(5,4)
B=torch.arange(20).reshape(4,5)
print(A)
print(B)
print(torch.mm(A,B))

范数

1
2
3
4
5
6
7
8
9
10
11
12
13

import torch
import numpy as np
import pandas as pd
import os

# L2范数(欧几里得距离)
u=torch.tensor([3.0,-4.0])
print(torch.norm(u))

# L1范数(向量元素的绝对值之和)
print(torch.abs(u).sum()) # 3.0+4.0=7.0
print(torch.norm(torch.ones(4,9)))

微积分

导数

1
2
1.概念:
2.定义:

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 预备知识
    1. 1.1. 数据操作
    2. 1.2. 数据操作实现
      1. 1.2.1. 读取和存储数据
      2. 1.2.2. 运算符
      3. 1.2.3. 广播机制
      4. 1.2.4. 索引和切片
      5. 1.2.5. 节省内存(创建一样大的0矩阵)
      6. 1.2.6. 深度学习框架定义的张量->Numpy张量(ndarray)
    3. 1.3. 数据预处理(Pandas)
    4. 1.4. 线性代数
      1. 1.4.1. 标量/向量/矩阵/张量
      2. 1.4.2. 降维
        1. 1.4.2.1. 降维求和
        2. 1.4.2.2. 非降维求和(设置keepdims=True)
      3. 1.4.3. 点积(dot)
      4. 1.4.4. 矩阵-向量积(mv)
      5. 1.4.5. 矩阵-矩阵乘法(mm)
      6. 1.4.6. 范数
    5. 1.5. 微积分
      1. 1.5.1. 导数
,