即使输入发生变化,我的神经网络也仅在整个批次中输出一个值。 它由两个输入定义 - 距离 x 和时间 t。输出为压力 h 和流量 q。
神经网络具有物理知识,因此它可以在每次迭代中求解控制管道中流体流动的偏微分方程,并将其作为损失函数的一部分。这以 loss_pde 的形式给出,并在训练循环中定义,其中 F1 和 F2 是包含偏微分方程的相应方程。
作为一般测试和错误修复,我更改了激活函数、优化器和学习率来尝试修复问题,但对结果没有影响
神经网络架构定义为:
class FCN(nn.Module):
def __init__(self, N_INPUT, N_OUTPUT, N_HIDDEN, N_LAYERS):
super().__init__()
activation = nn.Tanh
self.fcs = nn.Sequential(
nn.Linear(N_INPUT, N_HIDDEN),
activation()
)
self.fch = nn.Sequential(*[
nn.Sequential(
nn.Linear(N_HIDDEN, N_HIDDEN), # Adjust input size to N_HIDDEN
activation()
) for _ in range(N_LAYERS - 1)
])
self.fce = nn.Linear(N_HIDDEN, N_OUTPUT) # Output layer
def forward(self, x, t):
inputs = torch.cat([x, t], axis = 1)
inputs = self.fcs(inputs)
inputs = self.fch(inputs)
outputs = self.fce(inputs)
return outputs
pinn = FCN(2, 2, 9, 12)
训练循环定义为:
for i in range (200001):
w_f = 1e-3
optimiser.zero_grad()
colloc_output = pinn(x_colloc, t_colloc)
h_hat, q_hat = colloc_output[:,0], colloc_output[:,1]
dq_dt = torch.autograd.grad(q_hat, t_colloc, torch.ones_like(q_hat), create_graph=True)[0]
dq_dx = torch.autograd.grad(q_hat, x_colloc, torch.ones_like(q_hat), create_graph=True)[0]
dh_dt = torch.autograd.grad(h_hat, t_colloc, torch.ones_like(h_hat), create_graph=True)[0]
dh_dx = torch.autograd.grad(h_hat, x_colloc, torch.ones_like(h_hat), create_graph=True)[0]
F1 = Cs_A * dq_dt + q_hat * dq_dx + g * Cs_A**2 * dh_dx + f * (torch.abs(q_hat) * q_hat) / (2 * diam)
F2 = Cs_A * dh_dt + q_hat * dh_dx + a**2/g * dq_dx
loss_pde = torch.mean(F1**2 + F2**2)
train_output = pinn(x_train_rand, t_train_rand)
loss_data = torch.mean((train_output - hq_tr)**2)
loss = w_f * loss_pde + loss_data
loss.backward()
optimiser.step()
输入是大小为 (380,2) 的张量,每列分别代表 x 和 t。 x 列填充了一个值 = 155 m,时间列填充了 0、10s 之间的 380 个值。灰线显示系统的预期行为,蓝线显示神经网络的当前输出。 数据丢失仅减少到约 163 的值,因为这是整个批次只有一个值时所能达到的最接近值,前 5 个值显示在上面的结果中,以证明所有值都是相同的。
这部分代码对我来说看起来不错。我认为问题在于你如何预处理
x_collate
和 t_collate
。您应该检查实验中每批次的它们是否相同。顺便说一句,使用
Dataset
和 Dataloader
来预处理训练数据并将其包装成批次是一种约定。请参阅 https://pytorch.org/tutorials/beginner/basics/data_tutorial.html#:~:text=class%20CustomImageDataset(,image%2C%20label 和 https://pytorch.org/tutorials/beginner/basics/ data_tutorial.html#:~:text=train_dataloader%20%3D%20DataLoader(training_data%2C%20batch_size%3D64%2C%20shuffle%3DTrue) 作为示例。您不需要阅读整个教程。