Stable Diffusion XL之核心基础内容

Stable Diffusion XL之核心基础内容

  • 一. Stable Diffusion XL核心基础内容
    • 1.1 Stable Diffusion XL的主要优化
    • 1.2 SDXL整体架构初识
    • 1.3 VAE模型
      • 1.VAE基本介绍
      • 2. VAE基本模型结构
      • 3.VAE的训练
    • 1.4 U-Net模型(Base部分)
      • 1. 十四个基本模块概述
      • 2. SDXL_Spatial Transformer_X模块
      • 3. CrossAttention模块细节
    • 1.5 CLIP Text Encoder模型
    • 1.6 Refiner模型
  • 二. Stable Diffusion XL训练技巧和细节
    • 2.1 图像尺寸条件化
    • 2.2 图像裁剪参数条件化
    • 2.3 多尺度训练
    • 2.4 使用Offset Noise

一. Stable Diffusion XL核心基础内容

1.1 Stable Diffusion XL的主要优化

与Stable Diffusion 1.x-2.x相比,Stable Diffusion XL主要进行如下的优化:

  1. 对Stable Diffusion 1.x-2.x的U-Net,VAE,CLIP Text Encoder三大核心模型都做了改进。
  2. 增加一个独立的基于Latent的Refiner模型,也是一个扩散模型,用来提升生成图像的精细化程度。
  3. 设计了很多训练Tricks,包括图像尺寸条件化策略、图像裁剪参数条件化策略以及多尺度训练策略等。
  4. 先发布Stable Diffusion XL 0.9测试版本,基于用户的使用体验和图片生成的反馈情况,针对性增加数据集和使用RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)技术优化训练后,推出了Stable Diffusion XL 1.0正式版。

1.2 SDXL整体架构初识

Stable Diffusion XL是一个二阶段的级联扩散模型(Latent Diffusion Model),包括Base模型和Refiner模型
其中,Base模型的主要工作和Stable Diffusion 1.x-2.x一致,具备文生图(txt2img)、图生图(img2img)、图像inpainting等能力。在Base模型之后,级联了Refiner模型,对Base模型生成的图像Latent特征进行精细化提升,其本质上是在做图生图的工作。

  • SDXL Base模型由U-Net、VAE以及CLIP Text Encoder(两个)三个模块组成,
  • SDXL Refiner模型同样由U-Net、VAE和CLIP Text Encoder(一个)三个模块组成
    在这里插入图片描述

1.3 VAE模型

1.VAE基本介绍

Stable Diffusion XL依旧是基于Latent的扩散模型,所以VAE的Encoder和Decoder结构依旧是Stable Diffusion XL高效提取图像Latent特征和图像像素级重建的关键一招。

  • 当输入是图片时,SDXL和SD一样,首先会使用VAE的Encoder结构将输入图像转换为Latent特征,然后U-Net不断对Latent特征进行优化,最后使用VAE的Decoder结构将Latent特征重建出像素级图像。除了提取Latent特征和图像的像素级重建外,VAE还可以改进生成图像中的高频细节,小物体特征和整体图像色彩。

  • 当Stable Diffusion XL的输入是文字时,这时我们不需要VAE的Encoder结构,只需要Decoder进行图像重建。

Stable Diffusion XL使用了和之前Stable Diffusion系列一样的VAE结构(KL-f8),但在训练中选择了更大的Batch-Size(256 vs 9),并且对模型进行指数滑动平均操作(EMA,exponential moving average),EMA对模型的参数做平均,从而提高性能并增加模型鲁棒性。

2. VAE基本模型结构

在这里插入图片描述
SDXL VAE模型中有三个基础组件

  • GSC组件:GroupNorm+SiLU+Conv
  • Downsample组件:Padding+Conv
  • Upsample组件:Interpolate+Conv

同时SDXL VAE模型还有两个核心组件:ResNetBlock模块和SelfAttention模型,两个模块的结构如上图所示。

SDXL VAE Encoder部分包含了三个DownBlock模块、一个ResNetBlock模块以及一个MidBlock模块,将输入图像压缩到Latent空间,转换成为Gaussian Distribution。

而VAE Decoder部分正好相反,其输入Latent空间特征,并重建成为像素级图像作为输出。其包含了三个UpBlock模块、一个ResNetBlock模块以及一个MidBlock模块。

3.VAE的训练

损失函数方面,使用了久经考验的生成领域“交叉熵”—感知损失(perceptual loss)以及L1回归损失来约束VAE的训练过程。
Stable Diffusion XL的VAE是从头开始训练的。

  • SD-VAE 2.x,SD-VAE 1.x,SDXL-VAE模型结构是一样的

  • 不同点在于SD-VAE 2.x是基于SD-VAE 1.x微调训练了Decoder部分,同时保持Encoder部分权重不变,使他们有相同的Latent特征分布,所以SD 1.x和SD 2.x的VAE模型是互相兼容的。而SDXL-VAE是重新从头开始训练的,所以其Latent特征分布与之前的两者不同。

  • 由于Latent特征分布产生了变化,SDXL VAE的缩放系数也产生了变化。VAE在将Latent特征送入U-Net之前,需要对Latent特征进行缩放让其标准差尽量为1,之前的Stable Diffusion系列采用的缩放系数为0.18215,由于Stable Diffusion XL的VAE进行了全面的重训练,所以缩放系数重新设置为0.13025。

注意:由于缩放系数的改变,Stable Diffusion XL VAE模型与之前的Stable Diffusion系列并不兼容。

与此同时,与Stable Diffusion一样,VAE模型在Stable Diffusion XL中除了能进行图像压缩和图像重建的工作外,通过切换不同微调训练版本的VAE模型,能够改变生成图片的细节与整体颜色(更改生成图像的颜色表现,类似于色彩滤镜)。

1.4 U-Net模型(Base部分)

1. 十四个基本模块概述

在这里插入图片描述
上图中包含Stable Diffusion XL Base U-Net的十四个基本模块:

1. GSC模块:Stable Diffusion Base XL U-Net中的最小组件之一,由GroupNorm+SiLU+Conv三者组成。
2. DownSample模块:Stable Diffusion Base XL U-Net中的下采样组件,使用了Conv(kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))进行采下采样。
3. UpSample模块:Stable Diffusion Base XL U-Net中的上采样组件,由插值算法(nearest)+Conv组成。
4. ResNetBlock模块:借鉴ResNet模型的“残差结构”,让网络能够构建的更深的同时,将Time Embedding信息嵌入模型。
5. CrossAttention模块:将文本的语义信息与图像的语义信息进行Attention机制,增强输入文本Prompt对生成图片的控制。
6. SelfAttention模块:SelfAttention模块的整体结构与CrossAttention模块相同,这是输入全部都是图像信息,不再输入文本信息。
7. FeedForward模块:Attention机制中的经典模块,由GeGlU+Dropout+Linear组成。
8. BasicTransformer Block模块:由LayerNorm+SelfAttention+CrossAttention+FeedForward组成,是多重Attention机制的级联,并且每个Attention机制都是一个“残差结构”。通过加深网络和多Attention机制,大幅增强模型的学习能力与图文的匹配能力。
9. SDXL_Spatial Transformer_X模块:由GroupNorm+Linear+X个BasicTransformer Block+Linear构成,同时ResNet模型的“残差结构”依旧没有缺席。
10. SDXL_DownBlock模块:由ResNetBlock+ResNetBlock+DownSample组成。
11. SDXL_UpBlock_X模块:由X个ResNetBlock模块组成。
12. CrossAttnDownBlock_X_K模块:是Stable Diffusion XL Base U-Net中Encoder部分的主要模块,由K个(ResNetBlock模块+SDXL_Spatial Transformer_X模块)+DownSample模块组成。
13. CrossAttnUpBlock_X_K模块:是Stable Diffusion XL Base U-Net中Decoder部分的主要模块,由K个(ResNetBlock模块+SDXL_Spatial Transformer_X模块)+UpSample模块组成。
14. CrossAttnMidBlock模块:是Stable Diffusion XL Base U-Net中Encoder和ecoder连接的部分,由ResNetBlock+SDXL_Spatial Transformer_10+ResNetBlock组成。
在这里插入图片描述
Stable Diffusion XL,U-Net模型(Base部分)参数量就增加到2.6B,参数量增加幅度达到了3倍左右

整个新的SDXL Base U-Net设计思想也让SDXL的Base出图分辨率提升至1024x1024。在参数保持一致的情况下,Stable Diffusion XL生成图片的耗时只比Stable Diffusion多了20%-30%之间,这个拥有2.6B参数量的模型已经足够伟大。

在SDXL U-Net的Encoder结构中,包含了两个CrossAttnDownBlock结构和一个SDXL_DownBlock结构;在Decoder结构中,包含了两个CrossAttnUpBlock结构和一个SDXL_UpBlock结构;与此同时,Encoder和Decoder中间存在Skip Connection,进行信息的传递与融合。

2. SDXL_Spatial Transformer_X模块

增加的**SDXL_Spatial Transformer_X模块(主要包含Self Attention + Cross Attention + FeedForward)**数量占新增参数量的主要部分,上表中已经用红色框圈出。U-Net的Encoder和Decoder结构也从原来的4stage改成3stage([1,1,1,1] -> [0,2,10]),说明SDXL只使用两次下采样和上采样,而之前的SD系列模型都是三次下采样和上采样。

比起Stable DiffusionV1/2,Stable Diffusion XL在第一个stage中不再使用Spatial Transformer Blocks,而在第二和第三个stage中大量增加了Spatial Transformer Blocks(分别是2和10),那么这样设计有什么好处呢?

  • 首先,在第一个stage中不使用SDXL_Spatial Transformer_X模块,可以明显减少显存占用和计算量
  • 然后在第二和第三个stage这两个维度较小的feature map上使用数量较多的SDXL_Spatial Transformer_X模块,能在大幅提升模型整体性能(学习能力和表达能力)的同时,优化了计算成本
    从上面讲到的十四个基本模块中可以看到,BasicTransformer Block模块是整个框架的基石,由SelfAttention,CrossAttention和FeedForward三个组件构成,并且使用了循环残差模式,让SDXL Base U-Net不仅可以设计的更深,同时也具备更强的文本特征和图像体征的学习能力。

3. CrossAttention模块细节

Stable Diffusion XL中的Text Condition信息由两个Text Encoder提供(OpenCLIP ViT-bigG和OpenAI CLIP ViT-L),通过Cross Attention组件嵌入,作为K Matrix和V Matrix。与此同时,图片的Latent Feature作为Q Matrix

但是大家知道Text Condition是三维的,而Latent Feature是四维的,那它们是怎么进行Attention机制的呢?

其实在每次进行Attention机制前,我们需要将Latent Feature从[batch_size,channels,height,width]转换到[batch_size,height*width,channels] ,这样就变成了三维特征,就能够和Text Condition做CrossAttention操作。

在完成CrossAttention操作后,我们再将Latent Feature从[batch_size,height*width,channels]转换到[batch_size,channels,height,width] ,这样就又重新回到原来的维度。

还有一点是Text Condition如何跟latent Feature大小保持一致呢?因为latent embedding不同位置的H和W是不一样的,但是Text Condition是从文本中提取的,其H和W是固定的。这里在CorssAttention模块中有一个非常巧妙的点,那就是在不同特征做Attention操作前,使用Linear层将不同的特征的尺寸大小对齐。

1.5 CLIP Text Encoder模型

CLIP模型主要包含Text Encoder和Image Encoder两个模块,在Stable Diffusion XL中,和之前的Stable Diffusion系列一样,只使用Text Encoder模块从文本信息中提取Text Embeddings。

不过Stable Diffusion XL与之前的系列相比,使用了两个CLIP Text Encoder,分别是OpenCLIP ViT-bigG(1.39G)和OpenAI CLIP ViT-L(246M),从而大大增强了Stable Diffusion XL对文本的提取和理解能力。

1.6 Refiner模型

Stable Diffusion XL开始使用级联策略,在U-Net(Base)之后,级联Refiner模型,进一步提升生成图像的细节特征与整体质量。

由于已经有U-Net(Base)模型生成了图像的Latent特征,所以Refiner模型的主要工作是在Latent特征进行小噪声去除和细节质量提升。

在这里插入图片描述
Refiner模型和Base模型一样是基于Latent的扩散模型,也采用了Encoder-Decoder结构,和U-Net兼容同一个VAE模型,不过Refiner模型的Text Encoder只使用了OpenCLIP ViT-bigG。
在这里插入图片描述
在Stable Diffusion XL推理阶段,输入一个prompt,通过VAE和U-Net(Base)模型生成Latent特征,接着给这个Latent特征加一定的噪音,在此基础上,再使用Refiner模型进行去噪,以提升图像的整体质量与局部细节。

二. Stable Diffusion XL训练技巧和细节

Stable Diffusion XL在训练阶段提出了很多Tricks,包括图像尺寸条件化策略,图像裁剪参数条件化以及多尺度训练。这些Tricks都有很好的通用性和迁移性,能普惠其他的生成式模型。

2.1 图像尺寸条件化

Stable Diffusion的训练过程:
主要分成两个阶段,一个是在256x256的图像尺寸上进行预训练,然后在512x512的图像尺寸上继续训练。

而这两个阶段的训练过程都要对最小图像尺寸进行约束。第一阶段中,会将尺寸小于256x256的图像舍弃;同样的,在第二阶段,会将尺寸小于512x512的图像筛除。这样的约束会导致训练数据中的大量数据被丢弃,从而很可能导致模型性能和泛化性的降低。
传统解决方式:
针对上述数据集利用率的问题,常规思路可以借助超分模型将尺寸过小的图像放大。但是面对对于图像尺寸过小的场景,目前的超分模型可能会在对图像超分的同时会引入一些噪声伪影,影响模型的训练,导致生成一些模糊的图像。
Stable Diffusion XL解决方式:
Stable Diffusion XL为了在解决数据集利用率问题的同时不引入噪声伪影,将U-Net(Base)模型与原始图像分辨率相关联,核心思想是将输入图像的原始高度和宽度作为额外的条件嵌入U-Net模型中,表示为 C ( s i z e ) = ( h e i g h t , w i d t h ) C_(size) = (height, width) C(size)=(height,width)
。height和width都使用傅里叶特征编码进行独立嵌入,然后将特征concat后加在Time Embedding上,将图像尺寸引入训练过程。这样以来,模型在训练过程中能够学习到图像的原始分辨率信息,从而在推理生成阶段更好地适应不同尺寸的图像生成,而不会产生噪声伪影的问题。

2.2 图像裁剪参数条件化

Stable Diffusion预处理图像
Stable Diffusion系列模型,由于需要输入固定的图像尺寸用作训练,很多数据在预处理阶段会被裁剪。生成式模型中典型的预处理方式是先调整图像尺寸,使得最短边与目标尺寸匹配,然后再沿较长边对图像进行随机裁剪或者中心裁剪。虽然裁剪是一种数据增强方法,但是训练中对图像裁剪导致的图像特征丢失,可能会导致模型在图像生成阶段出现不符合训练数据分布的特征。

其实之前NovelAI就发现了这个问题,并提出了基于分桶(Ratio Bucketing)的多尺度训练策略,其主要思想是先将训练数据集按照不同的长宽比(aspect ratio)进行分桶(buckets)。在训练过程中,每次在buckets中随机选择一个bucket并从中采样Batch个数据进行训练。将数据集进行分桶可以大量较少裁剪图像的操作,并且能让模型学习多尺度的生成能力;但相对应的,预处理成本大大增加,特别是数据量级较大的情况下。

并且尽管数据分桶成功解决了数据裁剪导致的负面影响,但如果能确保数据裁剪不把负面影响引入生成过程中,裁剪这种数据增强方法依旧能给模型增强泛化性能。
Stable Diffusion XL图像裁剪参数条件化策略
Stable Diffusion XL使用了一种简单而有效的条件化方法,即图像裁剪参数条件化策略。其主要思想是在加载数据时,将左上角的裁剪坐标通过傅里叶编码并嵌入U-Net(Base)模型中,并与原始图像尺寸一起作为额外的条件嵌入U-Net模型,从而在训练过程中让模型学习到对“图像裁剪”的认识。
在这里插入图片描述

2.3 多尺度训练

Stable Diffusion XL采用了多尺度训练策略,这个在传统深度学习时代头牌模型YOLO系列中常用的增强模型鲁棒性与泛化性策略,终于在AIGC领域应用并固化了,并且Stable Diffusion XL在多尺度的技术上,增加了分桶策略

Stable Diffusion XL首先在256x256和512x512的图像尺寸上分别预训练600000步和200000步(batch size = 2048),总的数据量约等于 (600000 + 200000) x 2048 = 16.384亿。

接着Stable Diffusion XL在1024x1024的图像尺寸上采用多尺度方案来进行微调,并将数据分成不同纵横比的桶(bucket),并且尽可能保持每个桶的像素数接近1024×1024,同时相邻的bucket之间height或者width一般相差64像素左右,Stable Diffusion XL的具体分桶情况如下图所示:
在这里插入图片描述

其中Aspect Ratio = Height / Width,表示高宽比。

在训练过程中,一个Batch从一个桶里的图像采样,并且我们在每个训练步骤中在不同的桶大小之间交替切换。除此之外,aspect ratio也会作为条件嵌入到U-Net(Base)模型中,让模型能够更好地学习到“多尺度特征”。完成了多尺度微调后,Stable Diffusion XL就可以进行不同aspect ratio的AI绘画了,不过推荐生成尺寸的base为1024x1024。

2.4 使用Offset Noise

在SDXL进行微调时,使用了Offset Noise操作,能够让SDXL生成的图像有更高的色彩自由度(纯黑或者纯白背景的图像)。SD v1和SD v2一般只能生成中等亮度的图片,即生成平均值相对接近 0.5 的图像(全黑图像为 0,全白图像为 1),之所以会出现这个问题,是因为SD模型训练和推理过程的不一致造成的

SD模型在训练中进行noise scheduler流程并不能将图像完全变成随机高斯噪声,但是推理过程中,SD模型是从一个随机高斯噪声开始生成的,因此就会存在训练与推理的噪声处理过程不一致。

Offset Noise操作是解决这个问题的一种直观并且有效的方法,我们只需要在SD模型的微调训练时,把额外在从高斯分布中采样的偏置噪声引入图片添加噪声的过程中,这样就对图像的色彩均值造成了破坏,从而提高了SDXL生成图像的"泛化性能"

感谢
https://zhuanlan.zhihu.com/p/643420260

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

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

相关文章

Eigen教程:C++线性代数库详解

Eigen是一个高效、优雅的C++模板库,用于线性代数、矩阵和向量运算、数值分析及其相关算法。它提供了类似Matlab的语法和接口,使得编写代码变得简洁明了。Eigen经过精心设计,充分发挥了C++语言的优势,在运行效率、内存管理等方面表现出色。 本文将详细介绍Eigen库的使用方法,并…

鸿蒙原生应用开发-ArkTS语言基础类库多线程TaskPool和Worker的对比(三)

一、TaskPool注意事项 实现任务的函数需要使用装饰器Concurrent标注,且仅支持在.ets文件中使用。 实现任务的函数入参需满足序列化支持的类型。 由于不同线程中上下文对象是不同的,因此TaskPool工作线程只能使用线程安全的库,例如UI相关的非…

设计模式一详解

一、观察者模式 当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新 场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后&#x…

20.helm安装最新kubernetes dashboard

介绍 Kubernetes Dashboard 是一个通用的、基于 Web 的 UI,适用于 Kubernetes 集群。它允许用户管理集群中运行的应用程序并对其进行故障排除,以及管理集群本身。 从版本 7.0.0 开始,官方放弃了对基于清单的安装的支持。目前仅支持基于 Helm 的安装。由于多容器设置和对 K…

SwiftUI Release 引入的辅助焦点管理

文章目录 前言使用 FocusState 属性包装器高级技巧:专用辅助技术可聚焦字段的高级用法优化体验运行截图总结 前言 SwiftUI Release 引入了强大的新功能,其中之一是辅助焦点管理。 这个新功能使得在SwiftUI中处理辅助技术(如 VoiceOver 和 S…

百度谷歌301强引蜘蛛池效果怎么样

301强引蜘蛛池效果怎么样 本文 虚良SEO 原创,转载保留链接!网址:百度谷歌301强引蜘蛛池效果怎么样 - 虚良SEO 随着搜索引擎优化(SEO)技术的发展,越来越多的网站开始采用蜘蛛池技术来提高网站的排名和流量。…

关于Kubernetes-v1.23.6-资源调度-StatefulSet-OnDelete当删除的时候才更新

前面提到的普通的滚动更新,都是修改完sts立即就会发生更新操作 而还有一种更新的策略为, OnDelete,即只有在 pod 被删除时会进行更新操作 还是先看一下web这个sts的当前更新策略如下: 这里我们修改,更新策略&#xf…

【创作纪念日】1024回忆录

不知不觉中,从创作第一篇文章到现在,已经1024天了,两年多的时间里,已经从硕士到博士了,1024,对于程序员来说,是个特别的数字吧,在此回忆与记录一下这些美好的经历吧。 缘起 很早以前…

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据,如果我开始玩游戏之后,被怪物打了失去了一部分血量,这个时候我想退出游戏,当我再次进入的时候,希望仍然保持被怪物打之后的血量,而不是重新读取了数据表,这个时候…

【动态规划】【数学方法】Leetcode 343. 整数拆分

【动态规划】【数学方法】Leetcode 343. 整数拆分 解法 动态规划解法 数学 每次拆成n个3,如果剩下是4,则保留4,然后相乘 ---------------🎈🎈343. 整数拆分 题目链接🎈🎈------------------- …

重构销售话术和知识库,容联云找到了大模型的“钉子”

科技云报道原创。 从ChatGPT诞生起,大模型在营销、客服等场景的落地就被予以众望。然而在经历了一年多的“百模大战”洗礼之后,人们发现无论是算力成本还是内容生成的安全合规问题,都让大模型很难直接应用于机器与人对话的实际业务中。 这其…

log4js里numBackups设置存在无效的情况

按照文档介绍numBackups是允许的旧日志文件数量,实际使用中,确实有些配置是按这个定义表现的,但是也存在没有按这个定义表现的,我看了半天没有发现有什么区别,奇怪了。不知道是log4js的bug还是怎样,看看下面…

Vue侦听器(Watch)深度分析

1、基本示例 计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。 在组合式 API 中,我们可以使用 watch 函数在每次响应式状…

常用的苹果应用商店上架工具推荐

摘要 移动应用app上架是开发者关注的重要环节,但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作,各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用,最终指出合理使用工具的重要性。 引言 移动应…

数据库【QSqlTableModel】

【QSqlTableModel】数据库的高级API 描述 QSqlTableModel是用于从单个表读取和写入数据库记录的高级接口。它构建在较低级别的QSqlQuery之上,可用于为视图类(如QTableView)提供数据。例如: QSqlTableModel *model new QSqlTabl…

牛客题霸-SQL篇(刷题记录三)

本文基于前段时间学习总结的 MySQL 相关的查询语法,在牛客网找了相应的 MySQL 题目进行练习,以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多,因此本文不再展示,只提供 MySQL 代码与示例输出。 以下内容是…

git stash代码pop stash后误删找回

如题,git stash了代码,点了pop stash后,revert了改动。是可以找回的。 操作步骤: 使用 git stash pop 其实并没有真正地将文件删掉的,而是删除引用而已,因此我们可以使用 git fsck 命令进行找回&#xff…

可解性和解的结构

文章目录 1. 消元2. 特解 本文的目的是为了求得方程组的解 A X b (1) AXb\tag{1} AXb(1) 关于X的解可以是无解,有唯一解,无数解这几种情况。 1. 消元 假设我们有一个方程组表示如下: x 1 2 x 2 2 x 3 2 x 4 b 1 (2) x_12x_22x_32x_4b…

全量知识系统 详细设计 祖传代码之 翻译器、解释器和编译器 暨 文档规范 之1

文档规范--“祖传代码”的翻译器、解释器和编译器 序 在前面的沟通的文字表达中,总会涉及到如何使用和理解 文字中的各种常规或非常规的符号引用。如果没有一套标准来解释它,会造成不必要的理解偏差。所以,从今天起,我们暂时放…

php 快速入门(一)

一、配置系统环境 1.1 安装软件 1、安装php的开发软件:phpstorm 在这个软件中写代码 2、安装php的运行软件:phpstduy 写好的php程序需要放到phpstduy中,用户才能访问和测试 安装过程注意事项:安装的路径中不能有空格和中文字符&…