尽管输入变量发生变化,Pytorch 神经网络仍为整个批次返回一个值

问题描述 投票:0回答:1

即使输入发生变化,我的神经网络也仅在整个批次中输出一个值。 它由两个输入定义 - 距离 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 个值显示在上面的结果中,以证明所有值都是相同的。

python machine-learning deep-learning pytorch neural-network
1个回答
0
投票

这部分代码对我来说看起来不错。我认为问题在于你如何预处理

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) 作为示例。您不需要阅读整个教程。

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