@@ -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+
162183csv 全称 Comma-Seperated Values 即逗号分开的值, 是一种文本文件格式, 用来存储表格数据, 数据项之间通常用逗号分隔, 行与行之间用换行符分隔. 实际上, 可以使用其他符号, 例如;来做分隔符
163184
164185下面通过一个读取csv文件的例子, 说明如何将csv中的数据读入 pytorch
165186
166187首先构造一个csv文件
188+
167189``` Python
168190import os
169191
@@ -178,6 +200,7 @@ with open(data_file, 'w') as f:
178200```
179201
180202从创建的文件中加载原始数据集
203+
181204``` Python
182205import 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
206230print (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# 使用平均值填充
218242inputs = inputs.fillna(inputs.mean())
219243print (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
230256import 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