当前位置: 首页 > news >正文

第J3周:DenseNet121算法实现01(Pytorch版)

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

目标

具体实现

(一)环境

语言环境:Python 3.10
编 译 器: PyCharm
框 架: Pytorch

(二)具体步骤
1. DenseNet121.py
import torch  
import torch.nn as nn  
import torch.nn.functional as F  
import math  # 实现DenseLayer(密集连接层)  
class DenseLayer(nn.Module):  def __init__(self, num_input_features, growth_rate, bn_size, drop_rate):  super(DenseLayer, self).__init__()  # BN -> ReLU -> Conv(1x1) -> BN -> ReLU -> Conv(3x3)  self.norm1 = nn.BatchNorm2d(num_input_features)  # 第一个批归一化层  self.relu1 = nn.ReLU(inplace=True)  # 第一个ReLU激活函数  self.conv1 = nn.Conv2d(num_input_features, bn_size * growth_rate,  kernel_size=1, stride=1, bias=False)  # 1x1卷积层  self.norm2 = nn.BatchNorm2d(bn_size * growth_rate)  # 第二个批归一化层  self.relu2 = nn.ReLU(inplace=True)  # 第二个ReLU激活函数  self.conv2 = nn.Conv2d(bn_size * growth_rate, growth_rate,  kernel_size=3, stride=1, padding=1, bias=False)  # 3x3卷积层  self.drop_rate = drop_rate  # Dropout率  def forward(self, x):  # 保存输入特征,用于后续的密集连接  new_features = self.norm1(x)  new_features = self.relu1(new_features)  new_features = self.conv1(new_features)  new_features = self.norm2(new_features)  new_features = self.relu2(new_features)  new_features = self.conv2(new_features)  # 如果设置了dropout,则应用dropout  if self.drop_rate > 0:  new_features = F.dropout(new_features, p=self.drop_rate, training=self.training)  # 将新特征与输入特征进行拼接,实现密集连接  return torch.cat([x, new_features], 1)  # 实现DenseBlock(密集块)  
class DenseBlock(nn.Module):  def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate):  super(DenseBlock, self).__init__()  # 创建指定数量的DenseLayer,每一层的输入特征数量都会增加  self.layers = nn.ModuleList()  for i in range(num_layers):  layer = DenseLayer(  num_input_features + i * growth_rate,  growth_rate=growth_rate,  bn_size=bn_size,  drop_rate=drop_rate  )  self.layers.append(layer)  def forward(self, x):  # 依次通过所有的DenseLayer  features = x  for layer in self.layers:  features = layer(features)  return features  # 实现TransitionLayer(过渡层)  
class TransitionLayer(nn.Module):  def __init__(self, num_input_features, num_output_features):  super(TransitionLayer, self).__init__()  # BN -> Conv(1x1) -> AvgPool(2x2)  self.norm = nn.BatchNorm2d(num_input_features)  # 批归一化层  self.relu = nn.ReLU(inplace=True)  # ReLU激活函数  self.conv = nn.Conv2d(num_input_features, num_output_features,  kernel_size=1, stride=1, bias=False)  # 1x1卷积层  self.pool = nn.AvgPool2d(kernel_size=2, stride=2)  # 平均池化层  def forward(self, x):  x = self.norm(x)  x = self.relu(x)  x = self.conv(x)  x = self.pool(x)  return x  # 实现完整的DenseNet121模型  
class DenseNet121(nn.Module):  def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16),  num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000):  super(DenseNet121, self).__init__()  # 首先是一个7x7的卷积层,步长为2  self.features = nn.Sequential()  self.features.add_module('conv0',  nn.Conv2d(3, num_init_features, kernel_size=7, stride=2, padding=3, bias=False))  # 初始卷积层  self.features.add_module('norm0', nn.BatchNorm2d(num_init_features))  # 批归一化层  self.features.add_module('relu0', nn.ReLU(inplace=True))  # ReLU激活函数  self.features.add_module('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1))  # 最大池化层  # 依次添加DenseBlock和TransitionLayer  num_features = num_init_features  for i, num_layers in enumerate(block_config):  # 添加DenseBlock  block = DenseBlock(  num_layers=num_layers,  num_input_features=num_features,  bn_size=bn_size,  growth_rate=growth_rate,  drop_rate=drop_rate  )  self.features.add_module(f'denseblock{i + 1}', block)  num_features = num_features + num_layers * growth_rate  # 如果不是最后一个block,则添加TransitionLayer  if i != len(block_config) - 1:  # 过渡层将特征图数量减半  trans = TransitionLayer(  num_input_features=num_features,  num_output_features=num_features // 2  )  self.features.add_module(f'transition{i + 1}', trans)  num_features = num_features // 2  # 最后添加一个BatchNorm  self.features.add_module('norm5', nn.BatchNorm2d(num_features))  # 最终的批归一化层  # 全局平均池化和分类器  self.classifier = nn.Linear(num_features, num_classes)  # 全连接分类器  # 初始化权重  for m in self.modules():  if isinstance(m, nn.Conv2d):  nn.init.kaiming_normal_(m.weight)  # 使用Kaiming初始化卷积层权重  elif isinstance(m, nn.BatchNorm2d):  nn.init.constant_(m.weight, 1)  # 初始化批归一化层的权重为1  nn.init.constant_(m.bias, 0)  # 初始化批归一化层的偏置为0  elif isinstance(m, nn.Linear):  nn.init.constant_(m.bias, 0)  # 初始化全连接层的偏置为0  def forward(self, x):  features = self.features(x)  # 提取特征  out = F.relu(features, inplace=True)  # 应用ReLU激活函数  out = F.adaptive_avg_pool2d(out, (1, 1))  # 全局平均池化  out = torch.flatten(out, 1)  # 展平特征  out = self.classifier(out)  # 分类  return out  # 创建DenseNet121模型实例  
def create_densenet121(num_classes=1000, pretrained=False):  model = DenseNet121(num_classes=num_classes)  return model  # 使用示例  
if __name__ == "__main__":  # 创建模型  model = create_densenet121()  print(model)  # 创建随机输入张量 (batch_size, channels, height, width)    x = torch.randn(1, 3, 224, 224)  # 前向传播  output = model(x)  print(f"Input shape: {x.shape}")  print(f"Output shape: {output.shape}")

image.png

相关文章:

第J3周:DenseNet121算法实现01(Pytorch版)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch (二)具体步骤…...

在Ubuntu20.04上交叉编译能在Windows上运行的Qt5应用

参考链接: https://blog.csdn.net/Interview_TC/article/details/146050419 https://bugreports.qt.io/browse/QTBUG-82592 重要设置 sudo update-alternatives --config x86_64-w64-mingw32-g 选择后缀带posix的,(/usr/bin/x86_64-w64-min…...

C语言中,memmove和memcpy的区别?

文章目录 1. 内存重叠处理memcpy:memmove: 2. 性能差异总结 在C语言中,memmove和memcpy均用于内存块的复制,但关键区别在于对内存重叠的处理: 1. 内存重叠处理 memcpy: 假设源(src&#xff0…...

小程序API —— 54 路由与通信 - 编程式导航

在小程序中实现页面的跳转,有两种方式: 声明式导航:navigator 组件编程式导航:使用小程序提供的 API 编程式导航 API 提供了五个常用的 API 方法: wx.navigateTo():保留当前页面,跳转到应用内…...

2025 使用docker部署centos7容器并且需要centos7容器能通过ssh登录SSH 登录的CentOS7容器

以下是使用 Docker 部署可 SSH 登录的 CentOS7 容器的步骤: 1.创建 Dockerfile(保存为 Dockerfile.centos7): vim Dockerfile.centos7 #复制如下内容 FROM centos:7# 备份原有的 yum 源配置文件 RUN mv /etc/yum.repos.d/CentO…...

docker安装向量数据库Milvus及可视化工具 Attu

前置条件 1.安装了docker 2.服务器网络正常,可以连接到容器下载地址 3.服务器磁盘空间正常,docker磁盘占用过大,请参考docker容量占用过大解决办法 一、下载yml文件 可在文章资源下载或者自行下载:下载yml 下载这个单机版本的…...

从模拟到现实:Sensodrive高精度力反馈技术赋能物流运输的高效与安全

在现代物流行业中,司机短缺、二氧化碳排放增加和利润空间紧张等问题日益凸显。为应对这些挑战,Sensodrive的SensoWheel和SensoPedals产品在自驾卡车中的应用,提供了更为高效的运输解决方案,有效缓解了这些问题。 Fernride公司利用…...

无需qt-creator,使用Trae从0到1生成qt的开发、构建、调试环境

一、安装 Qt 开发环境 确保已经安装了 Qt,没有安装的可以自己在网上搜索怎么安装,安装时可选择不安装qt creator,但是qt开发库和编译器要安装,这里我选择的编译器是MinGW, 安装好以后,记录下qt开发库和Min…...

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法,感觉可以做一个小程序作为产出。 但小程序做得比较少,因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板(Template) 优势 简单灵活:模板定义和使用都较…...

VMware主机换到高配电脑,高版本系统的问题

原来主机是i3 ,windows7系统,vmware 14.0,虚机系统是ubuntu 14.04。目标新机是i7 14700KF,windows11系统。原以为安装虚拟机,将磁盘文件,虚拟机配置文件拷贝过去可以直接用。 新目标主机先安装了vmware 15,运行原理虚机&#xff0…...

“锈化”Python:用Rust重塑Python生态的六大工具深度解析

前言:为何“锈化”Python? Python以其简洁的语法和强大的生态系统成为数据科学、Web开发和自动化领域的首选语言。然而,随着项目规模和性能需求的增长,Python的一些传统工具在速度、内存效率和安全性上面临瓶颈。近年来&#xff…...

6.3考研408数据结构中BFS与DFS的易错点及难点解析

一、广度优先算法(BFS)易错点 队列操作失误 未正确处理节点入队顺序(如未按层序逐层扩展),导致结果混乱。在出队后未立即标记节点为已访问,可能引发重复访问(尤其在存在环的图中)。示…...

在Ubuntu上安装MEAN Stack的4个步骤

在Ubuntu上安装MEAN Stack的4个步骤为:1.安装MEAN;2.安装MongoDB;3.安装NodeJS,Git和NPM;4.安装剩余的依赖项。 什么是MEAN Stack? 平均堆栈一直在很大程度上升高为基于稳健的基于JavaScript的开发堆栈。…...

如何通过Odoo 18创建与配置服务器操作

如何通过Odoo 18创建与配置服务器操作 服务器操作是Odoo实现业务流程自动化的核心工具,允许你在服务器端执行自动化任务,通常由按钮点击或自动化工作流等事件触发。这些操作使用 Python 编写,能够执行复杂的业务逻辑,从而增强 Od…...

【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注

参考文章: 「GIS教程」使用DeepSeek辅助QGIS快速制图 | 麻辣GIS 示例代码说明:使用参考文章中的省会城市坐标点,左侧增加一列城市序号code, 图层标注显示 code 城市名称,同时在指定路径下生成对应SHP格式点数据。 import os fr…...

torcharrow gflags版本问题

问题描述 其实仍然是很简单的编译问题,但是又弄了一整个下午加几乎整个晚上,进度缓慢,又吸取了教训,因而还是来记录一下。 在试图使用torcharrow进行推荐系统模拟的时候,撰写的python程序报错:ERROR: flag…...

Spring IoC DI入门

一、Spring,Spring Boot和Spring MVC的联系及区别 Spring是另外两个框架的基础,是Java生态系统的核心框架,而SpringMVC是Spring 的子模块,专注于 Web 层开发,基于 MVC 设计模式(模型-视图-控制器&#xff…...

Vala编程语言教程-语言元素

语言元素 方法 在Vala中,函数无论是否定义在类内部均称为方法。下文将统一使用“方法”这一术语。 int method_name(int arg1, Object arg2) {return 1; } 此代码定义了一个名为 method_name 的方法,接受两个参数(一个整数值,一…...

数据可信安全流通实战,隐语开源社区Meetup武汉站开放报名

隐语开源社区 Meetup 系列再出发!2025 年将以武汉为始发站,聚焦"技术赋能场景驱动",希望将先进技术深度融入数据要素流转的各个环节,推动其在实际应用场景中落地生根,助力释放数据要素的最大潜能&#xff01…...

windows 10 系统配置Node

目录 什么是Node.js 什么是Npm Node.js环境搭建 下载 解压 配置环境变量 npm配置 如何运行下载的Node.js项目 什么是Node.js 在 Node.js 之前,JavaScript 只能运行在浏览器中,作为网页脚本使用,为网页添加一些特效,或者和…...

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具,但许多用户在使用过程中会遇到各种限制和不便。因此,可能需要探索替代解决方案。本文介绍了10款强大的替代工具,它们能够有效替代Postman,成为你API测试工具箱的一部分。 什么是Postman&…...

城市街拍人像自拍电影风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 城市街拍人像自拍的电影风格 Lr 调色,是利用 Adobe Lightroom 软件,对在城市街景中拍摄的人像自拍照片进行后期处理,使其呈现出电影画面般独特的视觉质感与艺术氛围。通过一系列调色操作,改变照片的色彩、明暗、对比等元…...

HTML图像标签的详细介绍

1. 常用图像格式 格式特点适用场景JPEG有损压缩,文件小,不支持透明适合照片、复杂图像PNG无损压缩,支持透明(Alpha通道)适合图标、需要透明背景的图片GIF支持动画,最多256色简单动画、低色彩图标WebP谷歌开…...

C++进阶——红黑树的实现

目录 1、红黑树的概念 1.1 红黑树的定义 1.2 红黑树的规则 1.3 为什么没有一条路径会比其他路径长出两倍 1.4 红黑树的性能 2、红黑树的实现 2.1 红黑树的结构 2.2 红黑树的插入 2.2.1 红黑树插入一个值的大概过程 2.2.2 情况1:变色 2.2.3 情况2&#xff…...

Linux 文件操作-标准IO函数1-文件指针、文件缓冲区(行缓冲、全缓冲、无缓冲)的验证

目录 1.文件指针 2.文件缓冲区 2.1 行缓冲 2.2. 全缓冲 2.3. 无缓冲 3. 程序验证: (1)main.c执行test1(),打印hello world,不加 \n 换行符 (2)刷新缓冲区方法1:使用\n (3&am…...

中国历史文化名城分布矢量数据

中国,这片古老而厚重的土地,承载着上下五千年的文明,从北国的冰天雪地到南疆的热带雨林,从东海之滨的波涛汹涌到西域大漠的风沙漫天,无数的历史文化名城如繁星般散布其间。 它们是岁月长河中沉淀下来的瑰宝&#xff0…...

蓝桥杯十天冲刺-day1(日期问题)

日期问题 基础循环遍历模板 对于蓝桥杯所有的日期问题遍历&#xff0c;都可以使用的上 for(year2000;year<2022;year) for(month1;month<12;month) for(day1;day<31;day) {if(month1||month3||month5||month7||month8||month10||month12);else if(month2){if((year…...

漏洞知识点《Tornado框架中RequestHandler的对象》

Tornado框架中RequestHandler的所有对象 [SUPPORTED_METHODS, _INVALID_HEADER_CHAR_RE, __class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __init_subclass__, __le__, __lt__, __module__,…...

动态规划(6.不同路径II)

题目链接&#xff1a;63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 本题为不同路径的变型&#xff0c;只不过有些地方有「障碍物」&#xff0c;只要在「状态转移」上稍加修改就可解决。 状态表示&#xff1a; 对于这种Γ路径类」的问题&#xf…...

【算法学习】最小公倍数问题

前言&#xff1a; 求最小公倍数的两种算法&#xff1a; 求两个正整数的最小公倍数&#xff0c;比如3和5的最小公倍数是15&#xff0c;6和8的最小公倍数是24。 本片讨论如何求两个数的最小公倍数&#xff0c;第一种方法是通过最大公约数来求&#xff0c;第二种方法是累加法。 由…...

Spring Boot 整合 Apache Flink 教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 Apache Flink 教程 一、背景与目标 Apache Flink 是一个高性能的分布式流处理框架&#xff0c;而Spring Boot提供了快速构建企业级应用的…...

进制转换(R转十)(1290. 二进制转换十进制、1292. 十六进制转十进制、1291. 八进制转十进制、1405. 小丽找潜在的素数)

题单地址&#xff1a;题单中心-东方博宜OJ 这里以二进制转十进制为例&#xff08;按位加权求和法&#xff09; 1290. 二进制转换十进制 问题描述 请将一个 25 位以内的 2 进制正整数转换为 1010 进制&#xff01; 输入 一个 25 位以内的二进制正整数。 输出 该数对应的…...

通过启用Ranger插件的Hive审计日志同步到Doris做分析

以下是基于Apache Doris的Ranger Hive审计日志同步方案详细步骤&#xff0c;结合审计日志插件与数据导入策略实现&#xff1a; 一、Doris环境准备 1. 创建审计日志库表 参考搜索结果的表结构设计&#xff0c;根据Ranger日志字段调整建表语句&#xff1a; CREATE DATABASE IF…...

Node.js框架Express、Koa、Koa2、Egg 和 NestJS 的对比分析

以下是 Express、Koa、Koa2、Egg 和 NestJS 的对比分析&#xff0c;从多个维度梳理它们的区别和适用场景&#xff1a; 1. 历史背景与定位 框架背景与定位ExpressNode.js 早期框架&#xff0c;灵活轻量&#xff0c;生态丰富&#xff0c;适合快速开发简单应用。KoaExpress 原班团…...

蓝桥杯--冲刺题单--随时更新

冲刺题单 感谢up主溶金落梧桐&#xff08;uid:40733116&#xff09;&#xff0c;我是看了他的视频后总结的。 简单模拟&#xff08;循环数组日期进制&#xff09; 1.蓝桥19723–分布式队列 package datasimulation;import java.util.Scanner;public class Test3 {//计算数组…...

新一代电子数据取证专家 | 苏州龙信信息科技有限公司

本文关键词&#xff1a;电子取证、手机取证、计算机取证、云取证 关于我们About us 苏州龙信信息科技有限公司专注于电子数据取证、大数据、信息安全等领域&#xff0c;核心业务主要涵盖取证工具研发、大数据融合分析、案件技术支持、取证能力培训等&#xff0c;先后为执法部门…...

SSRF 攻击与防御:从原理到落地实践

1. 什么是 SSRF&#xff1f; SSRF&#xff08;Server-Side Request Forgery&#xff09; 是一种常见的Web安全漏洞。当服务器提供了某种对外请求的功能&#xff0c;如“URL 参数直接转发请求”&#xff0c;攻击者就可以通过精心构造的URL&#xff0c;让服务器“自己”去访问特…...

socks 协议介绍

SOCKS协议详解 一、基本定义与核心功能 SOCKS&#xff08;Socket Secure&#xff09;是一种网络传输协议&#xff0c;主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议&#xff08;如TCP…...

不使用负压电源,ADC如何测量正负压?

电路图来自ZLinear的开源数据采集板卡DL8884_RFN&#xff0c;是一个比较常见的电压偏置采集法 对电路进行分析&#xff0c;所以说可以先看下采集卡的模拟输入部分的参数如下&#xff1a; 通道数量: 8通道单端输入/4通道差分输入 分辨率: 16位逐次逼近型(SAR) ADC 采样速率: 40…...

服务的拆分数据的迁移

参考&#xff1a; 数据迁移调研...

强推 Maven多镜像源快速切换工具,GUI操作超便捷

引言 在开发过程中&#xff0c;配置Maven的settings.xml文件以优化依赖下载速度是一个常见的需求。然而&#xff0c;手动编辑XML文件不仅繁琐&#xff0c;还容易出错。本文将介绍如何使用Python和Tkinter构建一个图形界面工具&#xff0c;帮助开发者快速、安全地切换Maven镜像…...

Qt6.8实现麦克风音频输入音频采集保存wav文件

一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件,使用QAudioInput来录音,并使用QFile来保存数据到WAV文件。 开发环境:QT6.8 本文用极简代码实现,核心代码只需不到100行。 二.代码实现...

自动驾驶AEB误触发率评估的必要测试里程估计

文章目录 一 问题背景与行业挑战二 数学建模框架2.1 基础假设2.2 贝叶斯推断流程先验分布选择: 使用 Γ \Gamma Γ分布作为 λ \lambda λ的共轭先验参数 α 0 \alpha_0 α0​和 β 0 \beta_0 β0​的工程物理意义可靠性判断条件 三 数值求解方法1. 无信息先验场景 ( α 0 1 ,…...

python3 -m http.sever 8080加载不了解决办法

解决方法很多,本文设置各种处理方法,逻辑上需要根据你的自身情况选择 我会告诉你遇到这种问题怎么做,根据具体症状处理 如需转载,标记出处 背景: 1。如图 2.。域名访问不了 http://www.meiduo.site:8080/register.html 上面的域名访问不了,下面的倒是正常 http://127…...

BYU-YOLO数据格式准备

BYU - Locating Bacterial Flagellar Motors 2025(在3D断层扫描图像中定位细菌鞭毛马达) 一、数据介绍 1.竞赛介绍 在本次竞赛中,您的任务是在3D断层扫描图像中找到鞭毛马达的中心位置。断层扫描图像是物体的三维体积表示。每个断层扫描图像作为一个独立的目录提供,其中…...

java NIO中的FileSystems工具类可以读取本地文件系统,ZIP/JAR等,无需解压处理,还可以复制文件

在Java NIO&#xff08;java.nio.file包&#xff09;中&#xff0c;FileSystems 是一个工具类&#xff0c;用于操作和管理文件系统。它提供了静态方法来获取或创建文件系统实例&#xff0c;并支持自定义文件系统实现。以下是其核心功能和用法&#xff1a; 1. 核心功能 (1) 获取…...

群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)

摘要 模拟退火&#xff08;SA&#xff09;算法是一种基于物理退火过程的全局优化算法&#xff0c;其核心思想来源于热力学中的退火过程&#xff1a;将材料加热到高温后再缓慢冷却&#xff0c;使其分子结构趋于最低能量状态&#xff0c;从而获得稳定结构。SA 算法利用 Metropol…...

knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)

1.前言 微前端&#xff0c;将一个大的前端应用拆分为多个小型的&#xff0c;独立开发的前端应用&#xff0c;每一个小型的应用都可以单独的开发&#xff0c;部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分&#xff0c;提高开发的效率与灵活性。 2.实…...

目标检测中归一化的目的?

在目标检测任务中,归一化坐标和尺寸时需要除以图像的宽度和高度,主要有以下几个原因: 1. 统一尺度 不同图像可能具有不同的宽度和高度。通过将坐标和尺寸除以图像的宽度和高度,可以将所有图像的标注信息统一到相同的尺度范围([0, 1])。这使得模型在训练和推理时能够处理…...

HarmonyOs- UIAbility应用上下文

上下文为何物 上下文在计算机科学领域是一个广泛存在的概念。是现代操作系统核心抽象概念之一。其本质是环境信息的结构化封装。 有过开发经验的都知道&#xff0c;当我们在一个系统上进行开发的时候&#xff0c;无论是Android&#xff0c;HarmonyOs&#xff0c;Linux 等等&a…...