通俗易懂理解小波池化以及WaveCNet网络模型

news2024/11/18 3:29:17

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

github代码:WaveCNet

小波变换和曲波变换用于池化层

通俗易懂理解小波变换(Wavelet Transform)

二、相关介绍

关于小波变换的详细介绍,请参考另一篇博客:通俗易懂理解小波变换(Wavelet Transform)

1. DWT和IDWT原理

小波变换是可逆的,小波变换可以通过小波分解和重构,恢复原始图像详细。

在这里插入图片描述

对于输入图像 I I I,进行两级小波变换,可以得到:
L L 2 , ( L H 2 , H L 2 , H H 2 ) , ( L H 1 , H L 1 , H H 1 ) = D W T ( D W T ( I ) ) LL2, (LH2, HL2, HH2), (LH1, HL1, HH1) = DWT(DWT(I)) LL2,(LH2,HL2,HH2),(LH1,HL1,HH1)=DWT(DWT(I))
舍弃最高频的子带LH1, HL1和HH1,保留相对低频的LL2, (LH2, HL2, HH2)。最后对保留的二级小波系数进行逆变换,重构图像:
I ′ = I D W T ( L L 2 , L H 2 , H L 2 , H H 2 ) I^{\prime}= IDWT(LL2, LH2, HL2, HH2) I=IDWT(LL2,LH2,HL2,HH2)

三、小波池化

Wavelet Pooling小波池化的思考
小波变换和曲波变换用于池化层

以文献[1-2]为例,详细介绍小波池化。

1. 引言

池化是舍弃信息来实现正则化的效果。传统的 Max PoolingAverage Pooling都有一些局限性。Max pooling 是一个有效的池化方法,但可能过于简单;Average Pooling会产生模糊。当主要的特征幅度值低于不重要的特征时,重要的特征在max pooling中就丢失了。而Average Pooling接收了幅值大的特征和幅值小的特征,会稀释幅值大的特征。具体如下图所示:

在这里插入图片描述

并且,Average Pooling或Max Pooling是不可逆的。一旦进行平均池化或者最大池化,新的特征空间无法保留原先特征空间的所有信息。而小波池化是可逆的,能恢复所有的原始特征。

2. DWT与IDWT网络层

对于DWT和IDWT网络层的关键在于数据的前向传播(forward propagations)和后向传播(backward propagations)。本章节以1D正交小波和1D数据为例,分析DWT和IDWT。同理,可以推广到其他小波和2D/3D数据,只有细微的变化。

2.1 前向传播(Forward propagation)

对于1D数据 x = { s j } j ∈ Z \mathbf{x}=\{s_{j}\}_{j\in\mathbb{Z}} x={sj}jZ,通过DWT的低通滤波(low-pass filters)分解为低频成分 x l o w = { x k ( l o w ) } k ∈ Z \mathbf{x}_\mathrm{low}=\{\mathbf x_{k}^{(\mathrm{low})}\}_{k\in\mathbb{Z}} xlow={xk(low)}kZ,通过DWT的高通滤波(high-pass filters)分解为高频成分 x h i g h = { x k ( h i g h ) } k ∈ Z \mathbf{x}_\mathrm{high}=\{\mathbf x_{k}^{(\mathrm{high})}\}_{k\in\mathbb{Z}} xhigh={xk(high)}kZ
{ x k ( l o w ) = ∑ j l j − 2 k x j , x k ( h i g h ) = ∑ j h j − 2 k x j , ( 1 ) \left.\left\{\begin{array}{c}\mathbf x_{k}^{(\mathrm{low})}=\sum_jl_{j-2k}x_j,\\\mathbf x_{k}^{(\mathrm{high})}=\sum_jh_{j-2k}x_j,\end{array}\right.\right. \quad (1) {xk(low)=jlj2kxj,xk(high)=jhj2kxj,(1)
其中, l = { l k } k ∈ Z \boldsymbol{l}=\{l_{k}\}_{k\in\mathbb{Z}} l={lk}kZ h = { h k } k ∈ Z \boldsymbol{h}=\{h_{k}\}_{k\in\mathbb{Z}} h={hk}kZ 分别表示正交小波(orthogonal wavelet)的低通滤波(low-pass filters)和高通滤波(high-pass filters)。由 公式 ( 1 ) 公式(1) 公式(1) 可知,DWT包含两个过程:过滤下采样

IDWT使用 s l o w , s h i g h \mathbf{s}_\mathrm{low},\mathbf{s}_\mathrm{high} slow,shigh 重构 s \mathbf{s} s,公式表达如下:
x j = ∑ k ( l j − 2 k x k ( l o w ) + h j − 2 k x k ( h i g h ) ) . ( 2 ) x_j=\sum_k\left(l_{j-2k}\mathbf x_{k}^{(\mathrm{low})}+h_{j-2k}\mathbf x_{k}^{(\mathrm{high})}\right). \quad (2) xj=k(lj2kxk(low)+hj2kxk(high)).(2)
用矩阵和向量表示, 公式 ( 1 ) 公式(1) 公式(1) 公式 ( 2 ) 公式(2) 公式(2) 可以重写为:
x l o w = L x , x h i g h = H x , ( 3 ) x = L T x l o w + H T x h i g h , ( 4 ) \begin{aligned}\mathbf{x}_\mathrm{low}&=\mathbf{L}\mathbf{x},\quad\mathbf{x}_\mathrm{high}=\mathbf{H}\mathbf{x},\quad&(3)\\\mathbf{x}&=\mathbf{L}^T\mathbf{x}_\mathrm{low}+\mathbf{H}^T\mathbf{x}_\mathrm{high},\quad&(4)\end{aligned} xlowx=Lx,xhigh=Hx,=LTxlow+HTxhigh,(3)(4)
其中
L = ( ⋯ ⋯ ⋯ ⋯ l − 1 l 0 l 1 ⋯ ⋯ l − 1 l 0 l 1 ⋯ ⋯ ⋯ ) , ( 5 ) \left.\mathbf{L}=\left(\begin{array}{ccccccc}\cdots&\cdots&\cdots&&&&\\\cdots&l_{-1}&l_0&l_1&\cdots&&\\&\cdots&l_{-1}&l_0&l_1&\cdots\\&&&&\cdots&\cdots\end{array}\right.\right),\quad(5) L= l1l0l1l1l0l1 ,(5)

H = ( ⋯ ⋯ ⋯ ⋯ h − 1 h 0 h 1 ⋯ ⋯ h − 1 h 0 h 1 ⋯ ⋯ ⋯ ) . ( 6 ) \left.\mathbf{H}=\left(\begin{array}{ccccccc}\cdots&\cdots&\cdots&&&\\\cdots&h_{-1}&h_0&h_1&\cdots&\\&&\cdots&h_{-1}&h_0&h_1&\cdots\\&&&&\cdots&\cdots\end{array}\right.\right).(6) H= h1h0h1h1h0h1 .(6)

对于2D数据 X \mathbf{X} X,2D DWT通常对其每一行(row) 和每一列(column)进行1D DWT操作,也就是:
X l l = L X L T , ( 7 ) X l h = H X L T , ( 8 ) X h l = L X H T , ( 9 ) X h h = H X H T , ( 10 ) \begin{gathered} \mathbf{X}_{ll} =\mathbf{L}\mathbf{X}\mathbf{L}^{T}, \left(7\right) \\ \mathbf{X}_{lh} =\mathbf{HXL}^{T}, \left(8\right) \\ \mathbf{X}_{hl} =\mathbf{LXH}^{T}, \left(9\right) \\ \mathbf{X}_{hh} =\mathbf{HXH}^{T}, \left(10\right) \end{gathered} Xll=LXLT,(7)Xlh=HXLT,(8)Xhl=LXHT,(9)Xhh=HXHT,(10)
对于2D IDWT操作,公式表达如下:
X = L T X l l L + H T X l h L + L T X h l H + H T X h h H . ( 11 ) \mathbf{X}=\mathbf{L}^T\mathbf{X}_{ll}\mathbf{L}+\mathbf{H}^T\mathbf{X}_{lh}\mathbf{L}+\mathbf{L}^T\mathbf{X}_{hl}\mathbf{H}+\mathbf{H}^T\mathbf{X}_{hh}\mathbf{H}.\quad(11) X=LTXllL+HTXlhL+LTXhlH+HTXhhH.(11)

在 2D DWT的输出中, X l l \mathbf{X}_{ll} Xll 是输入 X \mathbf{X} X的低频成分,代表主要的信息,包括目标的基本结构;对应的 X l h , X h l , X h h \mathbf{X}_{lh}, \mathbf{X}_{hl}, \mathbf{X}_{hh} Xlh,Xhl,Xhh 是三个高频成分,其保存了输入 X \mathbf{X} X水平(horizontal)、垂直(vertical)、对角线(diagonal)的细节信息。

2.2 反向传播(Backward propagation)

公式 ( 3 ) − ( 4 ) (3)-(4) (3)(4) 表示1D DWT和IDWT的前向传播。1D DWT的反向传播与梯度 ∂ x l o w ∂ x \frac{\partial \mathbf{x}_\mathrm{low}}{\partial \mathbf{x}} xxlow ∂ x h i g h ∂ x \frac{\partial \mathbf{x}_\mathrm{high}}{\partial \mathbf{x}} xxhigh密切相关,可以从公式(3) 中推导出:

∂ x l o w ∂ x = L T , ∂ x h i g h ∂ x = H T . ( 12 ) \frac{\partial \mathbf{x}_\mathrm{low}}{\partial \mathbf{x}} = \mathbf{L}^T, \frac{\partial \mathbf{x}_\mathrm{high}}{\partial \mathbf{x}} = \mathbf{H}^T.\quad(12) xxlow=LT,xxhigh=HT.(12)

类似的,1D IDWT的反向传播与梯度 ∂ x l o w ∂ x \frac{\partial \mathbf{x}_\mathrm{low}}{\partial \mathbf{x}} xxlow ∂ x h i g h ∂ x \frac{\partial \mathbf{x}_\mathrm{high}}{\partial \mathbf{x}} xxhigh密切相关,可以从公式(4) 中推导出:

∂ x ∂ x l o w = L , ∂ x ∂ x h i g h = H . ( 13 ) \frac{\partial \mathbf{x}}{\partial \mathbf{x}_\mathrm{low}} = \mathbf{L}, \frac{\partial \mathbf{x}}{\partial \mathbf{x}_\mathrm{high}} = \mathbf{H}.\quad(13) xlowx=L,xhighx=H.(13)

对于2D DWT的反向传播可以通过梯度 ∂ X l l ∂ X ( G ) \frac{\partial X_{ll}}{\partial X}(G) XXll(G) ∂ X l h ∂ X ( G ) \frac{\partial X_{lh}}{\partial X}(G) XXlh(G) ∂ X h l ∂ X ( G ) \frac{\partial X_{hl}}{\partial X}(G) XXhl(G) ∂ X h h ∂ X ( G ) \frac{\partial X_{hh}}{\partial X}(G) XXhh(G)实现,公式表达如下:
∂ X l l ∂ X ( G ) = L T G L , ( 14 ) ∂ X l h ∂ X ( G ) = H T G L , ( 15 ) ∂ X h l ∂ X ( G ) = L T G H , ( 16 ) ∂ X h h ∂ X ( G ) = H T G H , ( 17 ) \begin{gathered} \frac{\partial X_{ll}}{\partial X}(G) ={L}^{T}G{L}, \quad (14) \\ \frac{\partial\boldsymbol{X}_{lh}}{\partial\boldsymbol{X}}(G) ={H}^{T}G{L}, \quad (15) \\ \frac{\partial\boldsymbol{X}_{hl}}{\partial\boldsymbol{X}}(G) ={L}^{T}G{H}, \quad (16) \\ \frac{\partial X_{hh}}{\partial X}(G) ={H}^{T}G{H}, \quad (17) \end{gathered} XXll(G)=LTGL,(14)XXlh(G)=HTGL,(15)XXhl(G)=LTGH,(16)XXhh(G)=HTGH,(17)
其中, G G G 是2D DWT之后的层的反向传播输出。

类似的,对于2D IDWT的反向传播可以通过 ∂ X ∂ X l l ( G ) \frac{\partial X}{\partial X_{ll}}(G) XllX(G) ∂ X ∂ X l h ( G ) \frac{\partial X}{\partial X_{lh}}(G) XlhX(G) ∂ X ∂ X h l ( G ) \frac{\partial X}{\partial X_{hl}}(G) XhlX(G) ∂ X ∂ X h h ( G ) \frac{\partial X}{\partial X_{hh}}(G) XhhX(G)实现,公式表达如下:
∂ X ∂ X l l ( G ) = L G L T , ( 18 ) ∂ X ∂ X l h ( G ) = H G L T , ( 19 ) ∂ X ∂ X h l ( G ) = L G H T , ( 20 ) ∂ X ∂ X h h ( G ) = H G H T , ( 21 ) \begin{gathered} \frac{\partial\boldsymbol{X}}{\partial\boldsymbol{X}_{ll}}(G)={L}G{L}^{T}, \quad (18) \\ \frac{\partial\boldsymbol{X}}{\partial\boldsymbol{X}_{lh}}(G)={H}G{L}^{T}, \quad (19) \\ \frac{\partial\boldsymbol{X}}{\partial\boldsymbol{X}_{hl}}(G)={L}G{H}^{T}, \quad (20) \\ \frac{\partial\boldsymbol{X}}{\partial\boldsymbol{X}_{hh}}(G)={H}G{H}^{T}, \quad (21) \end{gathered} XllX(G)=LGLT,(18)XlhX(G)=HGLT,(19)XhlX(G)=LGHT,(20)XhhX(G)=HGHT,(21)
其中, G G G 是2D IDWT之后的层的反向传播输出。

3D DWT和IDWT的反向传播过程稍微复杂一点,但与1D/2D DWT和IDWT类似。本文使用有限滤波器,例如Haar小波,它的低通滤波和高通滤波可以表示为: l = 1 2 { 1 , 1 } \mathbf{l}=\frac{1}{\sqrt{2}}\{1,1\} l=2 1{1,1} h = 1 2 { 1 , − 1 } \mathbf{h}=\frac{1}{\sqrt{2}}\{1,-1\} h=2 1{1,1}

在网络层中,对于多通道数据进行逐通道的DWT和IDWT操作。

3. WaveCNets网络模型

3.1 基于小波的通用去噪方法

给定一个2D的噪声数据 X \mathbf{X} X,随机噪声主要表现在其高频成分中。如下图所示,基于小波的通用去噪方法[3],包括三个步骤:

  1. 使用DWT将带噪声的数据分解为低频成分 X l l \mathbf{X}_{ll} Xll 和高频成分 X l h , X h l , X h h \mathbf{X}_{lh}, \mathbf{X}_{hl}, \mathbf{X}_{hh} Xlh,Xhl,Xhh
  2. 使用滤波器对高频成分进行过滤;
  3. 使用IDWT对处理后的高频和低频成分进行重构。

在这里插入图片描述

3.2 最简单的基于去噪方法的小波

本文选择最简单的基于去噪方法的小波,也就是丢弃高频成分,如下图所示:

在这里插入图片描述

其中, D W T l l \mathrm{DWT}_{ll} DWTll 表示将特征图映射到低频成分的转换。

3.3 基于小波的下采样方法

本文通过用 D W T l l \mathrm{DWT}_{ll} DWTll 替换传统的下采样,设计出WaveCNets网络模型。如下图所示,(a) 表示传统的下采样方法,(b) 表示基于小波的下采样方法。

在这里插入图片描述

在WaveCNets网络中,将max-poolingaverage-pooling 直接替换为 D W T l l \mathrm{DWT}_{ll} DWTll 。同时,将 strided-convolution卷积替换为步长为1的卷积,也就是:
MaxPool s = 2 → DWT l l , ( 14 ) Conv s = 2 → DWT l l ∘ Conv s = 1 , ( 15 ) AvgPool s = 2 → DWT l l , ( 16 ) \begin{aligned}\text{MaxPool}_{s=2}&\to\text{DWT}_{ll},\quad&(14)\\\text{Conv}_{s=2}&\to\text{DWT}_{ll}\circ\text{Conv}_{s=1},\quad&(15)\\\text{AvgPool}_{s=2}&\to\text{DWT}_{ll},\quad&(16)\end{aligned} MaxPools=2Convs=2AvgPools=2DWTll,DWTllConvs=1,DWTll,(14)(15)(16)
其中 M a x p o o l s \mathrm {Maxpool_s} Maxpools C o n v s \mathrm {Conv_s} Convs A v g P o o l s \mathrm {AvgPool_s} AvgPools 分别表示 max-poolingstrided-convolutionaverage-poolings表示步长(stride)。

3.4 WaveCNets模型的优势

D W T l l \mathrm{DWT}_{ll} DWTll 对特征图进行去噪,移除高频成分,特征图尺寸减半。 D W T l l \mathrm{DWT}_{ll} DWTll 输出的低频成分,保存了特征图的主要信息,并提取出可识别的特征。在WaveCNets下采样过程中, D W T l l \mathrm{DWT}_{ll} DWTll 可以抵抗噪声的传播,有利于维持特征图中目标的基本结构。因此, D W T l l \mathrm{DWT}_{ll} DWTll 可以加快深度网络的训练,有利于更好的噪声鲁棒性提高分类模型的精度

四、相关经验

1. (TensorFlow)代码实现

Tensorflow实现小波池化层

五、参考文献

[1] Li Q, Shen L, Guo S, et al. Wavelet integrated CNNs for noise-robust image classification[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 7245-7254.

[2] Li Q, Shen L, Guo S, et al. Wavecnet: Wavelet integrated cnns to suppress aliasing effect for noise-robust image classification[J]. IEEE Transactions on Image Processing, 2021, 30: 7074-7089.

[3] Donoho D L. De-noising by soft-thresholding[J]. IEEE transactions on information theory, 1995, 41(3): 613-627.

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

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

相关文章

C#,数据检索算法之插值搜索(Interpolation Search)的源代码

数据检索算法是指从数据集合(数组、表、哈希表等)中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文提供插值搜索(Interpolation Search)的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.…

极限【高数笔记】

【分类】分为了两大类,一个是数列的极限,一个是函数的极限 【数列的极限】 1.定义: 简单来讲,就是,当n无限趋近于无穷时,数列{an}无限趋近一个常数A,此时,常数A就是它们此时情况下的…

三极管实际电路设计

上图电路有个致命缺陷。那就是Q2正常我们是用NPN三极管。而上图用了PNP。导致MOS管高低电平都无法关闭。 解决方法: 把R2减小为200欧、或者330欧姆。 (因为MOS打开需要压差,把SG端压差减小到规定以下就可以关闭)。 同时增大R1为2…

RustDesk私有化部署,自建远程桌面搭建教程

以linux操作系统为例: 解压安装 # 使用wget进行下载1.1.8-2版本(最新版本可以看上述发布地址) wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip # 使用unzip解压 unzip rust…

防火墙综合实验

实验需求: 1、生产区在工作时间内可以访问服务器区,仅可以访问http服务器。 2、办公区全天可以访问服务器区,其中,10.0.2.20可以访问FTP服务器和HTTP服务器,10.0.2.10仅可以ping通10.0.3.10。 3、办公区在访问服务器…

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models导读

通过生成一系列中间推理步骤(即“思维链”)显著提高大型语言模型进行复杂推理的能力 这篇论文探讨了如何通过生成一系列中间推理步骤(即“思维链”)显著提高大型语言模型进行复杂推理的能力。研究人员使用一种简单的方法——思维…

BAT学习笔记:常用指令详解及图示

文章目录 一、 (关闭本行命令回显)详解及图示二、echo off( 关闭命令回显)详解及图示三、%VAR_NAME% (取变量值)详解四、set (设置变量)详解及图示五、if (条件判断) 详解及图示六、not (条件取反&#xff…

Elasticsearch8.11集群部署

集群就是多个node统一对外提供服务,避免单机故障带来的服务中断,保证了服务的高可用,也因为多台节点协同运作,提高了集群服务的计算能力和吞吐量。ES是一个去中心化的集群,操作一个节点和操作一个集群是一样的&#xf…

podman+centos和docker+alpine中作性能对比遇到的问题及解决

1.dockeralpine中遇到这个问题 这是由于缺少相关的配置和依赖造成的 通过以下命令在alpine中安装相关配置 apk add --no-cache build-base cairo-dev cairo cairo-tools jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev 2.alpine中python找…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下,拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案,助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

使用代码取大量2*2像素图片各通道均值,存于Excel文件中。

任务是取下图RGB各个通道的均值及标签(R, G,B,Label),其中标签由图片存放的文件夹标识。由于2*2像素图片较多,所以将结果放置于Excel表格中,之后使用SVM对他们进行分类。 from PIL import Image import os …

STM32 freertos 使用软件模拟串口uart

如题,为什么要这样做? 最近做的一个项目上使用了74HC595作为指示灯板使用; 这个灯板与驱动板是通过排线连接,排线约25cm长; 在实验室测试一切正常,发到客户手上使用就出现了某个LED跳动情况;…

JOSEF约瑟 静态中间继电器 RZY-600D 110VDC 六常开 导轨安装

RZ-D系列中间继电器 系列型号: RZY-004D中间继电器 RZL-004D中间继电器 RZY-022D中间继电器 RZL-022D中间继电器 RZY-112D中间继电器 RZL-112D中间继电器 RZY-202D中间继电器 RZL-202D中间继电器 RZY-002D中间继电器 RZL-002D中间继电器 RZY-060D中间继电器 RZL-060…

SpringCloud-Knife4j文档聚合

在微服务架构下,如果给每个微服务都配置文档,那么每个微服务的接口文档都有自己独立的访问地址,这样要一个个打开每个微服务的文档非常麻烦。一般我们会采用聚合的办法,将所有微服务的接口整合到一个文档中,具体做法有…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 本篇文章是对已有一篇文章的整理归纳,并对文章中…

[ESP32]在Thonny IDE中,如何將MicroPython firmware燒錄到ESP32開發板中?

[ESP32 I MicroPython] Flash Firmware by Thonny(4.1.4) IDE 正常安裝流程,可參考上述影片。然而,本篇文章主要是紀錄安裝過程遇到的bug, 供未來查詢用,也一併供有需要的同好參考。 問題:安裝後,Thonny互動介面顯示一堆亂碼和co…

新建react项目,react-router-dom配置路由,引入antd

提示:reactrouter6.4版本,与reactrouter5.0的版本用法有区别,互不兼容需注意 文章目录 前言一、创建项目二、新建文件并引入react-router-dom、antd三、配置路由跳转四、效果五、遇到的问题六、参考文档总结 前言 需求:新建react项…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python进⾏系统监控?

如何使⽤Python进⾏系统监控? 使⽤Python进⾏系统监控涉及以下⼀般步骤: 选择监控指标: ⾸先,确定希望监控的系统指标,这可以包括 CPU 利⽤率、内存使⽤情况、磁盘空间、⽹络流量、服务可⽤性等。选择监控⼯具&#x…

tf卡被格式化怎么恢复里面的数据?恢复指南在此

在日常生活中,我们经常使用TF卡来存储各种数据,如照片、视频、文档等。然而,有时候我们会误将TF卡格式化,导致其中的数据丢失。为了挽救这些宝贵的数据,我们需要采取一些措施来进行恢复。本文将为你介绍如何恢复TF卡中…

架构整洁之道——价值维度与编程范式

1 设计与架构究竟是什么 结论:二者没有任何区别,一丁点区别都没有。 架构图里实际上包含了所有底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个架构文档。底层设计细节和高层架构信…