6.2.2输入部分实现-part4
x = torch.randn(4,4)
这行代码是在使用PyTorch库生成一个4x4的张量(tensor),其中每个元素都是从标准正态分布(均值为0,标准差为1)中随机采样的。
具体来说:
torch.randn
是一个函数,用于从标准正态分布(也称为高斯分布)中随机采样。(4,4)
是这个张量的形状(shape)。这意味着这个张量有4行和4列,总共16个元素。x
是这个新生成的张量的变量名。执行这行代码后,x
将是一个4x4的张量,其中的值都是随机的,且符合标准正态分布。
y = x.view(16)
这行代码是将张量x
重新塑形(reshape)为一个包含16个元素的1D张量。
具体来说:
x.view()
是PyTorch中用于改变张量形状的方法。(16)
指定了新的形状。因为原始张量x
是一个4x4的2D张量,所以它包含16个元素。y
是这个新生成的1D张量的变量名。执行这行代码后,y
将是一个1D张量,其中包含原始张量x
中的所有16个元素,但是其形状已经被改变。
view
方法的参数主要包括:
必需参数:
size
:目标张量的形状。它是一个表示新形状的整数或元组。如果这个参数与原始张量的总元素数量不匹配,将会抛出错误。可选参数:
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类型
y = x.view(16, device=torch.device('cuda')) # 如果x原本在CPU上,现在y将在GPU上
a = torch.randn(1,2,3,4)
print(a.size(), a)
b = a.transpose(1,2)
print(b)
首先,让我们分析代码中每一步的作用:
a = torch.randn(1,2,3,4)
:这行代码创建了一个4维的张量a
,其形状为(1,2,3,4)
。张量中的元素是随机生成的,遵循标准正态分布(均值为0,标准差为1)。print(a.size(), a)
:这行代码首先打印出张量a
的形状,然后打印出张量a
的内容。b = a.transpose(1,2)
:这行代码对张量a
进行转置操作。具体来说,它交换了第2维(索引为1的维度)和第3维(索引为2的维度)。所以,原来的形状(1,2,3,4)
会变为(1,3,2,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
操作是如何改变张量的维度顺序的。
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)
让我们一步步分析这段代码:
a = torch.randn(1,2,3,4)
:(1,2,3,4)
的四维张量 a
。每个元素都是从标准正态分布中随机采样的。print(a.size(), a)
:a
的形状和内容。由于 a
的形状是 (1,2,3,4)
,所以输出的 a.size()
将是 (1,2,3,4)
,而 a
的内容是该形状的随机数矩阵。b = a.transpose(1,2)
:a
进行转置。具体来说,它交换了第2维(索引为1)和第3维(索引为2)。因此,b
的形状将从 (1,2,3,4)
变为 (1,3,2,4)
。print(b.size(), b)
:b
的形状和内容。输出的 b.size()
将是 (1,3,2,4)
,而 b
的内容是该形状的转置矩阵。c = a.view(1,3,2,4)
:a
的形状,将其重新塑形为一个形状为 (1,3,2,4)
的四维张量。注意,这里与之前的转置操作不同,view
方法不会改变张量中的元素,只是改变了它们的布局方式。因此,c
和原始的 a
将包含相同的元素,只是它们的排列顺序不同。print(c.size(), c)
:c
的形状和内容。输出的 c.size()
将是 (1,3,2,4)
,而 c
的内容是该形状的矩阵。总结:这段代码展示了如何在 PyTorch 中创建、转置和重新塑形四维张量。通过这些操作,你可以改变张量的维度顺序和大小,而不改变其包含的元素。
def clones(module, N):
return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])
这个函数clones
用于创建一个包含多个克隆模块的列表。让我们逐步解释这个函数:
输入参数:
module
: 这是要克隆的原始模块。N
: 表示我们想要克隆module
多少次。函数功能:
N
个module
的深度复制(deep copy)。这意味着每个克隆模块都是原始模块的一个完全独立的副本,它们之间的任何更改都不会相互影响。nn.ModuleList
是一个特殊的PyTorch容器,它用于存储模块列表,并确保当这个容器被传递给其他函数或方法时,其内容(即模块)也被传递,而不是只传递引用。这对于确保模块的独立性非常有用。返回值:
N
个克隆模块的nn.ModuleList
。简单地说,这个函数允许您轻松地创建多个独立副本的特定模块,这对于某些神经网络结构(例如,复制相同的网络层多次)是非常有用的。