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 是这样工作的还是我必须重新考虑这种方法?
是的,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 个参数,那么在训练时期将它们一次性全部通过网络是没有问题的。