输入部分实现

发布时间:2024年01月13日

6.2.2输入部分实现-part4

一些pytorch方法

torch.randn

x = torch.randn(4,4) 这行代码是在使用PyTorch库生成一个4x4的张量(tensor),其中每个元素都是从标准正态分布(均值为0,标准差为1)中随机采样的。

具体来说:

  • torch.randn 是一个函数,用于从标准正态分布(也称为高斯分布)中随机采样。
  • (4,4) 是这个张量的形状(shape)。这意味着这个张量有4行和4列,总共16个元素。
  • x 是这个新生成的张量的变量名。

执行这行代码后,x 将是一个4x4的张量,其中的值都是随机的,且符合标准正态分布。

view

y = x.view(16)
这行代码是将张量x重新塑形(reshape)为一个包含16个元素的1D张量。

具体来说:

  • x.view() 是PyTorch中用于改变张量形状的方法。
  • (16) 指定了新的形状。因为原始张量x是一个4x4的2D张量,所以它包含16个元素。
  • y 是这个新生成的1D张量的变量名。

执行这行代码后,y 将是一个1D张量,其中包含原始张量x中的所有16个元素,但是其形状已经被改变。
view 方法的参数主要包括:

  1. 必需参数

    • size:目标张量的形状。它是一个表示新形状的整数或元组。如果这个参数与原始张量的总元素数量不匹配,将会抛出错误。
  2. 可选参数

    • strides:目标张量的步长(strides)。它是一个表示新步长的整数或元组。默认值是 None,表示使用原始张量的步长。
    • dtype:目标张量的数据类型。默认值是原始张量的数据类型。
    • device:目标张量应存储在哪个设备上(例如CPU或GPU)。默认值是 None,表示使用原始张量的设备。
    • requires_grad:一个布尔值,表示是否需要为新张量计算梯度。默认值是 False

指定方式示例:

  • 创建一个形状为 (16,) 的1D张量:
y = x.view(16)
  • 创建一个形状为 (4,4) 的2D张量:
y = x.view(4, 4)
  • 指定步长:
y = x.view(16, stride=4)  # 假设x是一个8x4的张量,那么新的y将有步长为4
  • 指定数据类型:
y = x.view(16, dtype=torch.float32)  # 将所有元素转换为float32类型
  • 将张量移至GPU上:
y = x.view(16, device=torch.device('cuda'))  # 如果x原本在CPU上,现在y将在GPU上

transpose

a = torch.randn(1,2,3,4)
print(a.size(), a)
b = a.transpose(1,2)
print(b)

首先,让我们分析代码中每一步的作用:

  1. a = torch.randn(1,2,3,4):这行代码创建了一个4维的张量a,其形状为(1,2,3,4)。张量中的元素是随机生成的,遵循标准正态分布(均值为0,标准差为1)。
  2. print(a.size(), a):这行代码首先打印出张量a的形状,然后打印出张量a的内容。
  3. b = a.transpose(1,2):这行代码对张量a进行转置操作。具体来说,它交换了第2维(索引为1的维度)和第3维(索引为2的维度)。所以,原来的形状(1,2,3,4)会变为(1,3,2,4)
  4. print(b):这行代码打印出转置后的张量b的内容。

现在,我们来具体解释每一部分:

  • a.size():这将返回一个表示张量a形状的元组,即(1,2,3,4)
  • a:这将打印出张量a的内容。由于这是一个四维张量,并且每一维的大小都不同,因此输出的内容会是一系列嵌套的列表,表示各个维度的大小。
  • b:这将打印出转置后的张量b的内容。由于b是通过对第2维和第3维进行转置得到的,所以输出的内容会有所不同。具体来说,原始张量中在第2维的元素(索引为1的维度)现在会出现在第3维的位置(索引为2的维度),而原始张量中在第3维的元素现在会出现在第2维的位置。

这样,你就能清楚地看到transpose操作是如何改变张量的维度顺序的。

view和transpose对比

a = torch.randn(1,2,3,4)
print(a.size(), a)
b = a.transpose(1,2)
print(b.size(), b)
c = a.view(1,3,2,4)
print(c.size(), c)

让我们一步步分析这段代码:

  1. a = torch.randn(1,2,3,4)
    这行代码创建了一个形状为 (1,2,3,4) 的四维张量 a。每个元素都是从标准正态分布中随机采样的。
  2. print(a.size(), a)
    这行代码打印了张量 a 的形状和内容。由于 a 的形状是 (1,2,3,4),所以输出的 a.size() 将是 (1,2,3,4),而 a 的内容是该形状的随机数矩阵。
  3. b = a.transpose(1,2)
    这行代码对张量 a 进行转置。具体来说,它交换了第2维(索引为1)和第3维(索引为2)。因此,b 的形状将从 (1,2,3,4) 变为 (1,3,2,4)
  4. print(b.size(), b)
    这行代码打印了转置后的张量 b 的形状和内容。输出的 b.size() 将是 (1,3,2,4),而 b 的内容是该形状的转置矩阵。
  5. c = a.view(1,3,2,4)
    这行代码改变了张量 a 的形状,将其重新塑形为一个形状为 (1,3,2,4) 的四维张量。注意,这里与之前的转置操作不同,view 方法不会改变张量中的元素,只是改变了它们的布局方式。因此,c 和原始的 a 将包含相同的元素,只是它们的排列顺序不同。
  6. print(c.size(), c)
    这行代码打印了重新塑形后的张量 c 的形状和内容。输出的 c.size() 将是 (1,3,2,4),而 c 的内容是该形状的矩阵。

总结:这段代码展示了如何在 PyTorch 中创建、转置和重新塑形四维张量。通过这些操作,你可以改变张量的维度顺序和大小,而不改变其包含的元素。

deepcopy

def clones(module, N):
    return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])

这个函数clones用于创建一个包含多个克隆模块的列表。让我们逐步解释这个函数:

  1. 输入参数:

    • module: 这是要克隆的原始模块。
    • N: 表示我们想要克隆module多少次。
  2. 函数功能:

    • 使用列表推导式,函数会创建Nmodule的深度复制(deep copy)。这意味着每个克隆模块都是原始模块的一个完全独立的副本,它们之间的任何更改都不会相互影响。
    • nn.ModuleList是一个特殊的PyTorch容器,它用于存储模块列表,并确保当这个容器被传递给其他函数或方法时,其内容(即模块)也被传递,而不是只传递引用。这对于确保模块的独立性非常有用。
  3. 返回值:

    • 返回一个包含N个克隆模块的nn.ModuleList

简单地说,这个函数允许您轻松地创建多个独立副本的特定模块,这对于某些神经网络结构(例如,复制相同的网络层多次)是非常有用的。

文章来源:https://blog.csdn.net/u014520586/article/details/135537278
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。