机器学习第二十八周周报 PINNs2

文章目录

  • week28 PINNs2
  • 摘要
  • Abstract
  • 一、Lipschitz条件
  • 二、文献阅读
    • 1. 题目
    • 数据驱动的偏微分方程
    • 2. 连续时间模型
    • 3. 离散时间模型
    • 4.结论
  • 三、CLSTM
    • 1. 任务要求
    • 2. 实验结果
    • 3. 实验代码
      • 3.1模型构建
      • 3.2训练过程代码
    • 小结
    • 参考文献

week28 PINNs2

摘要

本文主要讨论PINN。本文简要介绍了Lipschitz条件。其次本文展示了题为Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations的论文主要内容。该论文提出了一个深度学习框架,使数学模型和数据能够协同结合。该文以此为基础引出了一种有效机制,用于在较小数据规模下规范化深度神经网络的训练。该方法能够在不完整的模型以及数据中推测出较为合理的结果。本文主要集中在该文第四节——数据驱动的偏微分方程。最后,本文基于pytorch实现了CLSTM并使用序列数据训练该模型。

Abstract

This article focuses on PINN. This article provides a brief introduction to the Lipschitz condition. Secondly, this article presents the main content of the paper entitled Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations. The paper proposes a deep learning framework that enables mathematical models and data to be synergistically combined. Based on this, this paper proposes an effective mechanism for the training of normalized deep neural networks at a small data scale. This method can infer reasonable results from incomplete models and data. This paper focuses on Section 4 of the paper, Data-driven discovery of partial differential equations. Finally, this article implements CLSTM based on pytorch and trains the model with sequential data.

一、Lipschitz条件

微信图片_20240201214405

二、文献阅读

1. 题目

题目:Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations

作者:M. Raissi, P. Perdikaris , G.E. Karniadakis

链接:https://www.sciencedirect.com/science/article/pii/S0021999118307125

发布:Journal of Computational Physics Volume 378, 1 February 2019, Pages 686-707

数据驱动的偏微分方程

本篇为该论文的第二部分,第一部分已经在上周周报中进行阐述。而在离散时间模型中的龙格库塔方法在上文中从一二阶进行了完整的推导,并给出了四阶龙格库塔的形式

注:正如上篇周报中一样,由于其实验在阐述模型的具体形式后给出,因此不再单独阐述实验。

该问题同样有两种不同类型的算法,即连续时间模型以及离散时间模型。

2. 连续时间模型

7cf7249dc1858339d5581e0ee7c54ad

dc6148e0151431de2b688c10cd47cf3

为了针对该问题生成高分辨率数据集,采用spectral/hp-element求解器NekTar。

具体来说,解域通过由 412 个三角形元素组成的曲面细分在空间中离散化,并且在每个元素内,解近似为十阶分层半正交雅可比多项式展开的线性组合。假设在左边界处施加均匀的自由流速度分布,在位于圆柱体下游 25 个直径的右边界处施加零压力流出条件,以及 [−15, 25] × 的顶部和底部边界的周期性[−8, 8] 域。使用三阶刚性稳定方案对方程(15)进行积分,直到系统达到周期性稳态,如下图(a)所示。接下来,与该稳态解相对应的结果数据集的一小部分将用于模型训练,而其余数据将用于验证预测。

image-20240110203554151

给定流向 u(t, x, y) 和横向 v(t, x, y) 速度分量上的分散且潜在噪声的数据,目标是识别未知参数 λ1 和 λ2,并获得定性准确地重建气缸尾流中的整个压力场 p(t, x, y),根据定义只能识别一个常数。通过对完整高分辨率数据集进行随机子采样来创建训练数据集。

为了强调该方法从分散和稀缺的训练数据中学习的能力,选择 N = 5,000,仅相当于可用数据总数的 1%,如上图(b)所示。

使用的神经网络架构由 9 层组成,每层 20 个神经元。

如下图,即使训练数据被噪声破坏,物理信息神经网络也能够以非常高的精度正确识别未知参数 λ1 和 λ2。具体来说,对于无噪声训练数据的情况,估计λ1和λ2的误差分别为0.078%和4.67%。即使训练数据被 1% 的不相关高斯噪声破坏,预测仍然保持稳健,对于 λ1 和 λ2 分别返回 0.17% 和 5.70% 的误差。

下图展示了代表性压力快照与精确压力解的视觉比较。通过利用基础物理学从辅助测量中推断出连续的变量的物理信息神经网络能够较好的拟合参数,并凸显了其在解决高维逆问题方面的潜力。

image-20240110204629652

3. 离散时间模型

bb2288a37394f39228f1389b5359bd7

example:(Korteweg–de Vries 方程):以下简称KdV方程

KdV 方程为
u t + λ 1 u u x + λ 2 u x x x = 0 (27) u_t+\lambda_1uu_x+\lambda_2u_{xxx}=0 \tag{27} ut+λ1uux+λ2uxxx=0(27)
其中 (λ1, λ2) 为未知参数。

对于 KdV 方程,方程 (22) 中的非线性算子形式为
N [ u n + c j ] = λ 1 u n + c j − λ 2 u x x x n + c \mathcal N[u^{n+c_j}]=\lambda_1u^{n+c_j}-\lambda_2u_{xxx}^{n+c} N[un+cj]=λ1un+cjλ2uxxxn+c
并由该式同神经网络(23)、(24)的共享参数共同给出,和(25)以及KdV方程的参数 λ = ( λ 1 , λ 2 ) \lambda=(\lambda_1,\lambda_2) λ=(λ1,λ2)

KdV 方程的值可以通过最小化误差平方和(26)来学习

从初始条件 u(0, x) = cos(πx) 开始并假设周期性边界条件,使用带有谱傅里叶的 Chebfun 包将方程 (27) 积分到最终时间 t = 1.0使用 512 个模式和时间步长 t = 1 0 − 6 t = 10^{−6} t=106 的四阶显式龙格-库塔时间积分器进行离散化。使用该数据集,在时间 t n = 0.2 t_n = 0.2 tn=0.2 t n + 1 = 0.8 t_{n+1} = 0.8 tn+1=0.8 时提取两个解的快照,并使用 N n = 199 N_n = 199 Nn=199 N n + 1 = 201 N_{n+1} = 201 Nn+1=201 对它们进行随机子采样以生成训练数据集。然后,使用 L-BFGS 最小化方程 (26) 的误差平方和损失,从而使用这些数据来训练离散时间物理信息神经网络。这里使用的网络架构由 4 个隐藏层、每层 50 个神经元和一个输出层组成,该输出层预测 q 个 Runge-Kutta 阶段的解,即 u n + c j ( x ) , j = 1 , . . . , q u^{n+c_j(x)}, j = 1, ..., q un+cj(x),j=1,...,q,其中 q 是根据经验选择的,通过设置产生机器精度量级的时间误差累积
q = 0.5 log ⁡ ϵ / log ⁡ ( Δ t ) (28) q=0.5\log\epsilon/\log(\Delta t) \tag{28} q=0.5logϵ/log(Δt)(28)
在本例中 Δ t = 0.6 \Delta t=0.6 Δt=0.6

上图总结了该实验的结果。在顶部面板中,展示了精确的解 u ( t , x ) u(t, x) u(t,x)以及用于训练的两个数据快照的位置。中间面板给出了精确解决方案和训练数据的更详细概述。值得注意的是,方程(27)的复杂非线性动力学如何导致两个报告快照之间的解形式存在巨大差异。尽管存在这些差异,并且两个训练快照之间存在较大的时间间隙,但无论训练数据是否被噪声损坏,该方法都能够正确识别未知参数。具体来说,对于无噪声训练数据的情况,估计 λ 1 和 λ 2 λ_1 和 λ_2 λ1λ2 的误差分别为 0.023% 和 0.006%,而训练数据中有 1% 噪声的情况返回误差分别为 0.057% 和 0.017%。

image-20240116142902656

4.结论

该文引入了了基于物理的神经网络,这是一类新型的通用函数逼近器,能够对控制给定数据集的任何基本物理定律进行编码,并且可以通过偏微分方程进行描述。其设计了数据驱动算法,用于推断一般非线性偏微分方程的解,并构建计算高效的物理信息替代模型。由此产生的方法为计算科学中的各种问题展示了一系列有希望的结果,并为赋予深度学习强大的数学物理能力来模拟周围的世界开辟了道路。

三、CLSTM

本网络框架由该文章提出。该文章提出的C-LSTM 利用 CNN 提取一系列更高级别的表示,并将其输入到长短期记忆循环神经网络 (LSTM) 中以获得全局表示。C-LSTM能够捕获短语的局部特征以及全局和时间信息。该文章评估了所提出的关于情感分类和问题分类任务的架构。实验结果表明,C-LSTM的性能优于CNN和LSTM,可以在这些任务上取得优异的性能。

1. 任务要求

本文实现了上述网络结构,并使用从网络上爬取的序列信息作为数据集进行训练,详情参照第25周周报,故本文不再给出这部分内容相关解释。

2. 实验结果

训练结果如下:

image-20240201170447068

3. 实验代码

3.1模型构建

"""
Zhou C, Sun C, Liu Z, et al. A C-LSTM neural network for text classification[J]. arXiv preprint arXiv:1511.08630, 2015.
"""
import torch.nn as nn
import torchclass CLSTM(nn.Module):def __init__(self, config):super(CLSTM, self).__init__()if config.cell_type == 'RNN':rnn_cell = nn.RNNelif config.cell_type == 'LSTM':rnn_cell = nn.LSTMelif config.cell_type == 'GRU':rnn_cell = nn.GRUelse:raise ValueError("Unrecognized RNN cell type: " + config.cell_type)out_hidden_size = config.hidden_size * (int(config.bidirectional) + 1)self.config = configself.token_embedding = nn.Embedding(config.vocab_size, config.embedding_size)self.conv = nn.Conv2d(1, config.out_channels,kernel_size=(config.window_size, config.embedding_size))self.rnn = rnn_cell(config.out_channels, config.hidden_size, config.num_layers,batch_first=True, bidirectional=config.bidirectional)self.classifier = nn.Sequential(nn.Linear(out_hidden_size, config.num_classes))def forward(self, x, labels=None):""":param x: [batch_size, src_len]:param labels: [batch_size]:return:"""x = self.token_embedding(x)  # [batch_size, src_len, embedding_size]x = torch.unsqueeze(x, dim=1)  # [batch_size, 1, src_len, embedding_size]feature_maps = self.conv(x).squeeze(-1)  # [batch_size, out_channels, src_len-window_size+1]feature_maps = feature_maps.transpose(1, 2)  # [batch_size, src_len-window_size+1, out_channels]x, _ = self.rnn(feature_maps)  # [batch_size, src_len-window_size+1, out_hidden_size]if self.config.cat_type == 'last':x = x[:, -1]  # [batch_size, out_hidden_size]elif self.config.cat_type == 'mean':x = torch.mean(x, dim=1)  # [batch_size, out_hidden_size]elif self.config.cat_type == 'sum':x = torch.sum(x, dim=1)  # [batch_size, out_hidden_size]else:raise ValueError("Unrecognized cat_type: " + self.cat_type)logits = self.classifier(x)  # [batch_size, num_classes]if labels is not None:loss_fct = nn.CrossEntropyLoss(reduction='mean')loss = loss_fct(logits, labels)return loss, logitselse:return logitsclass ModelConfig(object):def __init__(self):self.num_classes = 15self.vocab_size = 8self.embedding_size = 16self.out_channels = 32self.window_size = 3self.hidden_size = 128self.num_layers = 1self.cell_type = 'LSTM'self.bidirectional = Falseself.cat_type = 'last'if __name__ == '__main__':config = ModelConfig()model = CLSTM(config)x = torch.randint(0, config.vocab_size, [2, 10], dtype=torch.long)label = torch.randint(0, config.num_classes, [2], dtype=torch.long)loss, logits = model(x, label)print(loss)print(logits)

3.2训练过程代码

from transformers import optimization
from torch.utils.tensorboard import SummaryWriter
import torch
from copy import deepcopy
import sys
import logging
import os
from CLSTM import CLSTMsys.path.append("../../")
from utils import TouTiaoNewsclass ModelConfig(object):def __init__(self):self.batch_size = 256self.epochs = 50self.learning_rate = 6e-4self.num_classes = 15self.vocab_size = 3000self.embedding_size = 256self.out_channels = 256  # input_dimself.window_size = 3  # cnn filter sizeself.hidden_size = 256  # rnn_hidden_sizeself.num_layers = 1self.cell_type = 'LSTM'self.bidirectional = Trueself.cat_type = 'last'self.num_warmup_steps = 200self.model_save_path = 'model.pt'self.summary_writer_dir = "runs/model"self.device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')# 判断是否存在GPU设备,其中0表示指定第0块设备logging.info("### 将当前配置打印到日志文件中 ")for key, value in self.__dict__.items():logging.info(f"### {key} = {value}")def train(config):toutiao_news = TouTiaoNews(top_k=config.vocab_size,batch_size=config.batch_size,cut_words=False)train_iter, val_iter = toutiao_news.load_train_val_test_data(is_train=True)model = CLSTM(config)if os.path.exists(config.model_save_path):logging.info(f" # 载入模型{config.model_save_path}进行追加训练...")checkpoint = torch.load(config.model_save_path)model.load_state_dict(checkpoint)optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate)writer = SummaryWriter(config.summary_writer_dir)model = model.to(config.device)max_test_acc = 0steps = len(train_iter) * config.epochsscheduler = optimization.get_cosine_schedule_with_warmup(optimizer, num_warmup_steps=config.num_warmup_steps,num_training_steps=steps, num_cycles=2)for epoch in range(config.epochs):for i, (x, y) in enumerate(train_iter):x, y = x.to(config.device), y.to(config.device)loss, logits = model(x, y)optimizer.zero_grad()loss.backward()optimizer.step()  # 执行梯度下降scheduler.step()if i % 50 == 0:acc = (logits.argmax(1) == y).float().mean()logging.info(f"Epochs[{epoch + 1}/{config.epochs}]--batch[{i}/{len(train_iter)}]"f"--Acc: {round(acc.item(), 4)}--loss: {round(loss.item(), 4)}")writer.add_scalar('Training/Accuracy', acc, scheduler.last_epoch)writer.add_scalar('Training/Loss', loss.item(), scheduler.last_epoch)test_acc = evaluate(val_iter, model, config.device)logging.info(f"Epochs[{epoch + 1}/{config.epochs}]--Acc on val {test_acc}")writer.add_scalar('Testing/Accuracy', test_acc, scheduler.last_epoch)if test_acc > max_test_acc:max_test_acc = test_accstate_dict = deepcopy(model.state_dict())torch.save(state_dict, config.model_save_path)def evaluate(data_iter, model, device):model.eval()with torch.no_grad():acc_sum, n = 0.0, 0for x, y in data_iter:x, y = x.to(device), y.to(device)logits = model(x)acc_sum += (logits.argmax(1) == y).float().sum().item()n += len(y)model.train()return acc_sum / ndef inference(config, test_iter):model = CLSTM(config)model.to(config.device)model.eval()if os.path.exists(config.model_save_path):logging.info(f" # 载入模型进行推理……")checkpoint = torch.load(config.model_save_path)model.load_state_dict(checkpoint)else:raise ValueError(f" # 模型{config.model_save_path}不存在!")first_batch = next(iter(test_iter))with torch.no_grad():logits = model(first_batch[0].to(config.device))y_pred = logits.argmax(1)logging.info(f"真实标签为:{first_batch[1]}")logging.info(f"预测标签为:{y_pred}")if __name__ == '__main__':config = ModelConfig()train(config)#   推理# toutiao_news = TouTiaoNews(top_k=config.vocab_size,#                            batch_size=config.batch_size,#                            cut_words=False)# test_iter = toutiao_news.load_train_val_test_data(is_train=False)# inference(config, test_iter)

小结

本文简要了解了Lipschitz条件,下周将继续学习MLP上的Lipshchitz条件并证明其是NP问题。

本文简要介绍了PINN,讨论了方面,在连续时间模型上使用NS方程验证模型,在离散时间模型上使用Korteweg–de Vries 方程验证模型,均表现出了较好的效果。下周将继续阅读序列化相关文章。

参考文献

[1] M. Raissi a, et al. “Physics-Informed Neural Networks: A Deep Learning Framework for Solving Forward and Inverse Problems Involving Nonlinear Partial Differential Equations.” Journal of Computational Physics, Academic Press, 3 Nov. 2018, www.sciencedirect.com/science/article/pii/S0021999118307125.

[2] Zhou C, Sun C, Liu Z, et al. A C-LSTM neural network for text classification[J]. arXiv preprint arXiv:1511.08630, 2015

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天然肠衣市场分析:预计到2025年将达到45亿美元

肠衣作为包装香肠馅料的原材料一般分为可食用和不可食用两种,其中天然肠是由猪、羊等家畜多层肠道制作而成的,近些年来天然肠衣在全球市场需求不断增加。一、全球市场分析 1. 市场规模:根据市场研究机构的数据,2019年全球天然肠衣…

访问学者感谢信|人文社科工作者赴北欧访学

编者按:这位访问学者从委托我们申请到获得邀请函只用了一个月时间。为了表达感激之情,其当时就写了这封感谢信,但依据我们的惯例,一般是待申请者出国,一切安排妥当后再发成功案例。所以时至今日,才将该申请…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

旧衣回收小程序开发,市场发展潜力巨大

在当下快节奏生活下,人们的闲置衣物越来越多,为了减少浪费,旧衣回收成成为了大众的选择。旧衣回收能够降低人们的损失,减少我国资源浪费,又能循环利用,是我国一个环保商业模式。 “互联网旧衣回收”推动市场…

消息队列(Message Queue)

目录 一、概念 二、消息队列使用场景 三、消息队列的两种模式 1.点对点模式 2.发布/订阅模式 四、常用消息队列介绍 1.RabbitMQ 1) 主要特性 2)安装需要 3)优点 4)缺点 2.ActiveMQ 1)主要特性 2) 安装需要 3)优…

洛谷C++简单题小练习day14—闰年推算小程序

day14--闰年推算小程序--2.18 习题概述 题目描述 输入 x,y,输出 [x,y] 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。 输入格式 输入两个正整数 x,y,以空格隔开。 输出格式 第一行输出一个正整数&#xf…

原创!顶级SCI优化!一键实现ICEEMDAN-NRBO-BiLSTM-Attention多变量时间序列预测!以光伏数据集为例

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍 模型流程 创新点 结果展示 完整…

opencv-python保存视频为mp4格式并支持在浏览器播放

前言 之前在项目上使用yolov8进行视频检测的时候,yolov8默认windows系统下保存的是avi格式 suffix, fourcc (.mp4, avc1) if MACOS else (.avi, WMV2) if WINDOWS else (.avi, MJPG) self.vid_writer[idx] cv2.VideoWriter(str(Path(save_path).with_suffix(suf…

【感知机】感知机(perceptron)学习算法知识点汇总

机器学习——感知机 感知机(perceptron)是一种二分类的线性模型,属于判别模型,也称为线性二分类器。输入为实例的特征向量,输出为实例的类别(取1和-1)。可以视为一种使用阶梯函数激活的人工神经元,例如通过梅尔频率倒谱系数(MFCC…

N叉树的后序遍历

1.题目 这道题是2024-2-19的签到题,题目难度为简单。 考察的知识点为DFS算法(树的深度遍历)。 题目链接:N叉树的后序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进…

leetcode刷题-最接近的三位数之和

1.题目描述 2.解题思路 其实这个题目的解题思路,和昨天写的两个题目差不多,定义两个指针,进行排序,避免多次大量循环,减少时间复杂度。在上次的基础上进行了一个比较小的改动。 3.代码 class Solution:def threeSumCl…

swagger+javax/xml/bind/DatatypeConverter+aop各种问题

文章目录 一、No operations defined in spec!1.问题图片2.解决方法 二、java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter1.问题图片2.解决方法 三、AOP切点不够精确问题1.问题描述2.解决方案 总结 一、No operations defined in spec! 这是swagger报的错&…

代码随想录算法训练营 DAY20 | 二叉树(7)

一、LeetCode 530 二叉搜索树的最小绝对值 题目链接:530.二叉搜索树的最小绝对值https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 思路一:利用搜索二叉树的中序遍历结果为有序数组的性质,将遍历结果保存到数组中&#xf…

【Google SEO】SEO指标

SEO最难的事情之一就是: 你怎么知道你正在做的事情是否真的有效? 这是一个很难回答的问题。特别是因为SEO可能需要几个月的时间才能真正发挥作用。 好吧,今天您将确切地看到要跟踪的SEO指标。如何跟踪它们。以及如何加倍努力,为…

阿里云香港轻量应用服务器是什么线路?

阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…

分库分表面试必背

一,背景 随着互联网的普及,使用人数和场景爆炸式增长,现在随便一个应用系统都可能达到数百万千万甚至更大数量级的数据。大量的数据带来了新的挑战,怎么快速完成增删改查的业务,是应用服务开发者最头痛的问题。面对这个…

Linux网络编程套接字

目录 认识端口号认识传输层协议TCP/UDP网络字节序socket编程接口实现简单的UDP网络程序实现远程执行服务器shell指令Windows套接字编写UDP实现一个简单的聊天室实现简单的TCP网络程序TCP实现一个中英互译程序守护进程原理 认识端口号 在进行网络通信的时候是不是我们两台机器…

grafana配置钉钉告警模版(一)

1、配置钉钉告警模版 创建钉钉告警模版,然后在创建钉钉告警时调用模版。 定义发送内容具体代码 my_text_alert_list 是模版名称后面再配置钉钉告警时需要调用。 {{/* 定义消息体片段 */}} {{ define "my_text_alert_list" }}{{ range . }}告警名称&…

SpringAop是什么?

简单介绍: AOP:Aspect Oriented Programming (面向切面编程、面向方面编程),其实就是面向特定方法编程。 场景: 比如现在有一个需求,我要统计每一个业务方法的耗时时长, 我们只需在业务方法的前面获取一个…

srs 边缘集群

srs官方关于边缘集群的介绍: Edge Cluster | SRS 本篇分析一下边缘集群中上行边缘节点的处理逻辑。 关于上行的边缘节点: SRS对于上行边缘,采取直接代理方式,并没有采取边缘缓存方式。所谓边缘缓存方式,即推流到边…