写练习时遇到的问题
1. 如何判断一个张量的分布服从[0,1)的均匀分布?
t = torch.rand(5, 4)
怎么证明这个是服从均匀分布的?
解决:
均匀分布的概率密度f(x)为:\(f(x) = \frac{1}{b-a}\), 其中x为[a, b],根据本例子为f(x) = 1, \(x \in [0,1]\)
均值\(\mu\)的计算为:$$\mu = \int_{a}^{b} x f(x) , dx$$, 所以,
方差 \(\sigma^2\) 是根据以下公式计算的:
\[\sigma^2 = \int_{a}^{b} (x - \mu)^2 f(x) \, dx \]对于均匀分布 \([0, 1)\):
\[\sigma^2 = \int_{0}^{1} (x - 0.5)^2 \cdot 1 \, dx = \int_{0}^{1} (x - 0.5)^2 \, dx \]分别计算三个部分的积分:
\[\int_{0}^{1} x^2 \, dx = \left[\frac{x^3}{3}\right]_{0}^{1} = \frac{1}{3} \]\[\int_{0}^{1} x \, dx = \left[\frac{x^2}{2}\right]_{0}^{1} = \frac{1}{2} \]\[\int_{0}^{1} \frac{1}{4} \, dx = \frac{1}{4} \cdot \left[x\right]_{0}^{1} = \frac{1}{4} \]因此,方差为:
\[\sigma^2 = \frac{1}{3} - \frac{1}{2} + \frac{1}{4} = \frac{4}{12} - \frac{6}{12} + \frac{3}{12} = \frac{1}{12} \]标准差 \(\sigma\) 是方差的平方根:
\[\sigma = \sqrt{\frac{1}{12}} \approx 0.2887 \]写出对应代码:
print(t.mean())
print(t.std())
"""
结果:
tensor(0.5417)
tensor(0.2662)
"""
是符合均匀分布的, 得到解决
2. cat和stack的区别
GPT回答:
`torch.stack` 和 `torch.cat` 都是 PyTorch 中用于操作张量的函数,但它们的作用和行为有所不同。
### 1. `torch.cat`
- **功能**: `torch.cat` 是沿着已有的维度拼接张量。它不会创建新的维度,而是将多个张量在指定维度上连接起来。
- **参数**:
- `tensors`:要连接的张量列表。
- `dim`:沿着哪个维度进行拼接。
- **示例**:
```python
import torch
# 创建两个形状为 (2, 3) 的张量
t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t2 = torch.tensor([[7, 8, 9], [10, 11, 12]])
# 沿着第0维拼接
result = torch.cat((t1, t2), dim=0)
print(result)
```
输出:
```
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
```
这里 `t1` 和 `t2` 沿着第0维拼接,结果的形状为 `(4, 3)`。
### 2. `torch.stack`
- **功能**: `torch.stack` 是沿着新维度拼接张量。与 `torch.cat` 不同,`torch.stack` 会创建一个新的维度。它不仅将张量拼接在一起,还会在指定的维度上增加一个新的维度。
- **参数**:
- `tensors`:要堆叠的张量列表。
- `dim`:新维度插入的位置。
- **示例**:
```python
import torch
# 创建两个形状为 (2, 3) 的张量
t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t2 = torch.tensor([[7, 8, 9], [10, 11, 12]])
# 沿着新维度堆叠
result = torch.stack((t1, t2), dim=0)
print(result)
```
输出:
```
tensor([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
```
这里 `t1` 和 `t2` 沿着新维度堆叠,结果的形状为 `(2, 2, 3)`。
### 总结区别
- **维度变化**:
- `torch.cat`: 沿着指定的已有维度拼接张量,拼接后张量的维度不会增加。
- `torch.stack`: 在新维度上堆叠张量,拼接后张量的维度会增加一个。
- **使用场景**:
- 使用 `torch.cat` 可以在不改变张量的维度数量的情况下拼接张量,常用于数据扩展、合并等操作。
- 使用 `torch.stack` 可以在需要保留各张量独立性(如生成批次)或需要增加新的维度的情况下堆叠张量。
由于torch.stack会有新的维度产生,需要reshape操作才能和cat的效果保持一致。
3. 内存共享
在 PyTorch 中,tensor 和 numpy 数组之间可以相互转换。转换过程中有两种情况需要注意:
共享内存:当你使用 tensor.numpy() 将一个 PyTorch 张量转换为 NumPy 数组时,得到的 NumPy 数组与原始张量共享相同的内存。这意味着对其中任何一个的修改都会影响另一个。
不共享内存:当你直接使用 torch.tensor() 创建一个新的张量时,它会分配新的内存,不再与原来的张量或数组共享内存。因此,此后对张量或数组的修改不会影响另一个。
在进行梯度回传时, 定义一个变量对网络权重进行赋值操作,发现更新后用==时权重没有发生变化,但是实际上权重已经改变,由于内存共享的原因,造成更新的同时赋值的变量也被更新
利用。
x = tensor.clone()
创建一个内存相互独立的变量
标签:动手做,frac,tensor,torch,张量,day04,pytorch,dx,维度 From: https://www.cnblogs.com/xiaoyaoxie/p/18368998