相关文章
Pytorch学习笔记(一):torch.cat()模块的详解
Pytorch学习笔记(二):nn.Conv2d()函数详解
Pytorch学习笔记(三):nn.BatchNorm2d()函数详解
Pytorch学习笔记(四):nn.MaxPool2d()函数详解
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
Pytorch学习笔记(六):view()和nn.Linear()函数详解
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
文章目录
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️
1. 函数语法格式和作用⚠️
1.1 (view) 作用⚠️
在 PyTorch 中,view
函数是一个非常实用的张量操作函数,它的主要目的是对多维张量的数据形状进行调整。具体来说,它能够将具有复杂形状的多维数据,例如形状为(none,36,2,2)的张量,平铺为一维张量,例如转换为(none,144)的形状。这里的 “none” 通常表示张量的第一个维度是动态的,会根据实际输入数据的批次大小而变化。
这种功能类似于 Keras 中的 Flatten
函数,它们都用于将高维数据转换为一维数据,以便后续的处理。不过,二者在使用方式上存在一些差异。在 Keras 中,Flatten
函数通常是和卷积层等其他层一起组合使用,在构建模型的网络结构时进行声明。而在 PyTorch 中,view
函数一般是在模型的 forward
方法中才进行声明和使用。这是因为 PyTorch 的设计理念更强调灵活性和动态性,允许开发者在模型的前向传播过程中根据具体需求对张量形状进行调整。
从本质上讲,view
函数的作用相当于 reshape
操作,它在不改变张量元素内容的前提下,重新定义张量的形状。但需要注意的是,view
函数要求张量在内存中是连续存储的,否则可能会导致错误。如果张量不连续,可以先使用 contiguous
方法将其转换为连续的张量,再使用 view
函数进行形状调整。
1.2 (view) 函数语言格式⚠️
view(out.size(0), -1)-------(none,36,2,2)平铺为一维如(none,144)
或者
view(-1, 1, 28, 28)-------torch.Size([96, 784])变为torch.Size([96, 1, 28, 28])
在第一种格式 view(out.size(0), -1)
中,out.size(0)
表示保持张量的第一个维度不变,即批次维度。-1
是一个特殊的参数,它表示根据张量的总元素数量自动计算该维度的大小。例如,对于形状为(none,36,2,2)的张量,总元素数量为 none * 36 * 2 * 2
,当使用 view(out.size(0), -1)
时,第二个维度会自动计算为 36 * 2 * 2 = 144
,从而实现将多维张量平铺为一维张量的效果。
在第二种格式 view(-1, 1, 28, 28)
中,-1
同样表示自动计算维度大小。这里将形状为 torch.Size([96, 784])
的张量转换为 torch.Size([96, 1, 28, 28])
,是因为 96 * 784 = 96 * 1 * 28 * 28
,通过这种方式可以将一维数据重新调整为具有特定形状的多维张量,以满足后续模型层的输入要求。
1.3 (nn.Linear) 作用⚠️
nn.Linear
是 PyTorch 中用于定义全连接层(fully connected layer,简称 fc)的类。全连接层在神经网络中起着至关重要的作用,它能够将输入数据的特征映射到指定的输出空间。
nn.Linear
的主要功能之一是可以固定输出通道数。在神经网络的构建过程中,通过调整 nn.Linear
层的参数,我们可以控制输出特征的维度,使得模型能够对输入数据进行有效的特征提取和变换。例如,在图像分类任务中,经过一系列卷积层和池化层处理后,得到的特征图需要通过全连接层将其映射到分类标签的维度上。通过设置 nn.Linear
层的 out_features
参数,我们可以指定输出的维度,从而实现对分类结果的预测。
此外,全连接层还可以学习到输入特征之间的复杂关系,通过权重矩阵和偏置向量对输入数据进行线性变换,将不同的特征组合起来,为模型提供更强大的表达能力。
1.4 (nn.Linear) 函数语言格式⚠️
nn.Linear(in_features, out_features, bias=True)
in_features
表示输入特征的维度,即输入张量的最后一维的大小。例如,如果输入张量的形状为 (batch_size, input_dim)
,那么 in_features
就是 input_dim
。
out_features
表示输出特征的维度,即经过全连接层变换后输出张量的最后一维的大小。这个参数决定了全连接层输出的特征数量,它直接影响着模型的表达能力和计算复杂度。
bias
是一个布尔值,默认值为 True
。当 bias
为 True
时,全连接层会在计算过程中添加一个偏置向量,这个偏置向量可以帮助模型更好地拟合数据,提高模型的准确性。如果 bias
为 False
,则不会添加偏置向量,此时全连接层的计算仅仅是输入数据与权重矩阵的矩阵乘法。
例如,要定义一个将输入特征维度为 100 映射到输出特征维度为 50 的全连接层,可以使用以下代码:
import torch.nn as nn
linear_layer = nn.Linear(100, 50)
在模型的 forward
方法中,可以这样使用该全连接层:
def forward(self, x):
x = linear_layer(x)
return x
通过这种方式,我们可以在 PyTorch 模型中灵活地使用全连接层,根据具体的任务需求调整模型的结构和参数。
2.参数解释⚠️
-
in_features指的是输入的二维张量的大小,即输入的[batch_size, size]中的size。
-
out_features指的是输出的二维张量的大小,即输出的二维张量的形状为[batch_size,output_size],当然,它也代表了该全连接层的神经元个数。
-
bias默认为True,可以学到额外的偏置
-
从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
3.具体代码⚠️
import torch
m = torch.nn.Linear(2, 3)
input = torch.randn(4, 2)
out = m(input)
print(m.weight.shape)
print(m.bias.shape)
print(out.size())
结果如下:
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️