对所有样本进行前向传播

问题描述 投票:0回答:1
import torch
import torch.nn as nn

class PINN(nn.Module):
    def __init__(self, input_dim, output_dim, hidden_layers, neurons_per_layer):
        super(PINN, self).__init__()
        layers = []
        layers.append(nn.Linear(input_dim, neurons_per_layer))
        for _ in range(hidden_layers):
            layers.append(nn.Linear(neurons_per_layer, neurons_per_layer))
        layers.append(nn.Linear(neurons_per_layer, output_dim))
        self.network = nn.Sequential(*layers)

    def forward(self, x):
        return self.network(x)

# Example: generating random input data
inputs = torch.rand((1000, 3))  # 3D input coordinates


model = PINN(input_dim=3, output_dim=3, hidden_layers=4, neurons_per_layer=64)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

epochs = 10000
for epoch in range(epochs):
    optimizer.zero_grad()  
    nn_output = model(inputs) # Compute the NN prediction
    # Compute e.g gradient of nn_output
    loss.backward()  
    optimizer.step() 

我想实现一个物理信息神经网络,其中输入是

N
3d 点 (x,y,z),此时神经网络输出是向量值量,即输入维度和输出维度都是一样的。

为了计算每个时期的损失,我需要拥有所有点的数量值。示例:对于

N=1000
点,我需要所有
1000
NN 预测,然后才能继续进行损失计算。 在我的代码中,我基本上给输入层提供了一个
1000x3
对象,假设 pytorch 将每一行 (
1x3
) 分别传递到网络,最后将其再次组织为
1000x3
对象。

pytorch 是这样工作的还是我必须重新考虑这种方法?

python machine-learning pytorch
1个回答
1
投票

是的,PyTorch 设置为完全按照您的建议处理批量样本。您可以传入所有 1000 个样本,然后您将从网络中获取 1000 个样本,在内部,这 1000 个样本中的每一个都将通过网络传递。试试吧!

以这个简单的网络为例:

# linear network with 3 input parameters and 3 output parameters
network = torch.nn.Linear(3, 3, bias=False)

# input with 2 samples
inputs = torch.randn(2, 3)

outputs = network(inputs)
print(outputs)
tensor([[0.1277, 0.5881, 0.1048],
        [0.3140, 0.2438, 0.1175]], grad_fn=<MmBackward0>)

# which is equivalent to matrix multiplying the network weights
# by each input sample 
for sample in inputs:
    print(torch.matmul(sample, network.weight.T))
tensor([0.1277, 0.5881, 0.1048], grad_fn=<SqueezeBackward4>)
tensor([0.3140, 0.2438, 0.1175], grad_fn=<SqueezeBackward4>)

一般来说,在训练神经网络的许多情况下,您将拥有大量的训练样本(数十万、数百万等!),并且在每个 epoch 期间,您将希望将所有这些样本传递到网络中在计算总损失之前。通常,这是不切实际的,在每个时期,您必须以较小的批次(“小批量”)传递样本,计算每个小批次输出的损失作为总体损失的近似值,并对其进行优化。如果您只有 1000 个样本,每个样本的大小只有 3 个参数,那么在训练时期将它们一次性全部通过网络是没有问题的。

© www.soinside.com 2019 - 2024. All rights reserved.