Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

本文目录:

  • 一、WISDM数据集分析及介绍
  • 二、CNN网络结构及介绍
    • 1. CNN的核心组件
      • 1.1 卷积层(Convolutional Layer)
      • 1.2 池化层(Pooling Layer)
      • 1.3 激活函数层(Activation Layer)
      • 1.4 全连接层(Fully Connected Layer)
    • 2. CNN的层次化特征提取
    • 3. CNN的变体与扩展
      • 3.1 深度可分离卷积(Depthwise Separable Convolution)
      • 3.2 空洞卷积(Dilated Convolution)
      • 3.3 注意力机制(Attention Mechanism)
    • 4. CNN在时间序列数据中的应用
      • 4.1 1D卷积
      • 4.2 时序池化
      • 4.3 混合架构
    • 5. CNN的优化策略
      • 5.1 正则化方法
      • 5.2 学习率调整
    • 6. 典型CNN架构示例
  • 三、WISDM数据集分割及处理
  • 四、CNN网络训练WISDM数据集
    • 1.常用的仿真指标
      • 1.1 准确率 (Accuracy)
      • 1.2 精确率 (Precision)
      • 1.3 召回率 (Recall)
      • 1.4 F1分数 (F1-Score)
      • 1.5 参数量 (Parameters)
      • 1.6 推理时间 (Inference Time)
    • 2.具体的训练过程
      • 1.数据集加载
      • 2.模型实例化
      • 3.创建数据加载器
      • 4.优化器和学习率调度器设置
      • 5.混合精度训练设置
      • 6.训练循环
    • 3.结果展示
  • 五、可视化维度分析
    • 1.混淆矩阵图
    • 2.雷达图
    • 3.准确率和损失率的收敛曲线图
    • 4.仿真指标柱状图
    • 5.仿真指标折线图
  • 六、总结

卷积神经网络(CNN)因其强大的特征提取能力和深度学习架构而备受推崇,CNN在处理图像数据时展现出的卓越性能,使其成为解决各种视觉识别任务的首选工具。WISDM数据集是一个广泛用于运动估计研究的基准数据集,它包含了多个视频序列,每个序列都记录了摄像头在不同方向上移动时捕捉到的图像。在本研究中,我们将探讨如何利用 CNN来训练和优化WISDM数据集,以提高运动估计的准确性和鲁棒性。

一、WISDM数据集分析及介绍

WISDM数据集是一个用于人类活动识别(Human Activity Recognition, HAR)的公共数据集。它包含了从智能手机和智能手表收集的传感器数据,这些数据被用来识别多种不同的人类活动:

  1. 数据集来源与构成

    • WISDM数据集由福特汉姆大学计算机与信息科学系的Gary Weiss博士领导的团队创建。
    • 数据集包含了51名参与者进行的18种不同的活动,每种活动的数据都是通过佩戴在身体不同部位的智能手机和智能手表上的加速度计和陀螺仪以20Hz的频率收集得到的。
  2. 数据集特点

    • 数据集中的活动包括但不限于走路、跑步、上下楼梯、坐、站等。
    • 每个活动的数据长度为3分钟,为研究者提供了充足的时间序列数据进行分析。
  3. 数据集的应用

    • WISDM数据集适用于开发和测试各种HAR模型,尤其是基于深度学习的模型,如卷积神经网络(CNN)。

二、CNN网络结构及介绍

卷积神经网络是一种专门用来处理具有类似网格结构的数据的神经网络,如图像。CNN在图像识别、视频分析和自然语言处理等领域取得了巨大的成功。

1. CNN的核心组件

1.1 卷积层(Convolutional Layer)

  • 功能:通过卷积核(filter)在输入数据上滑动,提取局部特征。
  • 数学表示
    ( I ∗ K ) ( i , j ) = ∑ m ∑ n I ( i − m , j − n ) ⋅ K ( m , n ) (I * K)(i,j) = \sum_{m}\sum_{n} I(i-m, j-n) \cdot K(m,n) (IK)(i,j)=mnI(im,jn)K(m,n)
    其中, I I I为输入, K K K为卷积核。
  • 参数
    • 卷积核大小(kernel size):通常为3×3或5×5
    • 步幅(stride):控制滑动步长
    • 填充(padding):保持特征图尺寸

1.2 池化层(Pooling Layer)

  • 功能:对特征图进行下采样,降低计算复杂度,增强特征不变性。
  • 类型
    • 最大池化(Max Pooling):取局部区域最大值
    • 平均池化(Average Pooling):取局部区域平均值
  • 参数
    • 池化窗口大小:通常为2×2
    • 步幅:通常与窗口大小一致

1.3 激活函数层(Activation Layer)

  • 功能:引入非线性,增强模型的表达能力。
  • 常用激活函数
    • ReLU(Rectified Linear Unit): f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
    • Leaky ReLU: f ( x ) = max ⁡ ( 0.01 x , x ) f(x) = \max(0.01x, x) f(x)=max(0.01x,x)
    • Swish: f ( x ) = x ⋅ σ ( x ) f(x) = x \cdot \sigma(x) f(x)=xσ(x),其中 σ \sigma σ为sigmoid函数

1.4 全连接层(Fully Connected Layer)

  • 功能:将提取的特征映射到输出空间(如分类概率)。
  • 特点
    • 参数量较大
    • 通常位于网络末端

2. CNN的层次化特征提取

CNN通过多层卷积和池化操作,逐步提取从低级到高级的特征:

  1. 低级特征:边缘、角点、纹理等
  2. 中级特征:局部形状、简单模式
  3. 高级特征:语义信息、复杂结构

3. CNN的变体与扩展

3.1 深度可分离卷积(Depthwise Separable Convolution)

  • 结构
    • 深度卷积(Depthwise Convolution):每个输入通道单独卷积
    • 逐点卷积(Pointwise Convolution):1×1卷积融合通道信息
  • 优点
    • 显著减少参数量和计算量
    • 公式: 1 N + 1 D k 2 \frac{1}{N} + \frac{1}{D_k^2} N1+Dk21 N N N为输出通道数, D k D_k Dk为卷积核大小)

3.2 空洞卷积(Dilated Convolution)

  • 特点
    • 通过增加卷积核采样间隔,扩大感受野
    • 公式: F d i l a t e d ( i , j ) = ∑ m ∑ n I ( i + r ⋅ m , j + r ⋅ n ) ⋅ K ( m , n ) F_{dilated}(i,j) = \sum_{m}\sum_{n} I(i+r\cdot m, j+r\cdot n) \cdot K(m,n) Fdilated(i,j)=mnI(i+rm,j+rn)K(m,n)
    • 其中, r r r为空洞率

3.3 注意力机制(Attention Mechanism)

  • 作用
    • 动态调整特征权重
    • 增强重要特征的表达能力
  • 常见形式
    • 通道注意力(SENet)
    • 空间注意力(CBAM)

4. CNN在时间序列数据中的应用

4.1 1D卷积

  • 特点
    • 卷积核沿时间维度滑动
    • 适用于传感器数据、语音信号等
  • 示例
    tf.keras.layers.Conv1D(filters=64, kernel_size=3, strides=1, padding='same')
    

4.2 时序池化

  • 方法
    • 全局平均池化(Global Average Pooling)
    • 自适应最大池化(Adaptive Max Pooling)

4.3 混合架构

  • CNN-LSTM
    • CNN提取局部特征
    • LSTM捕捉时序依赖
  • CNN-Transformer
    • CNN提取空间特征
    • Transformer建模长时依赖

5. CNN的优化策略

5.1 正则化方法

  • Dropout:随机丢弃神经元,防止过拟合
  • Batch Normalization:标准化层输入,加速训练
  • 权重衰减(L2正则化):约束权重幅度

5.2 学习率调整

  • 策略
    • 学习率衰减(Learning Rate Decay)
    • 余弦退火(Cosine Annealing)
    • 预热(Warmup)

6. 典型CNN架构示例

def cnn(input_shape, num_classes):
    inputs = tf.keras.Input(shape=input_shape)
    
    # 卷积模块
    x = tf.keras.layers.Conv1D(64, 5, padding='same', activation='relu')(inputs)
    x = tf.keras.layers.MaxPooling1D(2)(x)
    x = tf.keras.layers.Conv1D(128, 3, padding='same', activation='relu')(x)
    x = tf.keras.layers.GlobalAveragePooling1D()(x)
    
    # 分类头
    x = tf.keras.layers.Dense(128, activation='relu')(x)
    outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
    
    return tf.keras.Model(inputs, outputs)

三、WISDM数据集分割及处理

WISDM数据集下载链接:https://www.cis.fordham.edu/wisdm/includes/datasets/latest/WISDM_ar_latest.tar.gz

加载、预处理和准备WISDM数据集,以便用于人类活动识别(HAR)任务:

  1. 参数设定
    • dataset_dir: 指定原始数据存放的目录。
    • WINDOW_SIZE: 定义滑窗的大小。
    • OVERLAP_RATE: 定义滑窗的重叠率。
    • SPLIT_RATE: 定义训练集和验证集的分割比例。
    • VALIDATION_SUBJECTS: 定义留一法验证时使用的特定主题(subject)集合。
    • Z_SCORE: 决定是否进行标准化处理。
    • SAVE_PATH: 定义预处理后数据保存的路径。
def WISDM(dataset_dir='./WISDM_ar_v1.1', WINDOW_SIZE=200, OVERLAP_RATE=0.5, SPLIT_RATE=(8, 2), VALIDATION_SUBJECTS={}, Z_SCORE=True, SAVE_PATH=os.path.abspath('D:/PycharmProjects/xyp-task')):
  1. 数据集下载
  • 使用download_dataset函数,从福特汉姆大学提供的URL下载WISDM数据集,并将其存储在dataset_dir指定的目录中。
download_dataset(
    dataset_name='WISDM',
    file_url='https://www.cis.fordham.edu/wisdm/includes/datasets/latest/WISDM_ar_latest.tar.gz', 
    dataset_dir=dataset_dir
)
  1. 数据清洗与读取
  • 从指定路径的文本文件中读取原始数据,该文件包含了多个以逗号分隔的条目。
  • 清洗数据,移除不完整的条目,确保每行数据都包含参与者ID、活动标签和三个传感器信号。
  • 将清洗后的数据转换为NumPy数组,便于后续处理。
  1. 标签编码
  • 使用category_dict字典,将活动标签的字符串表示(如’Walking’、'Jogging’等)映射为整数ID,以便于机器学习模型处理。
  1. 滑窗处理
  • 对清洗并编码后的数据应用滑窗分割,生成固定大小的样本窗口。这些窗口将用于训练和测试机器学习模型。
  1. 分割数据集
  • 根据是否提供了VALIDATION_SUBJECTS,选择留一法或平均法来分割数据集。留一法是为每个参与者ID分别创建训练集和测试集,而平均法则是按照SPLIT_RATE比例分割数据。
  1. 数据整合
  • 将分割后的数据和标签分别整合到xtrainxtestytrainytest列表中,这些列表将包含所有训练和测试数据。
  1. 标准化处理
  • 如果Z_SCORE参数为True,则对整合后的xtrainxtest进行Z分数标准化处理,以消除不同传感器信号量级的影响。
  1. 数据保存
  • 如果提供了SAVE_PATH,则使用save_npy_data函数将预处理后的训练集和测试集数据保存为.npy格式的文件,这有助于后续加载和使用数据。

准备WISDM数据集,使其适合用于CNN网络模型的训练和测试。通过滑窗处理,可以将原始的长时间序列传感器数据转换为固定大小的短时间序列数据,这有助于训练卷积神经网络等模型进行人类活动识别。此外,通过留一法或平均法分割数据集,可以为模型提供训练集和验证集,以评估模型性能。最后,通过Z分数标准化,可以提高模型对数据分布变化的鲁棒性。

四、CNN网络训练WISDM数据集

1.常用的仿真指标

1.1 准确率 (Accuracy)

准确率是所有正确预测样本数占总样本数的比例。它是最直观的性能指标,计算公式如下:

image.png

1.2 精确率 (Precision)

精确率是所有预测为正类中真正为正类的比例,它关注的是预测为正类的结果的准确性。计算公式如下:

image.png

1.3 召回率 (Recall)

召回率是所有实际为正类中被正确预测为正类的比例,它衡量的是模型捕捉正类样本的能力。计算公式如下:

image.png

1.4 F1分数 (F1-Score)

F1分数是精确率和召回率的调和平均值,它在两者之间取得平衡,是评价分类模型性能的一个重要指标。计算公式如下:

image.png

1.5 参数量 (Parameters)

参数量指的是网络模型中需要训练的参数总数。参数量越多,模型的容量越大,但也越容易过拟合。

1.6 推理时间 (Inference Time)

推理时间指的是模型对数据进行预测的时间。它可以是单个样本的推理时间,也可以是整个数据集推理所需的总时间。推理时间是评估模型在实际应用中效率的重要指标,尤其是在需要实时响应的应用场景中。

2.具体的训练过程

image.png

1.数据集加载

根据选择的数据集和模型,加载数据集,并进行必要的预处理。

2.模型实例化

根据选择的模型,实例化一个模型对象,并将其移动到选定的设备上。

3.创建数据加载器

使用DataLoader创建训练和测试数据的加载器,允许在训练中以小批量方式加载数据。

4.优化器和学习率调度器设置

定义了AdamW优化器和学习率调度器,用于在训练过程中更新模型参数和调整学习率。

5.混合精度训练设置

实例化GradScaler对象,用于在训练中使用混合精度,可以提高训练效率和精度。

6.训练循环

对于每个训练轮次,执行以下步骤:

  • 设置模型为训练模式。
  • 在每个小批量数据上执行前向传播、计算损失、执行反向传播并更新模型参数。
  • 学习率调度器步进。
  • 设置模型为评估模式。
  • 在测试集上进行预测,并计算模型的准确率、精确率、召回率和F1分数。
  • 打印每个轮次的训练损失、测试准确率和其他评估指标。
for i in range(EP):
    net.train()
    inference_start_time = time.time()
    for data, label in train_loader:
        data, label = data.to(device), label.to(device)
        # 前向过程(model + loss)开启 autocast,混合精度训练
        with autocast():
            out = net(data)
            loss = loss_fn(out, label)

        optimizer.zero_grad()  # 梯度清零
        scaler.scale(loss).backward()  # 梯度放大
        scaler.step(optimizer)  # unscale梯度值
        scaler.update()
    lr_sch.step()

3.结果展示

在每个训练轮次结束时,打印出当前轮次的训练信息和模型评估指标。

image.png
从训练结果中可以看出,基于CNN网络训练得到的以上六种指标数据分别为:

CNN0.97290.97340.97290.97325283900.0008 0.7563

五、可视化维度分析

将CNN网络训练WISDM数据集的结果进行可视化维度分析:

image.png

1.混淆矩阵图

混淆矩阵是一个N×N的矩阵,N代表的是你的分类标签个数。混淆矩阵的横纵坐标轴分别为模型预测值和真实值,在图中纵轴是真实值而横轴代表模型预测值。

image.png

2.雷达图

雷达图可以反映多个行为的某个指标值映射在坐标轴上,可以更直观的观察出每个行为的指标值大小。

image.png

3.准确率和损失率的收敛曲线图

准确率和损失率的收敛曲线图横坐标是训练轮次,纵坐标是模型的准确率以及损失率,这个图可以直观的看出你的模型在训练以及测试过程中的准确率和损失率走向和模型收敛以后的准确率的数值范围,也可以反映出你的模型在训练过程中是否稳定。

image.png

4.仿真指标柱状图

仿真指标柱状图是一种以长方形的长度为变量来表示各个行为的指标值,例如可以表示你的模型在WISDM数据集中的每个行为精确率的值,通过由一系列高度不等的纵向条纹表示数据分布的情况。

image.png

5.仿真指标折线图

仿真指标折线图是一种用来表示超参数设置大小对模型效果影响的可视化方式,可以表示我们的CNN网络模型在WISDM数据集中Batch size对加权F1分数的影响。

image.png

六、总结

在本研究中,我们深入探讨了卷积神经网络(CNN)在处理WISDM数据集时的应用,该数据集是一个用于人类活动识别(HAR)的公共数据集。通过一系列数据处理步骤,我们将原始的长时间序列传感器数据转换为适合CNN模型训练的固定大小的短时间序列数据。此外,我们还介绍了CNN的核心思想、优点、缺点以及基本的网络结构,并通过可视化方法对训练结果进行了全面的分析。
通过本研究,我们证明了CNN在处理时间序列数据和人类活动识别任务中的有效性。未来的工作可以探索更先进的网络结构和训练策略,以进一步提高模型的性能和应用范围。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果

WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…

实践网络安全:常见威胁与应对策略详解

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在数字化转型的浪潮中,网络安全的重要性已达到前所未有的高度。无论是个人用户、企业,还是政府机构…

web-SQL注入-CTFHub

前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时,选择合适的传感器(如热电偶或热电阻)和采集硬件是关键。下面是一些建议,帮助实现高效的温度数据采集: 1. 传感器选择: 热电偶(Thermocouple)&am…

Deep Sleep 96小时:一场没有硝烟的科技保卫战

2025年1月28日凌晨3点,当大多数人还沉浸在梦乡时,一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击,警报声响彻机房,一场针对中国关键信息基础设施的网络攻击来势汹汹! 面对美国发起的这场…

Golang Gin系列-9:Gin 集成Swagger生成文档

文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…

三、递推关系与母函数,《组合数学(第4版)》卢开澄 卢华明

文章目录 一、似函数、非函数1.1 母函数1.2 母函数的简单应用1.3 整数拆分1.4 Ferrers 图像1.5 母函数能做什么1.6 递推关系1.6.1 Hanoi 问题1.6.2 偶数个5怎么算 1.7 Fibonacci 序列1.7.1 Fibonacci 的奇妙性质1.7.2 Fibonacci 恒等式1.7.3 Fibonacci 的直接表达式1.7.4 Fibon…

97,【5】buuctf web [极客大挑战 2020]Greatphp

进入靶场 审代码 <?php // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全隐患 error_reporting(0);// 定义一个名为 SYCLOVER 的类 class SYCLOVER {// 定义类的公共属性 $sycpublic $syc;// 定义类的公共属性 $loverpublic $lover;// 定义魔术方法 __wa…

手机上运行AI大模型(Deepseek等)

最近deepseek的大火&#xff0c;让大家掀起新一波的本地部署运行大模型的热潮&#xff0c;特别是deepseek有蒸馏的小参数量版本&#xff0c;电脑上就相当方便了&#xff0c;直接ollamaopen-webui这种类似的组合就可以轻松地实现&#xff0c;只要硬件&#xff0c;如显存&#xf…

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…

数据库和数据表的创建、修改、与删除

1.标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量名限制为29个 必须只能包含A-Z,a-z,0-9,_共63个字符 数据库名、表名、字段名等对象名中间不能包含空格 同一个MySQL软件中&#xff0c;数据库不能同名&#xff1b;同一个库中&#xff0c;表不能重名&#…

(电脑版)植物大战僵尸幼儿园版本,开启你的冒险之旅!

欢迎来到植物大战僵尸中文版&#xff0c;园长Jen已准备好迎接你的挑战&#xff01;在这个充满乐趣和策略的游戏中&#xff0c;你将体验到多种游戏模式&#xff0c;每种模式都带来不同的挑战和乐趣。 游戏模式&#xff1a; 冒险模式&#xff1a;踏上刺激的冒险旅程&#xff0c;…

SpringBoot中关于knife4j 中的一些相关注解

1、效果图 对比可以明显的看到加了注解与没有加注解所表现出来的效果不同&#xff08;加了注解的更加明了清晰&#xff09; 2、实现效果 Tag注解‌用于为测试方法或测试类添加标签&#xff0c;以便在执行测试时根据标签进行过滤。使用Tag注解可以更灵活地控制测试的执行&#…

双目标定与生成深度图

基于C#联合Halcon实现双目标定整体效果 一&#xff0c;标定 1&#xff0c;标定前准备工作 &#xff08;获取描述文件与获取相机参数&#xff09; 针对标准标定板可以直接调用官方提供描述文件&#xff0c;也可以自己生成描述文件后用PS文件打印 2&#xff0c;相机标定 &…

操作系统1.4

一、操作系统内核 二、微内核与大内核 三、补充

Leetcode—598. 区间加法 II【简单】

2025每日刷题&#xff08;206&#xff09; Leetcode—598. 区间加法 II 实现代码 class Solution { public:int maxCount(int m, int n, vector<vector<int>>& ops) {int ans m * n;int x ops.size();if(ops.empty()) {return ans;}int xm ops[0][0], ym …

【机器学习篇】K-Means 算法详解:从理论到实践的全面解析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

GWO优化LSBooST回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是模仿灰狼社会的结构与行为…

图形学笔记 - 5-光线追踪 - 辐射度量学

文章目录 辐射度量学辐射能和通量&#xff08;功率&#xff09;Radiant Energy and Flux (Power)辐射强度 Radiant Intensity辐照度Irradiance朗伯余弦定律Lambert’s Cosine Law Radiance辐亮度Incident Radiance入射辐亮度Exiting Radiance出射辐亮度 双向反射分布函数 Bidir…

低代码产品表单渲染架构

在React和Vue没有流行起来的时候&#xff0c;低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子&#xff1a; 产品层 用户通过打开表单&#xff0c;使用不同业务场景业务下的表单页面&#xff0c;中间的Render层就是技术实现。 每一个不同业务的表单…