首页 > 其他分享 >动手做科研-day04-pytorch学习

动手做科研-day04-pytorch学习

时间:2024-08-20 19:17:04浏览次数:2  
标签:动手做 frac tensor torch 张量 day04 pytorch dx 维度

写练习时遇到的问题

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$$, 所以,

\[\mu = \int_{0}^{1} x \cdot 1 \, dx = \int_{0}^{1} x \, dx = \left[\frac{x^2}{2}\right]_{0}^{1} = \frac{1}{2} = 0.5 \]

方差 \(\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

相关文章

  • PyTorch中的随机采样秘籍:SubsetRandomSampler全解析
    标题:PyTorch中的随机采样秘籍:SubsetRandomSampler全解析在深度学习的世界里,数据是模型训练的基石。而如何高效、合理地采样数据,直接影响到模型训练的效果和效率。PyTorch作为当前流行的深度学习框架,提供了一个强大的工具torch.utils.data.SubsetRandomSampler,它允许开发者......
  • 支持cuda的pytorch
    (.venv)PSC:\Users\augus\PycharmProjects\pythonProject>pip3installtorchtorchvisiontorchaudio--index-urlhttps://download.pytorch.org/whl/cu124Lookinginindexes:https://download.pytorch.org/whl/cu124Requirementalreadysatisfied:torchinc......
  • Focal Loss详解及其pytorch实现
    FocalLoss详解及其pytorch实现文章目录FocalLoss详解及其pytorch实现引言二分类与多分类的交叉熵损失函数二分类交叉熵损失多分类交叉熵损失FocalLoss基础概念关键点理解什么是难分类样本和易分类样本?超参数......
  • 深度学习加速秘籍:PyTorch torch.backends.cudnn 模块全解析
    标题:深度学习加速秘籍:PyTorchtorch.backends.cudnn模块全解析在深度学习领域,计算效率和模型性能是永恒的追求。PyTorch作为当前流行的深度学习框架之一,提供了一个强大的接口torch.backends.cudnn,用于控制CUDA深度神经网络库(cuDNN)的行为。本文将深入探讨torch.backends.cu......
  • 深度学习-pytorch-basic-001
    importtorchimportnumpyasnptorch.manual_seed(1234)<torch._C.Generatorat0x21c1651e190>defdescribe(x):print("Type:{}".format(x.type()))print("Shape/Size:{}".format(x.shape))print("Values:{}"......
  • PyTorch深度学习实战(18)—— 可视化工具
    在训练神经网络时,通常希望能够更加直观地了解训练情况,例如损失函数曲线、输入图片、输出图片等信息。这些信息可以帮助读者更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的办法就是打印输出,这种方式只能打印数值信息,不够直观,同时无法查看分布、图片、声音等......
  • 零基础学习人工智能—Python—Pytorch学习(五)
    前言上文有一些文字打错了,已经进行了修正。本文主要介绍训练模型和使用模型预测数据,本文使用了一些numpy与tensor的转换,忘记的可以第二课的基础一起看。线性回归模型训练结合numpy使用首先使用datasets做一个数据X和y,然后结合之前的内容,求出y_predicted。#pipinstallmatp......
  • PyTorch--双向长短期记忆网络(BiRNN)在MNIST数据集上的实现与分析
    文章目录前言完整代码代码解析1.导入库2.设备配置3.超参数设置4.数据集加载5.数据加载器6.定义BiRNN模型7.实例化模型并移动到设备8.损失函数和优化器9.训练模型10.测试模型11.保存模型常用函数前言本代码实现了一个基于PyTorch的双向长短期记忆网络(BiRNN),用于对MNI......
  • 用pytorch实现LeNet-5网络
     上篇讲述了LeNet-5网络的理论,本篇就试着搭建LeNet-5网络。但是搭建完成的网络还存在着问题,主要是训练的准确率太低,还有待进一步探究问题所在。是超参数的调节有问题?还是网络的结构有问题?还是哪里搞错了什么1.库的导入dataset:datasets.MNIST()函数,该函数作用是导入MNIST数......
  • PyTorch--实现循环神经网络(RNN)模型
    文章目录前言完整代码代码解析导入必要的库设备配置超参数设置数据集加载数据加载器定义RNN模型实例化模型并移动到设备损失函数和优化器训练模型测试模型保存模型小改进神奇的报错ValueError:LSTM:Expectedinputtobe2Dor3D,got4Dinstead前言首先,这篇......