如何学习Transformer架构
Transformer架构自提出以来,在自然语言处理领域引发了革命性的变化。作为一种基于注意力机制的模型,Transformer解决了传统序列模型在并行化和长距离依赖方面的局限性。本文将探讨Transformer论文《Attention is All You Need》与Hugging Face Transformers库之间的关系,并详细介绍如何利用Hugging Face Transformers的代码深入学习Transformer架构。
一、Transformer论文与Hugging Face Transformers库的关系
1. Transformer论文:《Attention is All You Need》
基本信息:
- 标题:Attention is All You Need
- 作者:Ashish Vaswani等人
- 发表时间:2017年
- 会议:NIPS 2017(现称为NeurIPS)
主要内容:
Transformer论文首次提出了一种全新的神经网络架构,彻底摆脱了循环神经网络(RNN)和卷积神经网络(CNN)的限制。其核心创新在于引入了自注意力机制(Self-Attention)和多头注意力机制(Multi-Head Attention),使模型能够高效并行化处理序列数据,捕获全局依赖关系。
影响:
Transformer架构的提出极大地推动了自然语言处理的发展,随后衍生出了多种基于Transformer的模型,如BERT、GPT系列、RoBERTa、T5等。这些模型在各种NLP任务中都取得了卓越的表现。
2. Hugging Face Transformers库
基本信息:
- 名称:Hugging Face Transformers
- 开发者:Hugging Face公司
- 性质:开源的深度学习模型库
- 支持框架:PyTorch、TensorFlow、JAX
主要内容:
Hugging Face Transformers库实现了多种基于Transformer架构的预训练模型,方便开发者在不同任务中应用。这些模型涵盖了自然语言处理、计算机视觉和音频处理等多个领域。
功能特点:
- 丰富的预训练模型:提供了数以千计的预训练模型,支持多种任务和模态。
- 简洁的API接口:通过
pipeline
等高级API,用户可以快速加载模型并应用于实际任务。 - 多框架支持:兼容PyTorch、TensorFlow和JAX。
- 社区支持和共享:拥有活跃的开源社区,用户可以分享和获取模型。
3. 二者的关系与区别
联系:
- 基础架构相同:Hugging Face Transformers库中的模型都是基于Transformer架构,源自《Attention is All You Need》论文。
- 理论与实践的结合:Transformer论文提供了理论基础和原始模型,Hugging Face Transformers库将这些理论和模型实现为易于使用的代码,并扩展到了更多的任务和应用场景。
区别:
-
性质不同:
- Transformer论文:是一篇学术论文,提出了一种新的神经网络架构,侧重于理论和实验验证。
- Hugging Face Transformers库:是一个开源的软件库,提供了基于Transformer架构的预训练模型和工具,方便实际项目的应用和微调。
-
范围不同:
- Transformer论文:重点介绍了原始的Transformer模型,主要用于机器翻译。
- Transformers库:实现了大量基于Transformer的模型,支持文本分类、问答系统、文本生成、图像处理、语音识别等任务。
-
应用目的不同:
- Transformer论文:旨在为学术研究提供新的方向和启发。
- Transformers库:旨在提供实用的工具和模型,加速模型的开发和部署。
二、利用Hugging Face Transformers代码学习Transformer架构
Transformer架构虽然在理论上相对复杂,但通过阅读和实践Hugging Face Transformers库的代码,可以更直观地理解其工作原理。以下是具体的学习步骤和建议。
1. 理论基础准备
在深入代码之前,建议先熟悉Transformer的理论概念。
- 阅读原始论文:Attention is All You Need
- 参考资料:
- The Illustrated Transformer
- 上面文章的中文翻译
- Transformer动画演示
2. 搭建学习环境
-
安装Transformers库:
pip install transformers pip install torch # 如果使用PyTorch
-
克隆源码仓库:
git clone https://github.com/huggingface/transformers.git
3. 了解库的整体结构
-
目录结构:
src/transformers/models
:各模型的实现文件夹。src/transformers/models/bert
:BERT模型代码。src/transformers/models/gpt2
:GPT-2模型代码。
-
选择学习的模型:
- BERT:代表编码器架构。
- GPT-2:代表解码器架构。
4. 深入阅读模型源码
4.1 BERT模型
-
文件位置:
src/transformers/models/bert/modeling_bert.py
-
核心组件:
BertModel
:主模型类。BertEncoder
:由多个BertLayer
组成的编码器。BertLayer
:包含注意力和前馈网络的基础层。BertSelfAttention
:自注意力机制的实现。BertSelfOutput
:注意力机制的输出处理。
-
阅读顺序:
-
BertModel:从
forward
方法开始,理解输入如何通过各个子模块。 -
BertEncoder和BertLayer:理解编码器的堆叠方式和每一层的操作。
-
BertSelfAttention:深入了解自注意力的实现,包括
query
、key
、value
的计算。 -
残差连接和LayerNorm:注意每一层的残差连接和归一化过程。
-
4.2 GPT-2模型
-
文件位置:
src/transformers/models/gpt2/modeling_gpt2.py
-
核心组件:
GPT2Model
:主模型类。GPT2Block
:包含注意力和前馈网络的基础块。GPT2Attention
:自注意力机制的实现。
-
注意事项:
GPT-2是解码器架构,与BERT的编码器架构有所不同,可对比学习。
5. 理解核心机制
5.1 自注意力机制(Self-Attention)
-
关键步骤:
-
计算
query
、key
、value
矩阵。 -
计算注意力得分:
query
和key
的点积。 -
应用缩放和掩码:缩放注意力得分,应用
softmax
。 -
计算注意力输出:注意力得分与
value
矩阵相乘。
-
-
代码位置:
BertSelfAttention
类。
5.2 多头注意力机制(Multi-Head Attention)
-
实现方式:并行计算多个头的注意力,提升模型的表达能力。
-
代码位置:
BertSelfAttention
中的多头实现。
5.3 前馈网络(Feed-Forward Network, FFN)
-
结构:两层线性变换,中间有非线性激活函数(如GELU)。
-
代码位置:
BertIntermediate
和BertOutput
类。
5.4 位置编码(Positional Encoding)
-
实现方式:可学习的绝对位置嵌入,补充序列的位置信息。
-
代码位置:
BertEmbeddings
类。
6. 实践练习
6.1 运行示例代码
-
官方示例:在
examples
目录中,有各种任务的示例代码。 -
练习建议:
- 文本分类:使用BERT在情感分析任务上进行训练。
- 文本生成:使用GPT-2进行文本生成,调试参数影响。
6.2 修改和调试代码
-
实验建议:
- 调整模型超参数:修改层数、隐藏单元数、注意力头数。
- 尝试新功能:例如,修改激活函数,或添加新的正则化措施。
-
调试工具:使用IDE的调试功能或插入打印语句,观察模型的内部状态。
7. 结合理论与实现
-
对照论文公式和代码:将源码中的实现与论文中的公式一一对应,如注意力得分的计算。
-
绘制计算流程图:帮助理解数据在模型中的流动。
8. 参考资料
-
Hugging Face Transformers文档:https://huggingface.co/transformers/
-
深入理解Transformer的博客和教程:
- The Annotated Transformer
- 知乎上关于Transformer的详解
9. 参与社区交流
-
GitHub Issues:查看他人的提问和解答,加深对常见问题的理解。
-
论坛和讨论组:加入Hugging Face的官方论坛,与社区成员交流经验。
10. 学习建议
-
循序渐进:逐步深入理解,不要急于求成。
-
实践为主:多动手实验,加深对理论的理解。
-
记录心得:将学习过程中遇到的问题和收获记录下来,方便后续复习。
三、总结
通过结合Transformer论文的理论基础和Hugging Face Transformers库的实践代码,能够更全面地理解Transformer架构的精髓。从理论到实践,再从实践回归理论,这种循环往复的学习方式,将有助于深入掌握Transformer及其在各种任务中的应用。
希望本文能对您学习和理解Transformer架构有所帮助!
相关文章:
如何学习Transformer架构
Transformer架构自提出以来,在自然语言处理领域引发了革命性的变化。作为一种基于注意力机制的模型,Transformer解决了传统序列模型在并行化和长距离依赖方面的局限性。本文将探讨Transformer论文《Attention is All You Need》与Hugging Face Transform…...
RPA赋能内容创作:打造小红书入门词语图片的全自动化流程
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 用RPA全自动化批量生产【入门词语】图片做小红书商单,保姆级工具开发教程 最近由…...
Quantum supremacy using a programmable superconducting processor 全文翻译,配公式和图
2019年,谷歌的量子霸权文章, 原文链接: https://www.nature.com/articles/s41586-019-1666-5 第一稿,公式和视图后续再加 。。。 Quantum supremacy using a programmable superconducting processor 使用可编程超导处理器的量…...
Jupyter notebook中运行dos指令运行方法
Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统)指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…...
个人vue3-学习笔记
声明:这只是我个人的学习笔记(黑马),供以后复习用 。一天学一点,随时学随时更新。明天会更好的! 这里只给代码,不给运行结果,看不出来代码的作用我也该进厂了。。。。。 Day1 使用create-vue创建项目。 1.检查版本。 node -v 2.创建项目 npm init vue@latest 可…...
Ubuntu安装搜狗输入法
Ubuntu安装搜狗输入法 官网完整安装步骤调整默认输入法 官网 搜狗输入法 - 官网:https://shurufa.sogou.com/ 搜狗输入法Linux版 - 首页:https://shurufa.sogou.com/linux 搜狗输入法Linux版 - 安装指南:https://shurufa.sogou.com/linux/gu…...
【C】链表算法题2 -- 反转链表
leetcode链接https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/https://leetcode.cn/problems/reverse-linked-list/description/…...
1.7 ChatGPT:引领AI对话革命的致胜之道
ChatGPT:引领AI对话革命的致胜之道 随着人工智能(AI)技术的迅猛发展,特别是在自然语言处理(NLP)领域,OpenAI 的 ChatGPT 已经成为了举世瞩目的技术突破。从普通的自动化客服到深入的创作与协作,ChatGPT 通过其卓越的语言理解和生成能力,改变了人们与计算机交互的方式…...
当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线
问题:当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线; 原因:el-table有一个before的伪元素作为表格的下边框下,初始的时候已设置,在滚动的时候并没有重新设置…...
如何使用 useMemo 和 memo 优化 React 应用性能?
使用 useMemo 和 memo 优化 React 应用性能 在构建复杂的 React 应用时,性能优化是确保应用流畅运行的关键。React 提供了多种工具来帮助开发者优化组件的渲染和计算逻辑,其中 useMemo 和 memo 是两个非常有用的 Hook。本文将详细介绍这两个工具的使用方…...
turtle教学课程课堂学习考试在线网站
完整源码项目包获取→点击文章末尾名片!...
spark任务优化参数整理
以下参数中有sql字眼的一般只有spark-sql模块生效,如果你看过spark的源码,你会发现sql模块是在core模块上硬生生干了一层,所以反过来spark-sql可以复用core模块的配置,例外的时候会另行说明,此外由于总结这些参数是在不…...
TCP TIME-WAIT 状态为什么要坚持 2MSL
经常有人问这个问题,这种问题问我就对了。我准备了下面的一幅时序图来解释这个问题: 简单点说就是两个目的: 正常处理被动关闭方的重传 FIN;确保当前连接的所有报文全部消失。 也就是说,无论任何情况下,…...
如何在Ubuntu上安装Cmake
前言 本文主要阐述如何在Ubuntu22.04上面安装cmake,具体可看下面的操作。 正文 一、环境 Ubuntu22.04 cmake-3.31.4.tar.gz 二、步骤 参考这个方案: 【运维】Ubuntu如何安装最新版本的Cmake,编译安装Cmake,直接命令安装…...
1.17学习
crypto nssctf-[SWPUCTF 2021 新生赛]crypto8 不太认识这是什么编码,搜索一下发现是一个UUENCODE编码,用在线工具UUENCODE解码计算器—LZL在线工具解码就好 misc buuctf-文件中的秘密 下载附件打开后发现是一个图片,应该是一个图片隐写&…...
力扣 搜索二维矩阵
二分查找,闭区间与开区间的不同解法。 题目 乍一看,不是遍历一下找到元素就可以了。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for (int[] ints : matrix) {for (int ans : ints) {if (ans target) return true;}}…...
RabbitMQ基础篇
文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式(Simple Queue)2.2 工作队列模式(Work Queues)2.3 发布/订阅模式(Publish/Subscribe)2.4 路由模式(R…...
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17,不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17,不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug,开始还没在意。 直到我今天自己初始化项目时才发现&am…...
[BrainShadow-V1] VR头戴设备统计报告
Brain-Shadow-V1 EventVR headsetsReported byXiao enDate2025/01/15Version1.0 HTC Vive Pro 2 Pro HTC Vive Pro 2 是一款高端虚拟现实头显,配备双 2.5K 显示屏,组合分辨率达到 48962448,提供 120 的视场角和 120Hz 的刷新率。该设备支持…...
RK3568 Android11 锁屏界面屏蔽下拉状态栏
参考文章: Android R锁屏界面屏蔽下拉状态栏_pulseexpansionhandler-CSDN博客 前提增加状态栏控制显隐属性,以下面文章为前提补充功能 RK3568 Android11 状态栏和导航栏增加显示控制功能-CSDN博客 修改文件位置: frameworks/base/package…...
53,【3】BUUCTF WEB october 2019 Twice SQLinjection
题目得到信息,2次注入,进入靶场 登录页面,很自然想到SQL 第一次注入应该是这个可以登录,注册,提交简介的页面 第二次注入应该是在info处注入,信息显示在简介处 我真的纯脑子有病,人家二次注入不…...
利用硬盘虚拟内存解决华为手机模拟器运行内存不足问题
在进行鸿蒙开发时,华为手机模拟器是必不可少的工具。然而,对于只有 8GB 物理内存的电脑来说,运行模拟器可能会遇到 "系统内存不足" 的提示,导致模拟器无法正常启动。这时,我们可以通过硬盘虚拟出额外的内存来…...
探秘Shortest与Stagehand:开启高效测试与自动化新篇
探秘Shortest与Stagehand:开启高效测试与自动化新篇 在数字化浪潮的推动下,网页自动化工具如同繁星般涌现,为众多行业带来了效率的变革。在这些工具中,Shortest和Stagehand凭借其出色的表现,成为了众多开发者、测试人…...
网络安全构成要素
一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…...
家政服务小程序,打造智慧家政新体验
春节即将来临,家政市场呈现出了火热的场景,大众对家政服务的需求持续增加。 近年来,家政市场开始倾向数字化、智能化,借助科学技术打造家政数字化平台,让大众在手机上就可以预约家政服务,减少传统家政市场…...
2.使用Spring BootSpring AI快速构建AI应用程序
Spring AI 是基于 Spring Boot3.x 框架构建,Spring Boot官方提供了非常便捷的工具Spring Initializr帮助开发者快速的搭建Spring Boot应用程序,IDEA也集成了此工具。本文使用的开发工具IDEASpring Boot 3.4Spring AI 1.0.0-SNAPSHOTMaven。 1.创建Spring Boot项目 …...
OpenCV实战-全景图像拼接
代码地址见文末 实现效果 1. 项目背景 随着计算机视觉技术的不断发展,图像拼接技术已被广泛应用于虚拟现实、地图生成、全景摄影等领域。图像拼接(Image Stitching)旨在将多张部分重叠的图像无缝拼接成一幅完整的全景图像。此任务要求图像处…...
h5使用video播放时关掉vant弹窗视频声音还在后台播放
现象: 1、点击遮罩弹窗关闭,弹窗的视频已经用v-if销毁,但是后台会自己从头开始播放视频声音。但是此时已经没有视频dom 2、定时器在打开弹窗后3秒自动关闭弹窗,则正常没有问题。 原来的代码: //页面 <a click&quo…...
解决leetcode第3418题机器人可以获得的最大金币数
3418.机器人可以获得的最大金币数 难度:中等 问题描述: 给你一个mxn的网格。一个机器人从网格的左上角(0,0)出发,目标是到达网格的右下角(m-1,n-1)。在任意时刻,机器人只能向右或向下移动。 网格中的每个单元格包含一个值coin…...
anaconda安装和环境配置
文章目录 一、Anaconda下载1.从官网直接下载:2.从镜像站中下载: 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境(方便管理项目环境)1.查看conda有哪些环境2.创建python3.6的环境3.激活…...
Lora理解QLoRA
Parameter-Efficient Fine-Tuning (PEFT) :节约开销的做法,fine-tune少量参数,而不是整个模型; Low-Rank Adaptation (LoRA) :是PEFT的一种;冻结原参数矩阵,只更新2个小参数矩阵。 原文经过对比…...
嵌入式杂谈——什么是DMA?有什么用?
什么是DMA?——直接内存访问技术详解 在嵌入式系统和计算机体系结构中,DMA(Direct Memory Access,直接内存访问) 是一种重要的数据传输技术。它允许外设(如UART、SPI、ADC等)直接与内存进行数据…...
超标量处理器设计2-cache
1. cache 介绍 影响Cache缺失的情况有3种: Compulsory: 第一次被访问的指令或者数据肯定不会在cache中,需要通过预取来减少这种缺失Capcity: Cache容量越大,缺失就可以更少, 程序频繁使用的三个数据来源于3个set, 但是ÿ…...
使用Nginx正向代理让内网主机通过外网主机访问互联网
目录 环境概述 流程说明 在外网服务器上安装部署nginx? 安装前准备 下载nginx ?编译安装nginx 开始配置正向代理 创建systemd服务单元文件,用于管理Nginx服务的启动、停止和重新加载 启动nginx ?代理服务器本地验证 ?内网服务器验证 ?将代理地址添…...
蓝桥杯刷题第二天——背包问题
题目描述 有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是Vi价值是Wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V&am…...
DM达梦启用及收集AWR报告
1.创建DBMS_WORKLOAD_REPOSITORY系统包 查看DBMS_WORKLOAD_REPOSITORY系统包启用状态 SQL> SELECT SF_CHECK_AWR_SYS;LINEID SF_CHECK_AWR_SYS ---------- ---------------- 1 0SF_CHECK_AWR_SYS 返回值 0:未启用;1:已启…...
【git】如何删除本地分支和远程分支?
1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支,不会影响任何远程分支。 (1)在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志,是命令的一个选项&#x…...
pix2pix mmgeneration通用场景黑白图片上色模型训练,Docker
https://www.dong-blog.fun/post/1924 对于机器学习和深度学习感兴趣的读者来说,OpenMMLab 提供的 MMGeneration 库是一个绝佳的选择。最近我在阅读一篇关于 MMGeneration 的博客文章,尤其是在使用 Docker 环境进行模型和算法测试方面,受益匪浅。以下是我对目标博客内容的概…...
【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)
目录 Spring Boot中集成Redis 1.项目创建和环境配置 2.基本操作演示 Spring Boot中集成Redis Spring社区也自定义了一套Redis的客户端,与jedis的操作方式有所差异,Spring中把每个类型的操作都单独封装了起来。下面就让我来带大家了解如何在Spring Bo…...
js使用qrcode与canvas生成带logo的二维码
qrcode库 文档 https://www.npmjs.com/package/qrcode 安装 npm i qrcode 使用 errorCorrectionLevel: H // 容错率(H是最高,其它看文档) width: 200 // 大小 margin: 2 // 边距 import QRCode from qrcodeconst testFn async () > {c…...
【STM32】LED状态翻转函数
1.利用状态标志位控制LED状态翻转 在平常编写LED状态翻转函数时,通常利用状态标志位实现LED状态的翻转。如下所示: unsigned char led_turn_flag; //LED状态标志位,1-点亮,0-熄灭/***************************************函…...
FreeRTOS 简介
FreeRTOS 是一个小型、实时操作系统内核,专为嵌入式设备设计。它支持多任务操作、任务优先级、互斥机制和队列管理,是轻量级嵌入式开发中的热门选择。以下是其主要特点: 特点 实时性能:提供确定性的任务调度,适用于对…...
Java并发编程中的synchronized和volatile:用途解析与使用场景
目录 一、synchronized关键字:互斥与同步的保障 二、volatile关键字:轻量级的变量可见性保证 三、synchronized与volatile的区别与选择 四、总结 在Java并发编程中,synchronized和volatile是两个非常重要的关键字,它们在多线程…...
将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1)
问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件,近期 AzureBlob 的流量费用增长很快,想通过分析Blob的日志,获取一些可用的信息,所以有了这个需求:将存储账户的日志(读写,审计&…...
程序设计:排版、检验报告的上下标解决几种办法
【啰嗦两句】 本文重点在于提供几个针对排版文档、各种检验报告系统等程序设计时,遇到的上下标录入、绘制展示等问题的应对办法,但是准确地说,并没有非常优秀的方案。 【上下标难题】 一般的行业或许对上下标并没有严格要求,多数…...
【2024年华为OD机试】 (C卷,100分)- 求字符串中所有整数的最小和(Java JS PythonC/C++)
一、问题描述 题目解析 题目描述 输入字符串 s,输出 s 中包含所有整数的最小和。 说明 字符串 s 只包含 a-z、A-Z、、-。合法的整数包括: 正整数:一个或多个 0-9 组成,如 0、2、3、002、102。负整数:负号 - 开头&…...
MBox20网关:数字化工厂的智能加速器
在当今这个日新月异的数字化时代,企业对于生产效率、数据管理和网络安全的追求已经达到了前所未有的高度。特别是在制造业领域,随着“工业4.0”和“智能制造”概念的深入实践,数字化工厂已成为产业升级的必然趋势。在这场深刻的变革中&#x…...
NodeJS | 搭建本地/公网服务器 live-server 的使用与安装
目录 介绍 安装 live-server 安装方法 安装后的验证 环境变量问题 Node.js 环境变量未配置正确 全局安装的 live-server 路径未添加到环境变量 运行测试 默认访问主界面 访问文件 报错信息与解决 问题一:未知命令 问题二:拒绝脚本 公网配置…...
用C++实现一个基于模板的观察者设计模式
观察者模式 定义 观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象间的一对多依赖关系,使得当一个对象状态发生变化时,其所有依赖它的对象都会收到通知并自动更新。 核心概念 角色定义 Subject(被观察者): 持有观察者列表,维护观察者的注册和移除。 …...
LabVIEW开发X光图像的边缘检测
在医疗影像处理中,X光图像的分析对于骨折、肿瘤等病变的检测非常重要。X光图像中包含许多关键信息,然而,由于图像噪声的干扰,直接从图像中提取有用的特征(如骨折的边缘)变得非常困难。边缘检测作为图像处理…...