Skip to content

Commit 750e587

Browse files
committed
foramt post files
1 parent 703e7b8 commit 750e587

File tree

82 files changed

+4266
-2440
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+4266
-2440
lines changed

content/posts/2021-03-21_d2l-v04.md

Lines changed: 157 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ tags = ['DeepLearning']
66
+++
77

88
- Course Note: d2l-video-04 - 数据操作+数据预处理
9-
- Jupyter Notebook: chapter\_preliminaries/pandas.ipynb
9+
- Jupyter Notebook: chapter_preliminaries/pandas.ipynb
1010

1111
预备知识中 Data Manipulation 和 Data Preprocessing 的部分
1212

@@ -15,155 +15,177 @@ tags = ['DeepLearning']
1515
**N 纬数组介绍**
1616

1717
- 0-d (标量)
18-
```
19-
1.0
20-
```
21-
一个类别
18+
19+
```
20+
1.0
21+
```
22+
23+
一个类别
2224

2325
- 1-d (向量)
24-
```
25-
[1.0, 2.7, 3.4]
26-
```
27-
一个特征向量
26+
27+
```
28+
[1.0, 2.7, 3.4]
29+
```
30+
31+
一个特征向量
2832

2933
- 2-d (矩阵)
30-
```
31-
[[1.0, 2.7, 3.4],
32-
[1.0, 2.7, 3.4],
33-
[1.0, 2.7, 3.4]]
34-
```
35-
一个样本 - 特征矩阵
34+
35+
```
36+
[[1.0, 2.7, 3.4],
37+
[1.0, 2.7, 3.4],
38+
[1.0, 2.7, 3.4]]
39+
```
40+
41+
一个样本 - 特征矩阵
3642

3743
- 3-d RGB 图片(宽 x 高 x 通道)
38-
```
39-
[[[1.0, 2.7, 3.4],
40-
[1.0, 2.7, 3.4],
41-
[1.0, 2.7, 3.4]],
42-
[[1.0, 2.7, 3.4],
43-
[1.0, 2.7, 3.4],
44-
[1.0, 2.7, 3.4]]]
45-
```
44+
45+
```
46+
[[[1.0, 2.7, 3.4],
47+
[1.0, 2.7, 3.4],
48+
[1.0, 2.7, 3.4]],
49+
[[1.0, 2.7, 3.4],
50+
[1.0, 2.7, 3.4],
51+
[1.0, 2.7, 3.4]]]
52+
```
4653

4754
- 4-d 一个 RGB 图片批量 (批量大小 x 宽 x 高 x 通道)
48-
```
49-
[[[[...
50-
...
51-
...]]]]
52-
```
5355

54-
- 5-d 一个视屏批量 (批量大小 x 时间 x 宽 x 高 x 通道)
56+
```
57+
[[[[...
58+
...
59+
...]]]]
60+
```
5561

62+
- 5-d 一个视屏批量 (批量大小 x 时间 x 宽 x 高 x 通道)
5663

5764
### Data Manipulation 数据操作
65+
5866
张量(tensor)表示一个数值表示的数组, 这个数组可能有多个纬度, 下面介绍一下 pytorch 里面基础的张量运算
5967

6068
- 创建张量
61-
```Python
62-
import torch
63-
x = torch.arange(12)
6469

65-
shape = x.shape # 元素形状
66-
num = x.numel() # 元素总数
67-
X = x.reshape(3, 4) # 改变张量形状
68-
```
70+
```Python
71+
import torch
72+
x = torch.arange(12)
73+
74+
shape = x.shape # 元素形状
75+
num = x.numel() # 元素总数
76+
X = x.reshape(3, 4) # 改变张量形状
77+
```
6978

7079
- 生成张量
71-
```Python
72-
torch.zeros((2, 3, 4)) # 形状为 2x3x4 的全0张量
73-
torch.ones((2, 3, 4)) # 形状为 2x3x4 的全1张量
74-
torch.randn(3, 4) # 形状为 3 x 4 的随机张量
75-
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 通过py数组生成张量
76-
```
80+
81+
```Python
82+
torch.zeros((2, 3, 4)) # 形状为 2x3x4 的全0张量
83+
torch.ones((2, 3, 4)) # 形状为 2x3x4 的全1张量
84+
torch.randn(3, 4) # 形状为 3 x 4 的随机张量
85+
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 通过py数组生成张量
86+
```
7787

7888
- 张量运算
79-
```Python
80-
x = torch.tensor([1.0, 2, 4, 8]) # .0 表示为浮点数, 会转换为浮点数张量, 而不是整数
81-
y = torch.tensor([2, 2, 2, 2])
82-
x + y, x - y, x * y, x / y, x ** y # 对应位置的元素进行标准运算
83-
```
84-
85-
按照行 或 列 连结(concatenate) 在一起
86-
```Python
87-
X = torch.arange(12, dtype=torch.float32).reshape((3,4)) # shape: 3x4
88-
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # shape: 3x4
89-
90-
torch.cat((X, Y), dim=0) # 第0纬(外层)连结: 变成6x8
91-
torch.cat((X, Y), dim=1) # 第1纬(内存)连结: 变成3x8
92-
```
93-
94-
通过逻辑运算符构建二元张量
95-
```Python
96-
X == Y
97-
```
98-
99-
张量所有元素求和
100-
```Python
101-
X.sum()
102-
```
103-
104-
即使形状不同, 仍然可以通过调用 **广播机制**(**broadcasting mechanism**) 来执行按元素操作
105-
```Python
106-
# 使用 广播机制(broadcasting mechanism) 将形状不同的元素相加
107-
a = torch.arange(3).reshape((3, 1))
108-
b = torch.arange(2).reshape((1, 2))
109-
110-
# 将 a 3x2 复制为 3x2 的矩阵
111-
# 将 b 1x2 复制为 3x2 的矩阵
112-
a + b
113-
```
89+
90+
```Python
91+
x = torch.tensor([1.0, 2, 4, 8]) # .0 表示为浮点数, 会转换为浮点数张量, 而不是整数
92+
y = torch.tensor([2, 2, 2, 2])
93+
x + y, x - y, x * y, x / y, x ** y # 对应位置的元素进行标准运算
94+
```
95+
96+
按照行 或 列 连结(concatenate) 在一起
97+
98+
```Python
99+
X = torch.arange(12, dtype=torch.float32).reshape((3,4)) # shape: 3x4
100+
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # shape: 3x4
101+
102+
torch.cat((X, Y), dim=0) # 第0纬(外层)连结: 变成6x8
103+
torch.cat((X, Y), dim=1) # 第1纬(内存)连结: 变成3x8
104+
```
105+
106+
通过逻辑运算符构建二元张量
107+
108+
```Python
109+
X == Y
110+
```
111+
112+
张量所有元素求和
113+
114+
```Python
115+
X.sum()
116+
```
117+
118+
即使形状不同, 仍然可以通过调用 **广播机制**(**broadcasting mechanism**) 来执行按元素操作
119+
120+
```Python
121+
# 使用 广播机制(broadcasting mechanism) 将形状不同的元素相加
122+
a = torch.arange(3).reshape((3, 1))
123+
b = torch.arange(2).reshape((1, 2))
124+
125+
# 将 a 3x2 复制为 3x2 的矩阵
126+
# 将 b 1x2 复制为 3x2 的矩阵
127+
a + b
128+
```
114129

115130
- 选择元素
116-
```Python
117-
X[-1], X[1:3] # 使用下标, 切片获取元素
118-
X[1, 2] = 9 # 使用指定索引修改元素
119-
X[0:2, :] = 12 # 为多个元素复制 (第一纬度中的 0,1 全部赋值为12)
120-
```
131+
132+
```Python
133+
X[-1], X[1:3] # 使用下标, 切片获取元素
134+
X[1, 2] = 9 # 使用指定索引修改元素
135+
X[0:2, :] = 12 # 为多个元素复制 (第一纬度中的 0,1 全部赋值为12)
136+
```
121137

122138
- 内存相关
123-
内存重新分配
124-
```Python
125-
before = id(Y)
126-
Y = Y + X # 这里加法导致Y内存重新分配
127-
id(Y) == before
128-
# False
129-
```
130-
131-
执行原地操作
132-
```Python
133-
Z = torch.zeros_like(Y)
134-
print('id(Z):', id(Z))
135-
136-
# 使用X[:] = X + Y或X += Y来减少操作的内存开销
137-
Z[:] = X + Y
138-
print('id(Z):', id(Z)) # 与上 print 输出相同
139-
140-
before = id(X)
141-
X += Y
142-
id(X) == before # True
143-
```
139+
内存重新分配
140+
141+
```Python
142+
before = id(Y)
143+
Y = Y + X # 这里加法导致Y内存重新分配
144+
id(Y) == before
145+
# False
146+
```
147+
148+
执行原地操作
149+
150+
```Python
151+
Z = torch.zeros_like(Y)
152+
print('id(Z):', id(Z))
153+
154+
# 使用X[:] = X + Y或X += Y来减少操作的内存开销
155+
Z[:] = X + Y
156+
print('id(Z):', id(Z)) # 与上 print 输出相同
157+
158+
before = id(X)
159+
X += Y
160+
id(X) == before # True
161+
```
144162

145163
- 类型转换
146-
转换为NumPy张量 (ndarray)
147-
```Python
148-
A = X.numpy()
149-
B = torch.tensor(A)
150-
type(A), type(B)
151-
#> (numpy.ndarray, torch.Tensor)
152-
```
153-
154-
将大小为1的张量转换为Python标量
155-
```Python
156-
a = torch.tensor([3.5])
157-
a, a.item(), float(a), int(a)
158-
#> (tensor([3.5000]), 3.5, 3.5, 3)
159-
```
164+
转换为NumPy张量 (ndarray)
165+
166+
```Python
167+
A = X.numpy()
168+
B = torch.tensor(A)
169+
type(A), type(B)
170+
#> (numpy.ndarray, torch.Tensor)
171+
```
172+
173+
将大小为1的张量转换为Python标量
174+
175+
```Python
176+
a = torch.tensor([3.5])
177+
a, a.item(), float(a), int(a)
178+
#> (tensor([3.5000]), 3.5, 3.5, 3)
179+
```
160180

161181
### Data Preprocessing 数据预处理
182+
162183
csv 全称 Comma-Seperated Values 即逗号分开的值, 是一种文本文件格式, 用来存储表格数据, 数据项之间通常用逗号分隔, 行与行之间用换行符分隔. 实际上, 可以使用其他符号, 例如;来做分隔符
163184

164185
下面通过一个读取csv文件的例子, 说明如何将csv中的数据读入 pytorch
165186

166187
首先构造一个csv文件
188+
167189
```Python
168190
import os
169191

@@ -178,6 +200,7 @@ with open(data_file, 'w') as f:
178200
```
179201

180202
从创建的文件中加载原始数据集
203+
181204
```Python
182205
import pandas as pd
183206

@@ -194,6 +217,7 @@ print(data)
194217
| 3 | NaN | NaN | 140000 |
195218

196219
为了处理缺失的数据, 常使用插值和删除的方法, 这里使用插值
220+
197221
```Python
198222
# inputs: 所有行, 前两列数据, 房间数量和小巷
199223
# outputs: 所有行, 最后一列数据, 价格
@@ -205,27 +229,29 @@ inputs = pd.get_dummies(inputs, dummy_na=True)
205229

206230
print(inputs)
207231
```
208-
| | NumRooms | Alley\_Pave | Alley\_nan |
209-
| :--- | :--- | :--- | :--- |
210-
| 0 | NaN | True | False |
211-
| 1 | 2.0 | False | True |
212-
| 2 | 4.0 | False | True |
213-
| 3 | NaN | False | True |
214232

233+
| | NumRooms | Alley_Pave | Alley_nan |
234+
| :-- | :------- | :--------- | :-------- |
235+
| 0 | NaN | True | False |
236+
| 1 | 2.0 | False | True |
237+
| 2 | 4.0 | False | True |
238+
| 3 | NaN | False | True |
215239

216240
```Python
217241
# 使用平均值填充
218242
inputs = inputs.fillna(inputs.mean())
219243
print(inputs)
220244
```
221-
| | NumRooms | Alley\_Pave | Alley\_nan |
222-
| :--- | :--- | :--- | :--- |
223-
| 0 | 3.0 | 1 | 0 |
224-
| 1 | 2.0 | 0 | 1 |
225-
| 2 | 4.0 | 0 | 1 |
226-
| 3 | 3.0 | 0 | 1 |
245+
246+
| | NumRooms | Alley_Pave | Alley_nan |
247+
| :-- | :------- | :--------- | :-------- |
248+
| 0 | 3.0 | 1 | 0 |
249+
| 1 | 2.0 | 0 | 1 |
250+
| 2 | 4.0 | 0 | 1 |
251+
| 3 | 3.0 | 0 | 1 |
227252

228253
最后转换为 torch 张量
254+
229255
```Python
230256
import torch
231257

@@ -235,11 +261,13 @@ X, y
235261
```
236262

237263
输出
264+
238265
```
239266
(tensor([[3., 1., 0.],
240267
[2., 0., 1.],
241268
[4., 0., 1.],
242269
[3., 0., 1.]], dtype=torch.float64),
243270
tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))
244271
```
272+
245273
> 深度学习更多使用 float32 类型运算, 64位太慢了

0 commit comments

Comments
 (0)