在类初始化的时候并不会触发forward()函数的调用,而是在实例化后,在需要计算前向传播时才会被调用。
当你实例化了一个神经网络时,可以通过传入网络输入,调用其forward()函数输入到神经网络中,获取输出结果。
下面是一个简单的例子,使用一个随机初始化的神经网络来完成求X和Y的和的操作,供你参考:
import torch
import torch.nn as nn
class AddNet(nn.Module):
def __init__(self, in_dim, h_dim=5, out_dim=1):
super().__init__()
self.fc1 = nn.Linear(in_dim, h_dim)
self.fc2 = nn.Linear(h_dim, out_dim)
def forward(self, x, y):
out = torch.cat([x, y], dim=1)
out = torch.relu(self.fc1(out))
out = self.fc2(out)
return out
add_net = AddNet(in_dim=2)
x = torch.randn(1, 1)
y = torch.randn(1, 1)
result = add_net.forward(x, y)
print(result)
在上述代码中,我们定义了一个AddNet神经网络类,它包含两个全连接层,其中第一层连接输入的x和y,第二层输出一个单独的节点,即对x和y的和的预测。在forward()函数中,我们将x和y按列拼接组成(1,2)的输入,接着经过一层ReLU激活函数和一层线性层后输出结果。在实例化类时,我们可以通过调用forward()函数传入我们需要计算的x和y值,并获取计算结果。
以上代码是一个简单的例子,展示了如何利用PyTorch中的nn.Module类定义一个小型神经网络,并如何利用前向传播函数forward()实现输入到输出的计算,以达到函数调用的效果。
在上面的代码中,torch.randn(1, 1)的作用是生成一个1行1列的张量,其中的值是从均值为0、标准差为1的正态分布中随机采样得到的。这个张量代表了模型需要计算的一个输入值。由于AddNet模型需要两个输入数值来进行计算,所以我们在生成两个随机数张量x和y之后,把它们传入到模型的forward()函数中,来获取它们的和的计算结果。
这里使用 torch.randn() 的作用是随机生成输入。torch.randn() 是一个PyTorch内置函数,能够生成标准正态分布随机数。因为神经网络的输入往往是实际场景中的数据,训练数据的特点也具备随机性,所以在进行前向计算的过程中,需要将一些随机的输入植入到神经网络中,以验证神经网络的泛化能力,并提高其对不同数据集的适应性。而使用 torch.randn() 随机生成的数据分布在标准正态分布的范围内,适合使用在未知数据上的预测中。
在上面的代码中,torch.cat([x, y], dim=1)的作用是将张量x和y沿着列维度(dim=1)进行拼接,构成一个新的张量。在这个案例中,我们定义了一个AddNet神经网络,需要对两个张量x和y进行求和操作。为了将x和y输入到神经网络中,我们需要将它们拼接成一个新的2列的张量。
举一个例子,如果x和y分别如下定义:
x = torch.tensor([[1]])
y = torch.tensor([[2]])
#执行torch.cat([x, y], dim=1)的结果为:
tensor([[1, 2]])
这就是把x和y沿着列维度进行拼接之后所形成的一个新的张量。在这个程序中,将随机生成的大小为(1,1)的张量x和y使用torch.cat()函数进行拼接,其中dim=1表示在列维度上进行拼接,生成一个形状为(1,2)的新张量。这个新张量的第一列对应着x这个大小为(1,1)的张量中的唯一元素,而第二列对应着y这个大小为(1,1)的张量中的唯一元素,两者合并为一个大小为(1,2)的张量,可以作为神经网络模型的输入。