【机器学习】在 MLOps构建项目 ( MLOps2)

My MLOps tutorials:

  • Tutorial 1: A Beginner-Friendly Introduction to MLOps
  • 教程 2:使用 MLOps 构建机器学习项目

 

一、说明

        如果你希望将机器学习项目提升到一个新的水平,MLOps 是该过程的重要组成部分。在本文中,我们将以经典手写数字分类问题为例,提供有关如何为 MLOps 构建项目的实用教程。我们将逐步引导您完成创建可用于组织自己的项目的基本项目模板的过程。在本教程结束时,你将对 MLOps 原则以及如何将它们应用于自己的项目有深入的了解。但是,如果你不熟悉 MLOps,我们建议从我的初学者友好教程开始快速上手。因此,让我们深入了解您的 ML 项目,让您的 ML 项目更上一层楼!

二. 简介

2.1 MLOps是啥?

     MLOps(机器学习运营)是将 DevOps 实践应用到机器学习生命周期的过程。它涉及机器学习管道各个方面的自动化、监控和优化,从数据采集和准备到模型训练、部署和管理。

        MLOps 旨在简化机器学习开发流程,提高机器学习模型的准确性和可靠性,并减少开发和部署机器学习系统所需的时间和成本。它结合了软件工程、数据科学和运营的最佳实践,创建了强大且可扩展的机器学习基础设施。

        MLOps 涉及一系列工具、技术和流程,包括版本控制、持续集成和交付、容器化、编排、监控和反馈循环。对于希望在机器学习计划中实现卓越运营并通过数据驱动的洞察和自动化提供业务价值的组织来说,这是至关重要的。

2.2 本教程实验需要

        在本教程中,我们将使用手写数字分类作为示例。在之前的教程中,我创建了一个用于 MNIST 分类的 Github 存储库,项目结构如下所示:

MNIST_classification
├── dataset_scripts
│   ├── construct_dataset_csv.py
│   ├── construct_dataset_folders.py
│   ├── describe_dataset_csv.py
│   ├── explore_dataset_idx.py
│   └── README.md
├── main_classification_convnet.py
├── main_classification_onehot.py
├── main_classification_single_output.py
├── .gitignore
└── README.md 

        项目文件夹包括“dataset_scripts”文件夹,其中包含用于以原始 IDX 格式操作数据集的脚本(您可以查看我之前的教程“如何轻松探索您的 IDX 数据集”以获取更多信息)、用于训练三种不同类型的模型的 Python 脚本、一个 .gitignore 文件和一个自述文件。项目结构很简单,因为它是为教程目的而设计的。在本教程中,我将介绍 MLOps 项目的项目结构。请注意,如果您想了解有关模型和训练的编程详细信息,您可以随时参考我的教程“神经网络简介:分类问题”。

三. MLOps流程

        MLOps 工作流概述了机器学习过程中的不同步骤,其中包括业务问题、数据工程、机器学习模型工程和代码工程。在本节中,我们将探讨如何实现每个步骤。但是,由于我们正在解决的问题(手写数字分类)不需要它们,因此不会深入讨论某些步骤。我们将重点介绍以绿色突出显示的步骤(见下图)。其余步骤将在以后的教程中介绍。若要了解有关 MLOps 工作流的详细信息,可以查看我的初学者友好教程。

MLOps 工作流。

3.1. 业务问题

        本教程中解决的问题是手写数字的分类,这是一个多类分类任务。具体地,给定手写数字的输入图像范围从0到9,模型需要识别该数字并输出其相应的标签。

        AI 画布包含以下组件:任务描述、预测(模型输出)、判断、操作、结果、训练、输入、反馈和模型对问题的影响。对于当前的手写数字分类问题,我们的AI画布将按如下方式构建和填充:

用于手写数字分类的 AI 画布。

3.2. 数据工程

数据工程

        数据工程包括各种任务,例如数据引入、探索和验证、清理、标记和拆分。在此项目中,我们执行了以下数据工程任务:

  • 数据摄取:我们从其官方网站下载了原始格式的 MNIST 数据集,并将其转换为 CSV 文件。
  • 数据探索和验证:我们可视化了数据集中的一些图像并展示了一些见解。
  • 数据清洗:数据集已经干净,不需要任何进一步的清理。
  • 数据标注: 数据集已标记,因此无需额外标记。
  • 数据拆分:数据集已拆分为训练集和测试集。稍后我们将从训练集中提取验证集。

        值得注意的是,该项目涉及一个相对简单的数据工程过程,因为数据集已经准备好并处理了。但是,我们将在以后的文章中探讨更复杂的示例。

3.3. 机器学习模型工程

机器学习模型工程

        机器学习模型工程是 MLOps 工作流中的第三步。它涉及各种任务,例如模型训练、评估、测试和打包。在此项目中,我们执行了以下 ML 模型工程任务:

  • 模型训练:对于特征工程,我们使用数据缩放(将像素缩放到[0,1]的范围),数据重塑(将图像表示为一维向量或二维矩阵)和数据编码(独热编码)。对于模型工程,我们实现了两种不同类型的模型并应用了超参数调优。
  • 模型评估:除了准确性之外,我们还使用了其他评估指标,例如召回率、精度和 F1 分数,以确保模型满足 AI 画布中描述的业务目标(结果)。
  • 模型测试:评估模型后,我们在两种不同类型的数据上对其进行了测试:第一种类型是MNIST数据集的测试集,第二种类型是从应用程序生成的一些手写数字图像。
  • 模型打包和版本控制将在下一教程中讨论,我们将更详细地介绍机器学习管道。

如果你想要更多编程细节,你可以随时查看我以前的教程。

3.4. 代码工程

代码工程

        在代码工程步骤中,所选模型将部署到应用程序,并且需要监视和记录其性能。在部署模型之前,需要仔细选择服务模式和部署策略。部署后,需要管理和维护其行为,以确保其正常运行。虽然本教程中没有详细说明这部分,但我计划在不久的将来专门写整篇文章来介绍它。

四、 项目结构

        现在,我们已经重点介绍了在手写数字分类中应用的不同 MLOps 步骤,让我们继续构建项目以满足项目需求,同时牢记这些步骤。为此,我将首先介绍一个众所周知的项目结构,然后介绍我的 MLOps 项目结构模板。随着我们添加更多组件,此模板将在稍后更新。

        但是,为什么正确构建机器学习项目很重要?嗯,有几个好处:

  • 良好的透明度:一个有组织的项目更容易理解,不仅对你,对其他人也是如此。
  • 维护简单:结构良好的项目更易于维护和更新,从而节省时间和精力。
  • 提高效率:清晰的计划可以减少浪费的时间,并将偏离轨道或丢失重要信息的风险降至最低。
  • 良好的重现性和可重复使用性:良好的项目结构可确保项目结果可以轻松复制,并且其组件可以重复使用。
  • 轻松协作:当一个项目以清晰和合乎逻辑的方式组织时,其他人就会变得更容易理解和贡献。

总之,正确构建机器学习项目可以提高透明度、效率、可维护性和协作性。

4.1. 千篇一律的数据科学

        如本文前面所述,在编写任何代码行之前,我们需要做的第一件事是定义项目结构。这可以通过使用项目结构模板来实现。模板可以是为响应公司/项目需求而建立的公司模板、一组人员或个人创建并发布供其他人使用的公开可用模板,也可以是你自己习惯使用的自定义模板。

        该领域最著名的项目结构之一是千篇一律的数据科学,它是:

一个逻辑的、合理的标准化但灵活的项目结构,用于执行和共享数据科学工作。

您可以在下面找到此模板的项目结构,以及每个文件的描述:

4.2 MLOps 项目结构

        现在,我们已经介绍了如何执行 MLOps 工作流的不同步骤,接下来让我们定义一个与 MLOps 工作流一致的项目结构模板。Cookiecutter MLOps 模板基于我们之前介绍的 Cookiecutter 数据科学模板。与 Cookiecutter Data Science 一样,我的 Cookiecutter MLOps 模板包括 LICENSE、README、Makefile 和需求文件;以及文档、模型、笔记本、参考、报告、可视化和源文件夹。但是,添加了额外的文件夹(配置),并增强了源和可视化文件夹。

        MLOps 项目结构模板具有以下结构:

MLOps_MLflow_mnist_classification
├── configs
│   ├── cnnbased.yaml
│   └── singleoutput.yaml
├── data
│   ├── external
│   │   └── test
│   │       ├── 0_0.png
│   │       ├── 1_0.png
│   │       ├── 1_1.png
│   │       ├── 3_1.png
│   │       ├── 5_1.png
│   │       ├── 7_0.png
│   │       └── 8_0.png
│   ├── interim
│   ├── processed
│   │   ├── test.csv
│   │   └── train.csv
│   └── raw
│       ├── test_images.gz
│       ├── test_labels.gz
│       ├── train_images.gz
│       └── train_labels.gz
├── LICENSE
├── Makefile
├── MLproject
├── mlruns
├── models
├── README.md
├── requirements.txt
└── src├── data│   ├── build_features.py│   ├── dataloader.py│   └── ingestion.py├── models│   ├── cnnbased│   │   ├── hyperparameters_tuning.py│   │   ├── model.py│   │   ├── predict.py│   │   ├── preprocessing.py│   │   └── train.py│   └── singleoutput│       ├── hyperparameters_tuning.py│       ├── model.py│       ├── predict.py│       ├── preprocessing.py│       └── train.py└── visualization├── evaluation.py└── exploration.py

configs 文件夹包含所有配置文件,例如模型超参数。

数据文件夹(src 的子文件夹)包括以下文件:

  • ingestion.py:用于收集数据。如果需要创建备份、保护私人信息或创建元数据目录,最好在此处执行此操作。
  • cleaning.py:用于通过减少异常值/噪声、处理缺失值等来清理数据。
  • labeling.py:用于在必要时标记数据。
  • splitting.py:用于将数据拆分为测试集和训练集。
  • validation.py:用于验证数据(以确保数据已准备好进行训练)。
  • build_features.py:此文件已移至此文件夹,因为构建要素意味着将数据集组织到特定结构中。

在模型文件夹(src 的子文件夹)中,每个模型的脚本都组织在模型的文件夹中,包括:

  • model.py:用于定义模型体系结构。
  • dataloader.py:用于加载要馈送到模型的数据。
  • preprocessing.py:用于在将数据馈送到模型之前对其进行预处理。
  • train.py:用于训练模型。
  • hyperparameters_tuning.py:用于调整模型和/或训练超参数。
  • predict.py:用于对随机图像(不是来自数据集)进行预测。

可视化文件夹包括以下内容:

  • exploration.py:此文件包括用于在数据工程过程中可视化数据的函数。
  • evaluation.py:此文件包括用于可视化训练结果的函数。

这是 MLOps 模板,需要考虑一些重要注意事项:

  • 这是一个基本模板,因此可以根据项目要求删除或添加某些文件和文件夹。
  • 某些预处理函数可以在所有模型中使用,因此可以创建单个预处理文件并将其移动到数据文件夹以避免重复函数。但是,建议将预处理文件分开,以提高模型的可重用性并防止将来出现潜在问题。
  • 在预测脚本中,假定数据来自应用程序而不是数据集,因此可能需要额外的预处理步骤。

4.3 启动新的 MLOps 项目

如果要使用此模板启动机器学习项目,可以使用 GitHub 模板或使用 Cookiecutter 模板,如下所示:

  • 要使用 GitHub 模板,首先,您需要在此处访问模板页面。然后,单击绿色按钮“使用此模板”,您将必须选择是“创建新存储库”还是“在代码空间中打开”:
Github模板

  • 要使用 Cookiecutter 模板,您首先需要使用以下命令安装 Cookiecutter:
pip install cookiecutter 

或:

conda config --add channels conda-forge
conda install cookiecutter 

然后在命令行运行以下命令:

cookiecutter https://github.com/Chim-SO/cookiecutter-mlops 

下面是手写数字分类的示例配置,您可以通过填写所需参数来自定义该配置。按 Enter 键将保留您不希望更改的任何参数的默认值:

project_name [project_name]: MLOps_MLflow_mnist_classificationrepo_name [mlops_mlflow_mnist_classification]: author_name [Your name (or your organization/company/team)]: Chim SOdescription [A short description of the project.]: MNIST classificationSelect open_source_license:
1 - MIT
2 - BSD-3-Clause
3 - No license file
Choose from 1, 2, 3 [1]: 1s3_bucket [[OPTIONAL] your-bucket-for-syncing-data (do not include 's3://')]: aws_profile [default]:Select python_interpreter:
1 - python3
2 - python
Choose from 1, 2 [1]:

4.4 使用 MLOps 项目模板进行手写数字分类

在第二部分中,我们讨论了手写数字分类任务的 MLOps 工作流中涉及的不同步骤。使用 MLOps 模板实现该管道将生成以下项目结构:

MLOps_MLflow_mnist_classification
├── configs
│   ├── cnnbased.yaml
│   └── singleoutput.yaml
├── data
│   ├── external
│   │   └── test
│   │       ├── 0_0.png
│   │       ├── 1_0.png
│   │       ├── 1_1.png
│   │       ├── 3_1.png
│   │       ├── 5_1.png
│   │       ├── 7_0.png
│   │       └── 8_0.png
│   ├── interim
│   ├── processed
│   │   ├── test.csv
│   │   └── train.csv
│   └── raw
│       ├── test_images.gz
│       ├── test_labels.gz
│       ├── train_images.gz
│       └── train_labels.gz
├── LICENSE
├── Makefile
├── MLproject
├── mlruns
├── models
├── README.md
├── requirements.txt
└── src├── data│   ├── build_features.py│   ├── dataloader.py│   └── ingestion.py├── models│   ├── cnnbased│   │   ├── hyperparameters_tuning.py│   │   ├── model.py│   │   ├── predict.py│   │   ├── preprocessing.py│   │   └── train.py│   └── singleoutput│       ├── hyperparameters_tuning.py│       ├── model.py│       ├── predict.py│       ├── preprocessing.py│       └── train.py└── visualization├── evaluation.py└── exploration.py

由于我们已经描述了每个文件和文件夹的内容,因此我现在将重点介绍可能有点模棱两可的最重要步骤。

  • 该文件夹包含两个配置文件,每个模型一个。例如,该文件包括模型配置、训练参数、日志记录参数(将在后续教程中讨论)和模型调优参数。configssingleoutput.yaml
# Data parameters
data:dataset_path : 'data/processed/'# Model parameters
model:name: 'singleoutput'num_units: 224num_layers: 5activation_function : 'sigmoid'# Training parameters
training:batch_size: 128num_epochs: 200loss_function: 'mae'metric: 'mse'# Logging and output parameters
mlflow:mlruns_path: 'file:models/mlruns'experiment_name: 'singleOutput'# Tuning
hyperparameter_tuning:num_layers: [3, 5]num_units: [16, 64, 224]activation_function: ['relu', 'sigmoid']batch_size: [128, 256]loss_function: ['mae']metric: ['mse']num_epochs: [200]
  • 使用 ,首先将数据下载并存储在 中。然后,它被转换为记录结构,并直接存储到 .src/data/ingestion.pydata/raw/src/data/build_features.pydata/processed
  • 在该文件夹中,我添加了一个子文件夹,其中包含一些手写数字的随机图像。脚本将使用这些图像来测试训练模型对新的、看不见的数据的预测。data/externaltestpredict.py

  • 此示例的数据/临时文件夹为空,因为数据处理管道中没有中间步骤。
  • 由于数据是经典数据集,因此不会复制每个模型的数据加载器,而是将其从模型文件夹移动到 。src/data/
  • 该脚本概述了用于预测随机图像类的管道。与用于训练模型的预处理管道(涉及调整大小和缩放)不同,预测管道首先修剪图像、反转像素,然后调整大小和缩放图像。src/models/<model>/predict.py

随机图像的数据预处理流水线。

  • MLflow 库利用该文件和文件夹,该库是用于管理机器学习管道的平台。下一篇文章将详细介绍这个主题,所以如果你对你来说是新手,请不要担心。MLprojectmlruns

4.5 如何运行你的项目?

执行 Python 项目有几种方法:交互式运行(逐行执行)、批处理运行(调度 cron 作业或使用作业调度程序)、容器化运行(使用 Docker 或 Kubernetes)、自动化运行(例如使用 MLflow)或分布式运行(使用 Apache Spark 等分布式计算框架)。由于这不是本文的主题,因此让我们使用最简单的方法从项目目录执行以下命令:

python src/data/ingestion.py -r data/raw/ # Download data
python src/data/build_features.py -r data/raw/ -p data/processed/ # Create csv files
python -m src.models.cnnbased.train -c configs/cnnbased.yaml # Train CNN model

五、 结论

        在本文中,我们提供了一个 MLOps 项目结构模板,并将其应用于手写数字分类问题。我们演示了如何应用 MLOps 工作流来解决此问题,并绘制了一个项目结构模板,您可以将其用作 Cookiecutter 项目或 Github 模板。如果您觉得该模板有帮助,请在 GitHub 上给它加一颗星,以便其他人可以发现它。如果你不熟悉 MLOps,可以阅读我的初学者友好教程。

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

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

相关文章

【车道线】TwinLiteNet 复现过程全纪录

码字不易&#xff0c;喜欢的请点赞收藏&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 论文全文翻译&#xff1a;【freespace】TwinLiteNet: An Efficient and Lightweight Model for Driveable Area and Lane Segmentation_莫克_Cheney的博客-CSDN博客 目录…

Vue2:组件高级(下)

Vue2&#xff1a;组件高级&#xff08;下&#xff09; Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 目标&#xff1a; 自定义指令 基础概念&#xff1a; 概念&#xff1a; 内置指令&#xff1a;vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。…

机器学习基础08-回归算法矩阵分析(基于波士顿房价(Boston House Price)数据集)

回归算法通常涉及到使用矩阵来表示数据和模型参数。线性回归是最常见的回归算法之一&#xff0c;它可以用矩阵形式来表示。 考虑一个简单的线性回归模型&#xff1a; y m x b y mx b ymxb&#xff0c;其中 y y y 是因变量&#xff0c; x x x 是自变量&#xff0c; m m m 是…

nginx服务

目录 基本介绍 nginx的主要功能 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 全局配置 event模块 http模块 server模块 location模块&#xff1a; 模块的划分 基本介绍 nginx&#xff1a;高性能、…

【Docker】AUFS、BTRFS、ZFS、储存池详解

洁洁的个人主页 我就问你有没有发挥&#xff01; 知行合一&#xff0c;志存高远。 前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是…

元组是什么,python怎么使用元组

目录 引言 元组的概念 作用和优势 元组的应用 Python中如何使用元组 注意事项 总结 引言 在Python编程语言中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的数据结构&#xff0c;它允许我们以有序且不可修改的方式存储多个元素。与列表不同&#xff0c;…

FFmpeg 编码详细流程

介绍 FFmpeg的 libavcodec 模块完成音视频多媒体的编解码模块。FFmpeg 本身不具有音视频编码的功能和底层能力&#xff0c;只是对各类第三方的编码器API 进行封装调用。老版本的 FFmpeg 将avcodec_encode_video2()作为视频的解码函数 API&#xff0c;将avcodec_encode_audio2(…

【C语言】初识C语言+进阶篇导读

✨个人主页&#xff1a; Anmia.&#x1f389;所属专栏&#xff1a; C Language &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 本篇目的是面向编程新手&#xff0c;没接触过编程的人。以及C进阶的导读。 内容是C语言重要知识点的简单解释&#xff0c;不做详解。给…

web-ssrf

目录 ssrf介绍 以pikachu靶场为例 curl 访问外网链接 利用file协议查看本地文件 利用dict协议扫描内网主机开放端口 file_get_content 利用file协议查看本地文件&#xff1a; fsockopen() 防御方式: ssrf介绍 服务器端请求伪造&#xff0c;是一种由攻击者构造形成…

ClickHouse(九):Clickhouse表引擎 - Log系列表引擎

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

使用ResponseBodyAdvice做分页处理

目录 父pom文件 pom文件 配置文件 MyResponseBodyAdvice ResponseDto MyBatisConfig UsersController UsersMapper UserMapper.xml 结果 父pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

代码反向生成时序图类图-Visual_Paradigm实践

目录 前言 一、Visual_Paradigm介绍 1、主界面介绍 2、功能简介 二、基于代码的序列图生成 1、新建VP项目工程 2、序列图反向生成 三、VP类图生成 1、生成主入口 四、数据ER模型生成 1、SQL脚本 2、ER反向生成 总结 前言 不知道作为研发的小伙伴们&#xff0c;在平时的…

【Git】保姆级详解:Git配置SSH Key(密钥和公钥)到github

博主简介&#xff1a;22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a;是瑶瑶子啦每日一言&#x1f33c;: “当人们做不到一些事情的时候&#xff0c;他们会对你说你也同样不能。”——《当幸福来敲门》 克里斯加德纳 Git配置SSH Key 一、什么是Git?二、什么…

【D3S】集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S&#xff08;DDD with SpringBoot&#xff09;为本作者使用DDD过程中开发的框架&#xff0c;目前已可公开查看源码&#…

攻防世界-web-shrine

1. 题目描述 打开链接&#xff0c;发现是一串源码&#xff1a; 从源码中不难发现关键词是flask.render_template_string(safe_jinja(shrine)) &#xff0c;这个函数说明了题目的关键点在于模板渲染&#xff0c;即存在模板注入 2. 思路分析 从代码中不难发现&#xff0c;即使…

探索泛型与数据结构:解锁高效编程之道

文章目录 引言第一部分&#xff1a;了解泛型1.1 为什么使用泛型1.2 使用泛型的好处 第二部分&#xff1a;泛型的使用场景2.1 类的泛型2.2 方法的泛型2.3 接口的泛型 第三部分&#xff1a;泛型通配符3.1 通配符3.2 通配符的受限泛型 第四部分&#xff1a;数据结构和泛型的应用4.…

Spring中的循环依赖问题

文章目录 前言一、什么是循环依赖&#xff1f;二、三级缓存三、图解三级缓存总结 前言 本文章将讲解Spring循环依赖的问题 一、什么是循环依赖&#xff1f; 一个或多个对象之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成一个环形调用&#xff0c;有下面 3 种方式…

MySQL 事务

目录 一、事务的概念 二、事务的ACID特点 1&#xff09;事务的原子性 2&#xff09;事务的一致性 3&#xff09;事务的隔离性 &#xff08;1&#xff09;脏读 &#xff08;2&#xff09;不可重复读 &#xff08;3&#xff09;幻读 &#xff08;4&#xff09; 丢失更…

FFmpeg 使用总结

FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准&#xff0c;前面的“FF”代表“Fast Forward”&#xff0c;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分&#xf…

《合成孔径雷达成像算法与实现》Figure3.8

与图3.7的代码区别只在于原始信号的表达式对了一个时间偏移 代码复现如下&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间 tc …