Skip to content

Commit a1e850a

Browse files
committed
post: d2l
1 parent c60f6c9 commit a1e850a

File tree

5 files changed

+251
-10
lines changed

5 files changed

+251
-10
lines changed
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
+++
2+
date = '2021-03-21T5:05:25+08:00'
3+
draft = true
4+
title = 'Dive into DeepLearning - Preliminaries'
5+
tags = ['DeepLearning']
6+
+++
7+
8+
- Course Note: d2l-video-04 - 数据操作+数据预处理
9+
- Jupyter Notebook: chapter\_preliminaries
10+
11+
### 介绍
12+
13+
**N 纬数组介绍**
14+
15+
- 0-d (标量)
16+
```
17+
1.0
18+
```
19+
一个类别
20+
21+
- 1-d (向量)
22+
```
23+
[1.0, 2.7, 3.4]
24+
```
25+
一个特征向量
26+
27+
- 2-d (矩阵)
28+
```
29+
[[1.0, 2.7, 3.4],
30+
[1.0, 2.7, 3.4],
31+
[1.0, 2.7, 3.4]]
32+
```
33+
一个样本 - 特征矩阵
34+
35+
- 3-d RGB 图片(宽 x 高 x 通道)
36+
```
37+
[[[1.0, 2.7, 3.4],
38+
[1.0, 2.7, 3.4],
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+
```
44+
45+
- 4-d 一个 RGB 图片批量 (批量大小 x 宽 x 高 x 通道)
46+
```
47+
[[[[...
48+
...
49+
...]]]]
50+
```
51+
52+
- 5-d 一个视屏批量 (批量大小 x 时间 x 宽 x 高 x 通道)
53+
54+
55+
### Data Manipulation 数据操作
56+
张量(tensor)表示一个数值表示的数组, 这个数组可能有多个纬度, 下面介绍一下 pytorch 里面基础的张量运算
57+
58+
- 创建张量
59+
```Python
60+
import torch
61+
x = torch.arange(12)
62+
63+
shape = x.shape # 元素形状
64+
num = x.numel() # 元素总数
65+
X = x.reshape(3, 4) # 改变张量形状
66+
```
67+
68+
- 生成张量
69+
```Python
70+
torch.zeros((2, 3, 4)) # 形状为 2x3x4 的全0张量
71+
torch.ones((2, 3, 4)) # 形状为 2x3x4 的全1张量
72+
torch.randn(3, 4) # 形状为 3 x 4 的随机张量
73+
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 通过py数组生成张量
74+
```
75+
76+
- 张量运算
77+
```Python
78+
x = torch.tensor([1.0, 2, 4, 8]) # .0 表示为浮点数, 会转换为浮点数张量, 而不是整数
79+
y = torch.tensor([2, 2, 2, 2])
80+
x + y, x - y, x * y, x / y, x ** y # 对应位置的元素进行标准运算
81+
```
82+
83+
按照行 或 列 连结(concatenate) 在一起
84+
```Python
85+
X = torch.arange(12, dtype=torch.float32).reshape((3,4)) # shape: 3x4
86+
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # shape: 3x4
87+
88+
torch.cat((X, Y), dim=0) # 第0纬(外层)连结: 变成6x8
89+
torch.cat((X, Y), dim=1) # 第1纬(内存)连结: 变成3x8
90+
```
91+
92+
通过逻辑运算符构建二元张量
93+
```Python
94+
X == Y
95+
```
96+
97+
张量所有元素求和
98+
```Python
99+
X.sum()
100+
```
101+
102+
即使形状不同, 仍然可以通过调用 **广播机制**(**broadcasting mechanism**) 来执行按元素操作
103+
```Python
104+
# 使用 广播机制(broadcasting mechanism) 将形状不同的元素相加
105+
a = torch.arange(3).reshape((3, 1))
106+
b = torch.arange(2).reshape((1, 2))
107+
108+
# 将 a 3x2 复制为 3x2 的矩阵
109+
# 将 b 1x2 复制为 3x2 的矩阵
110+
a + b
111+
```
112+
113+
- 选择元素
114+
```Python
115+
X[-1], X[1:3] # 使用下标, 切片获取元素
116+
X[1, 2] = 9 # 使用指定索引修改元素
117+
X[0:2, :] = 12 # 为多个元素复制 (第一纬度中的 0,1 全部赋值为12)
118+
```
119+
120+
- 内存相关
121+
内存重新分配
122+
```Python
123+
before = id(Y)
124+
Y = Y + X # 这里加法导致Y内存重新分配
125+
id(Y) == before
126+
# False
127+
```
128+
129+
执行原地操作
130+
```Python
131+
Z = torch.zeros_like(Y)
132+
print('id(Z):', id(Z))
133+
134+
# 使用X[:] = X + Y或X += Y来减少操作的内存开销
135+
Z[:] = X + Y
136+
print('id(Z):', id(Z)) # 与上 print 输出相同
137+
138+
before = id(X)
139+
X += Y
140+
id(X) == before # True
141+
```
142+
143+
- 类型转换
144+
转换为NumPy张量 (ndarray)
145+
```Python
146+
A = X.numpy()
147+
B = torch.tensor(A)
148+
type(A), type(B)
149+
#> (numpy.ndarray, torch.Tensor)
150+
```
151+
152+
将大小为1的张量转换为Python标量
153+
```Python
154+
a = torch.tensor([3.5])
155+
a, a.item(), float(a), int(a)
156+
#> (tensor([3.5000]), 3.5, 3.5, 3)
157+
```
158+
159+
### Data Preprocessing 数据预处理
160+
csv 全称 Comma-Seperated Values 即逗号分开的值, 是一种文本文件格式, 用来存储表格数据, 数据项之间通常用逗号分隔, 行与行之间用换行符分隔. 实际上, 可以使用其他符号, 例如;来做分隔符
161+
162+
下面通过一个读取csv文件的例子, 说明如何将csv中的数据读入 pytorch
163+
164+
首先构造一个csv文件
165+
```Python
166+
import os
167+
168+
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
169+
data_file = os.path.join('..', 'data', 'house_tiny.csv')
170+
with open(data_file, 'w') as f:
171+
f.write('NumRooms,Alley,Price\n')
172+
f.write('NA,Pave,127500\n')
173+
f.write('2,NA,106000\n')
174+
f.write('4,NA,178100\n')
175+
f.write('NA,NA,140000\n')
176+
```
177+
178+
从创建的文件中加载原始数据集
179+
```Python
180+
import pandas as pd
181+
182+
data = pd.read_csv(data_file)
183+
print(data)
184+
```
185+
186+
会得到如下表格(第一列索引不是表格内容)
187+
| | NumRooms | Alley | Price |
188+
| :--- | :--- | :--- | :--- |
189+
| 0 | NaN | Pave | 127500 |
190+
| 1 | 2.0 | NaN | 106000 |
191+
| 2 | 4.0 | NaN | 178100 |
192+
| 3 | NaN | NaN | 140000 |
193+
194+
为了处理缺失的数据, 常使用插值和删除的方法, 这里使用插值
195+
```Python
196+
# inputs: 所有行, 前两列数据, 房间数量和小巷
197+
# outputs: 所有行, 最后一列数据, 价格
198+
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
199+
200+
# 使用 pd.get_dummies() 将 Alley 分成两类, dummy_na 表示是否为缺失值(NaN)创建一个新的独热编码列
201+
# 当 dummy_na=True 时, 如果原始数据中有缺失值(NaN), 函数会创建一个新的列, 列名为原列名_nan, 并用True来标记所有原始值为NaN的行
202+
inputs = pd.get_dummies(inputs, dummy_na=True)
203+
204+
print(inputs)
205+
```
206+
| | NumRooms | Alley\_Pave | Alley\_nan |
207+
| :--- | :--- | :--- | :--- |
208+
| 0 | NaN | True | False |
209+
| 1 | 2.0 | False | True |
210+
| 2 | 4.0 | False | True |
211+
| 3 | NaN | False | True |
212+
213+
214+
```Python
215+
# 使用平均值填充
216+
inputs = inputs.fillna(inputs.mean())
217+
print(inputs)
218+
```
219+
| | NumRooms | Alley\_Pave | Alley\_nan |
220+
| :--- | :--- | :--- | :--- |
221+
| 0 | 3.0 | 1 | 0 |
222+
| 1 | 2.0 | 0 | 1 |
223+
| 2 | 4.0 | 0 | 1 |
224+
| 3 | 3.0 | 0 | 1 |
225+
226+
最后转换为 torch 张量
227+
```Python
228+
import torch
229+
230+
X = torch.tensor(inputs.to_numpy(dtype=float))
231+
y = torch.tensor(outputs.to_numpy(dtype=float))
232+
X, y
233+
```
234+
235+
输出
236+
```
237+
(tensor([[3., 1., 0.],
238+
[2., 0., 1.],
239+
[4., 0., 1.],
240+
[3., 0., 1.]], dtype=torch.float64),
241+
tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))
242+
```
243+
> 深度学习更多使用 float32 类型运算, 64位太慢了
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
+++
2-
date = '2025-08-20T8:00:00+08:00'
2+
date = '2025-08-02T8:00:00+08:00'
33
draft = true
44
title = 'A Program is not a PROCESS'
55
tags = ['OS']

content/posts/2025-08-02_programmer_humor_01.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ draft = false
44
title = '"Chaos Enginnering" In Partice'
55
tags = ['story']
66
+++
7+
记录一个小故事 hhh
8+
79
### “混沌工程”实践
810

911
项目延期,开发说时间不够干不完

content/posts/2025-08-18_IEEE-754.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ value = (-1)^(sign) x mantissa x 2^(exponent)
2525
浮点数由三部分组成:
2626
1. 符号位 sign: 0/1代表正负
2727
2. 阶码 exponent: 通常使用偏移表示法
28-
3. 尾数 mantissa/significand: 小数部分
28+
3. 尾数 fraction/mantissa: 小数部分
2929

3030
常见浮点数类型:
3131
- 单精度 float32: 1 位符号 + 8 位阶码 + 23 位尾数
@@ -88,10 +88,10 @@ value = (-1)^sign x (1 + fraction) x 2^(exponent - bias)
8888
8989
| 类别 (categories) | 符号位 (sign) | 阶码 (exponent) | 尾数 (fraction / mantissa) | 描述 |
9090
| :---------------- | :------------ | :-------------- | :------------------------- | :--------------------------------------- |
91-
| 正常数 | 0 或 1 | \[1, 2046] | 1.f \[1, ..., 1.1...1] 即 [1.0, 2-ε) | 阶码非全0且非全1, 尾数隐含最高位1 |
92-
| 非正规数 | 0 或 1 | 全 0 | 0.f (0, ..., 0.1...1] 即 (0, 1.0-ε] | 阶码全0, 尾数非全0, 无隐藏位1, 接近0 |
91+
| 正常数 | 0 或 1 | \[1, 2046] | 1.f 范围: \[1.0, 2-ε) | 阶码非全0且非全1, 尾数隐含最高位1 |
92+
| 非正规数 | 0 或 1 | 全 0 | 0.f 范围: (0, 1.0-ε] | 阶码全0, 尾数非全0, 无隐藏位1, 接近0 |
9393
| ±0 | 0 或 1 | 全 0 | 全 0 | 阶码全0, 尾数全0 |
9494
| ±∞ | 0 或 1 | 全 1 [2047] | 全 0 | 阶码全1, 尾数全0 |
9595
| NaN (qNaN / sNaN) | 0 或 1 | 全 1 [2047] | 非全 0 | 阶码全1, 尾数非全0, 表示无效或未定义运算 |
9696
97-
> 注意: 非正规数的阶码虽然为全0, 但是计算时约定为 1-bias = 1-1023 = -1022, 而不是像正规数那样数 exponent - bias
97+
> 注意: 非正规数的阶码虽然为全0, 但是计算时约定为 1-bias = 1-1023 = -1022, 而不是像正规数那样 exponent - bias

content/posts/2025-08-19_redis-learn.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,4 @@ class Log:
332332

333333
每当存储一个值到字符串键里面的时候, 有下面两种情况
334334
1. C 语言 long long int 类型的整数, 取值范围为 -2^63 ~ 2^63-1 (超出范围会被当成字符串)
335-
2. C 语言 long double 类型的浮点数, 正规数公式为 `value = (-1)^s x (1 + fraction) x 2^(exp-bias)`, s:1位 为符号位, fraction:52位 为尾数[0, 1), exp:11位 指数位, bias:2^10-1=1023 偏移量; 对于次正规数(指数全0)公式为 `value = (-1)^s x fraction x 2^(1-bias)`
336-
- 最大值: 指数全1, 除了最高位(都为1是无穷大NaN), 尾数全1, `MAX = (1 + (1 - 2^(-52))) x 2^(2046-1023)`
337-
- 最小正规值: 指数最小正规化=1, 尾数全0, `Normalized_min = 1 x 2^(1-1023)`
338-
- 次正规数: 当指数全为0表示次正规数, 尾数最小=0...01, `Subnormal_min = 2^(-1022) x 2^(-52)`, 次正规数用来表示比最小正规数还小的正数, 但精度降低
339-
335+
2. C 语言 long double 类型的浮点数

0 commit comments

Comments
 (0)