关于深度学习:深度学习与CV教程9-典型CNN架构-AlexnetVGGGooglenetRestnet等

  • 作者:韩信子@ShowMeAI
  • 教程地址:http://www.showmeai.tech/tutorials/37
  • 本文地址:http://www.showmeai.tech/article-detail/268
  • 申明:版权所有,转载请分割平台与作者并注明出处
  • 珍藏ShowMeAI查看更多精彩内容

本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频能够在 这里 查看。更多材料获取形式见文末。


引言

ShowMeAI在文章 深度学习与CV教程(5) | 卷积神经网络 中曾经给大家介绍过CNN的外围结构组件,在本篇中,咱们给大家介绍目前最宽泛应用的典型卷积神经网络构造。包含经典构造(AlexNet、VGG、GoogLeNet、ResNet)和一些新的构造(Network in Network、Resnet改良、FractalNet、DenseNet等)

对于典型CNN构造的具体常识也能够参考ShowMeAI的 深度学习教程 | 吴恩达专项课程 · 全套笔记解读 中的文章 经典CNN网络实例详解

本篇重点

  • 经典CNN架构

    • AlexNet
  • VGG
  • GoogLeNet
  • ResNet
  • 其余构造

    • NIN(Network in Network)
  • ResNet改良
  • FractalNet
  • DenseNet
  • NAS

1.经典架构

1.1 AlexNet

首先回顾一下在数字辨认畛域有巨大成功的 LeNet-5,该网络结构为 [CONV-POOL-CONV-POOL-FC-FC]。卷积层应用 \(5 \times 5\) 的卷积核,步长为 \(1\);池化层应用 \(2 \times 2\) 的区域,步长为 \(2\);前面是全连贯层。如下图所示:

而2012年的 AlexNet 是第一个在 ImageNet 大赛上夺冠的大型 CNN 网络,它的构造和 LeNet-5 很类似,只是层数变多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8],共有5个卷积层、3个池化层、2个归一化层和三个全连贯层。如下图所示:

  • 输出:\(227 \times 227 \times 3\) 的图片;
  • CONV1:应用 96 个 \(11 \times 11\) 大小的卷积核,步长为 \(4\),因为 \((227-11)/4+1=55\),所以输入的尺寸为 \(55 \times 55 \times 96\),共有 \(96 \times 11 \times 11 \times 3\) 个参数;
  • POOL1:应用 \(3 \times 3\)的池化区域,步长为 \(2\),因为 \((55-3)/2+1=27\),所以输入为 \(27 \times 27 \times 96\),没有参数;
  • NORM1:归一化后依然是 \(27 \times 27 \times 96\);
  • CONV2:应用 256 个 \(5 \times 5\) 的卷积核,stride \(1\)、pad \(2\) ,\((27+2 \times 2-5)+1=27\),所以输入为 \(27 \times 27 \times 256\);
  • POOL2: \(3 \times 3\) filters,stride \(2\) ,\((27-3)/2+1=13\),所以输入为 \(13 \times 13 \times 256\);
  • NORM2:\(13 \times 13 \times 256\);
  • CONV3:384个 \(3 \times 3\) filters,stride \(1\), pad \(1\),输入 \([13 \times 13 \times 384]\(;
  • CONV4:384个 \(3 \times 3\) filters,stride \(1\), pad \(1\),输入 \([13 \times 13 \times 384]\(;
  • CONV5:256个 \(3 \times 3\) filters,stride \(1\), pad \(1\),输入 \([13 \times 13 \times 256]\(;
  • POOL3: \(3 \times 3\) filters,stride \(2\) 输入为 \([6 \times 6 \times 256]\(;
  • FC6:\(4096\) 个神经元,输入为 \([4096]\(;
  • FC7:\(4096\) 个神经元,输入为 \([4096]\(;
  • FC8:\(1000\) 个神经元,(class scores)输入为 \([1000]\(。

之所以在上图中分成高低两个局部,是因为过后的GPU容量太小,只能用两个来实现。还有一些细节是:

  • 第一次应用 ReLU 函数
  • 应用归一化层(当初不罕用了)
  • 数据加强
  • dropout 0.5
  • batch size 128
  • SGD Momentum 0.9
  • 学习率1e-2, 当验证准确率安稳时,手动缩小 10
  • L2权重衰减是 5e-4
  • 7 CNN ensemble:\(18.2\% \to 15.4\%\(

AlexNet夺得ImageNet大赛2012的冠军时,将正确率简直进步了10%,2013年的冠军是ZFNet,和AlexNet应用雷同的网络架构,只是对超参数进一步调优:

  • CONV1:将 (11×11 stride 4) 改为 (7×7 stride 2) ;
  • CONV3,4,5:不再应用384, 384, 256个滤波器,而是应用 512, 1024, 512个。

这样将错误率从 \(16.4\%\( 升高到 \(11.7\%\(

上面介绍14年的冠亚军GoogLeNet(22层网络)和VGG(19层网络)。

1.2 VGG

VGG 绝对于AlexNet应用更小的卷积核,层数也更深。VGG有16层和19层两种。卷积核只应用 \(3 \times 3\),步长为 \(1\),pad为 \(1\);池化区域 \(2 \times 2\),步长为2。

那么为什么应用 \(3 \times 3\)的小卷积核呢?

  • 多个卷积层重叠时,第一层的感触野是 \(3 \times 3\),第二层的感触野是 \(5 \times 5\) (感触原图像),这样重叠三层的无效感触野就变成 \(7 \times 7\);
  • 多个 \(3 \times 3\) 的卷基层比一个大尺寸卷积核的卷积层有更多的非线性(更多层的非线性函数),使得裁决函数更加具备裁决性;
  • 多个 \(3 \times 3\) 的卷积层比一个大尺寸的卷积核有更少的参数,假如卷积层的输出和输入的特色图大小雷同为 \(C\(,那么三个 \(3 \times 3\) 的卷积层参数个数\(3 \times (3 \times 3 \times C \times C)=27C2\);一个 \(7 \times 7\) 的卷积层参数为 \(7 \times 7 \times C \times C=49C2\);所以能够把三个 \(3 \times 3\)的filter看成是一个 \(7 \times 7\) filter的合成(中间层有非线性的合成, 并且起到隐式正则化的作用)。

上面看一下VGG-16的参数和内存应用状况:

  • 总内存占用:24M * 4 bytes,每张图片约96MB,加上反向流传须要乘以2;大多数内存都用在了后面几层卷积层;
  • 总参数个数:138M,大多都在全连贯层,全连贯层的第一层就有100多M。

VGG网络的一些细节是:

  • 14年ImageNet大赛分类第二名,定位第一名
  • 训练过程和AlexNet很靠近
  • 不应用部分响应归一化
  • 有16层和19层两种,19层成果略微好一些,然而占用更多内存,16层利用的更宽泛;
  • 应用模型集成
  • FC7的特色泛化十分好,能够间接用到其余工作中

上面来看一下分类的第一名,GoogLeNet。

1.3 GoogLeNet

对于GoogLeNet/Inception的具体常识也能够参考ShowMeAI的深度学习教程 | 吴恩达专项课程 · 全套笔记解读中的文章经典CNN网络实例详解

先阐明 GoogLeNet 的一些细节:

  • 网络有22层,比VGG深一些
  • 为了高效的计算,应用 「Inception」 模块
  • 不应用全连贯层
  • 只有500万个参数,比 AlexNet 少了12倍
  • 14年分类的冠军(6.7% top 5 error)

1) Inception Module

「Inception」模块是一种设计的比拟好的局域网拓扑构造,而后将这些模块重叠在一起。这种拓扑构造对来自前一层的输出,并行利用多种不同的滤波操作,比方 \(1 \times 1\) 卷积、 \(3 \times 3\) 卷积、 \(5 \times 5\) 卷积和 \(3 \times 3\) 池化。而后将所有滤波器的输入在深度上串联在一起。

如下图所示:

然而这种构造的一个问题是计算复杂度大大增加。如下图所示是一个网络参数计算示例:

输出为 \(28 \times 28 \times 256\),而串联后的输入为 \(28 \times 28 \times 672\)。(假如每个滤波操作都通过零填充放弃输出尺寸)并且运算破费也十分高:

  • [1×1 conv, 128] \(28 \times 28 \times 128 \times 1 \times 1 \times 256\) 次乘法运算;
  • [3×3 conv, 192] \(28 \times 28 \times 192 \times 3 \times 3 \times 256\) 次;
  • [5×5 conv, 96] \(28 \times 28 \times 96 \times 5 \times 5 \times 256\) 次。

总计:854M次乘法运算。

因为池化操作会放弃原输出的深度,所以网络的输入肯定会减少深度。

解决办法是在进行卷积操作前增加一个「瓶颈层」,该层应用 \(1 \times 1\) 卷积,目标是保留原输出空间尺寸的同时,减小深度,只有卷积核的数量小于原输出的深度即可。

应用这种构造,同样的网络参数设置下,计算量会缩小很多:

最终失去的输入为 \(28 \times 28 \times 480\)。此时总运算量为:

  • [1×1 conv, 64] \(28 \times 28 \times 64 \times 1 \times 1 \times 256\)
  • [1×1 conv, 64] \(28 \times 28 \times 64 \times 1 \times 1 \times 256\)
  • [1×1 conv, 128] \(28 \times 28 \times 128 \times 1 \times 1 \times 256\)
  • [3×3 conv, 192] \(28 \times 28 \times 192 \times 3 \times 3 \times 64\)
  • [5×5 conv, 96] \(28 \times 28 \times 96 \times 5 \times 5 \times 64\)
  • [1×1 conv, 64] \(28 \times 28 \times 64 \times 1 \times 1 \times 256\)

总计:\(358M\)。缩小了一倍多。

2) 残缺构造

Inception module重叠成垂直构造,这里不便形容,将模型程度搁置:

  • 蓝色局部主干网:

Input – Conv 7×7+2(S) – MaxPool 3×3+2(S) – LocalRespNorm – Conv 1×1+1(V) – Conv 3×3+1(S) – LocalRespNorm – MaxPool 3×3+2(S)

含参数的层只有3个卷积层;

  • 红色局部 Inception module 重叠:

    • 并行层只算一层,所以一个 Inception module 只有两层,共有 9 个雷同的模块 18 层。
  • 绿色局部的输入:

    • 移除低廉的全连贯层,只留一个分类用的 FC。
    • AveragePool 7×7+1(V) – FC – Softmax – Output

所以含参数的层总计 \(3+18+1 = 22\) 层。

此外,橙色局部的层不计入总层数,这两块的构造都是:AveragePool 5×5+3(V) – Conv 1×1+1(S) – FC – FC – Softmax – Output。

原论文对于橙色辅助局部的形容是:

「该绝对较浅的网络在此分类工作上的弱小体现表明,网络中间层产生的特色应该是十分有区别性的。 通过增加连贯到这些中间层的辅助分类器,咱们冀望在分类器的较低阶段中激励辨别,减少回传的梯度信号,并提供额定的正则化。 这些辅助分类器采纳较小的卷积核,置于第三和第六个Inception module的输入之上。 在训练期间,它们的损失会加到折扣权重的网络总损失中(辅助分类的损失加权为0.3)。 在预测时,这些辅助网络被抛弃。」

1.4 ResNet

对于ResNet的具体常识也能够参考ShowMeAI的深度学习教程 | 吴恩达专项课程 · 全套笔记解读中的文章经典CNN网络实例详解

从2015年开始,神经网络的层数爆发式地增长,比方驰名的ResNet有152层。

如下图所示,15-17年的冠军网络都有152层之深。

ResNet 是一种十分深的网络,应用了残差连贯。细节是:

  • 152层
  • ILSVRC’15优胜者(3.57% top 5 error)
  • 横扫了所有ILSVRC’15 和COCO’15分类/检测的比赛!

体现这么好的 ResNet 并不仅仅是因为深,钻研表明一个 56 层的卷积层重叠网络训练误差和测试误差都比一个 20 层的网络要大,并且不是过拟合的起因,而是更深的网络更难训练和优化。

一个更深的模型至多能和一个较浅的模型体现一样好(学习能力会更强),如果想把一个较浅的层变成较深的层,能够用上面的形式来构建:将原来比拟浅的层拷贝到较深的层中,而后增加一些等于自身的映射层。这样较深的模型能够更好的学习。

1) 核心思想

ResNet通过应用多个有参层来学习输出与输入输出之间的残差映射( residual mapping ) ,而非像个别CNN网络(如AlexNet/VGG等)那样应用有参层来间接学习输入输出之间的底层映射( underlying mapping)

① 残差学习(Residual Learning)

若将输出设为X,将某一有参网络层映射设为 \(H\),那么以 \(X\) 为输出的该层的输入将为 \(H(X)\)。通常的 CNN 网络会间接通过训练学习出参数函数H的表达式,从而间接失去 \(X\) 到 \(H(X)\) 的映射。

残差学习则是致力于应用多个有参网络层来学习输出到输出、输入间的残差 \((H(X) – X)\) 的映射,即学习 \(X \to (H(X) – X)\) ,而后加上X的本身映射(identity mapping)

也就是说网络的输入依然是 \(H(X) – X + X = H(X)\),只是学习的只是 \((H(X) – X)\),\(X\) 局部间接是自身映射。

② 本身映射(Identity Mapping)

残差学习单元通过自身映射的引入在输出、输入之间建设了一条间接的关联通道,从而使得弱小的有参层集中精力学习输出、输入之间的残差。

个别咱们用 \(F(X, W_i)\) 来示意残差映射,那么残差学习单元的输入即为: \(Y = F(X, W_i) + X\)。

  • 当输出、输入通道数雷同时,天然能够间接应用 \(X\) 进行相加。
  • 当它们之间的通道数目不同时,咱们就须要思考建设一种无效的本身映射函数从而能够使得解决后的输出 \(X\) 与输入 \(Y\) 的通道数目雷同即 \(Y = F(X, W_i) + W_sX\)。

当X与Y通道数目不同时,有两种本身映射形式。

  • ① 简略地将 \(X\) 绝对 \(Y\) 缺失的通道间接补零从而使其可能绝对齐
  • ② 通过应用 \(1 \times 1\) 的卷积来示意 \(W_s\) 映射从而使得最终输出与输入的通道统一。

对应的论文和试验表明,学习残差比间接学习输出到输入的映射要更加容易,收敛速度也更快,同时从最终分类精度成果上看也有晋升。

咱们设想1个极其极其状况,如果本身映射是最优的,那么将残差设为零相比应用一堆非线性层做本身映射显然更容易。

2) 残缺构造

残缺的网络结构如下:

  • 残差块重叠
  • 每个残差块有两个 \(3 \times 3\) 卷积层
  • 周期性的应用两倍的卷积核数量,降采样通过设置步长为 \(2\)
  • 在网络开始处有 \(7 \times 7\) 的卷积层和最大池化层(步长 \(2\))
  • 在网络的最初不应用全连贯层 (只有一个用于1000个分类的FC)
  • 在最初一个卷积层后应用全局的均匀池化
  • 总共的深度有34、50、101或152

对于ResNet-50+的网络,为进步计算效率,应用相似GoogLeNet的「瓶颈层」。

具体说,它也是通过应用 \(1 \times 1\) 卷积来缩减或扩张特色图维度,从而使得 \(3 \times 3\) 卷积的卷积核数目不受上一层输出的影响,对应的输入也不会影响到下一层,这种设计节俭计算工夫,且不影响最终的模型精度。

3) ResNet网络训练

ResNet的理论训练的一些细节如下:

  • 每个 CONV 层后应用批量归一化
  • 权重应用 He 初始化
  • 更新形式应用 SGD + Momentum (0.9)
  • 学习率为 0.1, 验证错误率不变时除 10
  • Mini-batch size 为 256
  • 权重衰减是 1e-5
  • 未应用 dropout

理论的训练成果为能够重叠很多的层而不使准确率降落:ImageNet上152层网络,在CIFAR上1202层网络,体现都很好。通过构造革新后,和料想中的统一,网络越深,训练准确率越高。

ResNet横扫了2015年所有的奖项,第一次超过人类的识别率。

2.几种网络的比照

  • 左图:通过 Top1 准确率来比拟各种网络的准确性
  • 右图:是不同网络的运算复杂度,横轴为计算量,圆圈大小示意内存占用。其中 Inception-v4 是 Resnet + Inception

从图里能够看出:

  • Inception-v4 具备最高的准确率
  • VGG 内存占用最大,计算量最多
  • GoogLeNet 最高效,准确率较高,运算复杂度较小
  • AlexNet 计算量较小但内存占用较大,准确率也低
  • ResNet 准确率较高,效率取决于模型

前向流传工夫和功率耗费比照如下:

3.其余网络架构

3.1 Network in Network (NiN)

Network In Network发表于 ICLR 2014,由新加坡国立大学(NUS)提出,也是一个常常被大家提到的经典CNN构造,它的次要特点如下:

  • 在每个卷积层内的Mlpconv层具备「Micronetwork」用于计算部分区域的更形象的特色;
  • Micronetwork应用多层感知器(FC,即 \(1 \times 1\)卷积层)
  • GoogLeNet和ResNet「瓶颈」层的先驱

3.2 ResNet的改良

1) Identity Mappings in Deep Residual Networks

  • ResNet创造者本人改良了残差块设计
  • 创立更间接的门路(将激活函数挪动到残差的映射门路),以便在整个网络中流传信息
  • 更好的性能

2)Wide Residual Networks

  • 相比「深度」,认为「残差」是外围
  • 应用更宽的残差块(\(F \times k\( 个滤波器代替每层中的F个滤波器)
  • 50 层 Wide ResNet 优于 152 层原始 ResNet
  • 减少宽度而不是深度更具计算效率(可并行化)

3) ResNeXt

  • ResNet 创建者对构造革新
  • 通过多个平行门路减少残差块的宽度(cardinality)
  • 与 Inception 模块类似的并行门路
  • 单个分支「变窄」

4)Deep Networks with Stochastic Depth

  • 动机:通过缩短网络缩小梯度隐没和网络训练工夫
  • 在每次训练过程中随机抛弃一个层子集
  • 具备本身映射性能的旁路,抛弃的层权重为1,恒等映射
  • 在测试时应用残缺的深度网络

5)Network Ensembling(Fusion)

  • 多尺度集成 Inception、Inception-Resnet、Resnet、Wide Resnet模型
  • ILSVRC’16分类获胜者

6)Squeeze-and-Excitation Networks (SENet)

  • 增加「特色从新校准」模块,该模块学习自适应从新加权特色图
  • 全局信息(全局均匀池化层)+ 2个FC层,用于确定特色图权重,即「特色从新校准」模块
  • ILSVRC’17分类获胜者(应用ResNeXt-152作为基础架构)

3.3 FractalNet

  • 动机:认为从浅层到深层无效地过渡最重要,残差示意不是最重要的
  • 具备浅和深门路输入的分形构造
  • 训练时随机摈弃子门路
  • 测试时应用残缺网络

3.4 Densely Connected Convolutional Networks

  • 密集块,其中每个层以前馈形式连贯到之后的每个层
  • 加重梯度隐没、增强特色流传、激励特色重用

3.5 Efficient Networks —— SqueezeNet

对于SqueezeNet和其余轻量化网络感兴趣的同学也能够参考ShowMeAI的计算机视觉教程)中的文章轻量化CNN架构(SqueezeNet,ShuffleNet,MobileNet等)

  • 轻量化网络
  • \(1 \times 1\) 卷积核构建「挤压」层,进而组成Fire模块,由 \(1 \times 1\)和 \(3 \times 3\)卷积核组成「扩大」层
  • ImageNet 上的 AlexNet 级精度,参数缩小50倍
  • 能够压缩到比 AlexNet 小510倍(0.5Mb参数)

3.6 Learn network architectures —— Meta-learning

1) Neural Architecture Search with Reinforcement Learning (NAS)

  • 一种「控制器」网络,能够学习设计良好网络架构(输入与网络设计绝对应的字符串)
  • 迭代:

    • 1)从搜寻空间中采样架构
    • 2)训练架构以取得相应于准确度的「处分」R
    • 3)计算样本概率的梯度,通过R进行缩放以执行控制器参数更新,减少被采样架构良好的可能性,缩小不良架构的可能性

2) Learning Transferable Architectures for Scalable Image Recognition

  • 将神经架构搜寻(NAS)利用于像ImageNet这样的大型数据集十分低廉
  • 设计能够灵便重叠的构建块(「单元」)的搜寻空间
  • NASNet:应用NAS在较小的 CIFAR-10 数据集上找到最佳的单元构造,而后将架构转移到ImageNet

4.举荐学习

能够点击 B站 查看视频的【双语字幕】版本

  • 【课程学习指南】斯坦福CS231n | 深度学习与计算机视觉
  • 【字幕+材料下载】斯坦福CS231n | 深度学习与计算机视觉 (2017·全16讲)
  • 【CS231n进阶课】密歇根EECS498 | 深度学习与计算机视觉
  • 【深度学习教程】吴恩达专项课程 · 全套笔记解读
  • 【Stanford官网】CS231n: Deep Learning for Computer Vision

5.要点总结

经典架构

  • AlexNet:开启CNN时代
  • VGG:减小卷积核尺寸、减少网络层数取得高准确率
  • GoogLeNet:引入 Inception module
  • ResNet:引入残差块,证实一般重叠层数没意义,残差重叠能够;目前利用最宽泛的网络结构

其余架构

  • NiN (Network in Network) : \(1 \times 1\)卷积先驱
  • Wide ResNet:加大ResNet的宽度而不是深度
  • ResNeXT:应用多个分支加宽ResNet
  • Stochastic Dept:Dropout层
  • SENet:自适应特色图从新加权
  • DenseNet:每个层连贯到之后的每个层
  • FractalNet:应用分形构造,不必残差
  • SqueezeNet:压缩网络,缩小参数
  • NASNet:学习网络架构

网络应用总结

  • VGG、GoogLeNet、ResNet均被宽泛应用,可在模型族中获取
  • ResNet 是以后默认最佳的抉择,也可思考 SENet
  • 钻研趋向于极深的网络
  • 钻研重心围绕层/跳过连贯的设计和改善梯度流
  • 致力钻研深度、宽度与残差连贯的必要性
  • 更近期的趋势是钻研 meta-learning

斯坦福 CS231n 全套解读

  • 深度学习与CV教程(1) | CV引言与根底
  • 深度学习与CV教程(2) | 图像分类与机器学习根底
  • 深度学习与CV教程(3) | 损失函数与最优化
  • 深度学习与CV教程(4) | 神经网络与反向流传
  • 深度学习与CV教程(5) | 卷积神经网络
  • 深度学习与CV教程(6) | 神经网络训练技巧 (上)
  • 深度学习与CV教程(7) | 神经网络训练技巧 (下)
  • 深度学习与CV教程(8) | 常见深度学习框架介绍
  • 深度学习与CV教程(9) | 典型CNN架构 (Alexnet, VGG, Googlenet, Restnet等)
  • 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNet, ShuffleNet, MobileNet等)
  • 深度学习与CV教程(11) | 循环神经网络及视觉利用
  • 深度学习与CV教程(12) | 指标检测 (两阶段, R-CNN系列)
  • 深度学习与CV教程(13) | 指标检测 (SSD, YOLO系列)
  • 深度学习与CV教程(14) | 图像宰割 (FCN, SegNet, U-Net, PSPNet, DeepLab, RefineNet)
  • 深度学习与CV教程(15) | 视觉模型可视化与可解释性
  • 深度学习与CV教程(16) | 生成模型 (PixelRNN, PixelCNN, VAE, GAN)
  • 深度学习与CV教程(17) | 深度强化学习 (马尔可夫决策过程, Q-Learning, DQN)
  • 深度学习与CV教程(18) | 深度强化学习 (梯度策略, Actor-Critic, DDPG, A3C)

ShowMeAI 系列教程举荐

  • 大厂技术实现:举荐与广告计算解决方案
  • 大厂技术实现:计算机视觉解决方案
  • 大厂技术实现:自然语言解决行业解决方案
  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程:吴恩达专项课程 · 全套笔记解读
  • 自然语言解决教程:斯坦福CS224n课程 · 课程带学与全套笔记解读
  • 深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理