Generative Cooperative Learning for Unsupervised Video Anomaly Detection
- Abstract
- [1. Introduction](#1. Introduction)
- [2. Related Work](#2. Related Work)
- [3. Method](#3. Method)
-
- [3.1. Training Data Organization](#3.1. Training Data Organization)
- [3.2. Generative Cooperative Learning](#3.2. Generative Cooperative Learning)
-
- [3.2.1 Generator Network](#3.2.1 Generator Network)
- [3.2.2 Pseudo Labels from Generator](#3.2.2 Pseudo Labels from Generator)
- [3.2.3 Discriminator Network](#3.2.3 Discriminator Network)
- [3.2.4 Pseudo Labels from Discriminator](#3.2.4 Pseudo Labels from Discriminator)
- [3.2.5 Negative Learning of Generator Network](#3.2.5 Negative Learning of Generator Network)
- [3.3. Self-Supervised Pre-training](#3.3. Self-Supervised Pre-training)
- [3.4. Anomaly Scoring](#3.4. Anomaly Scoring)
- [4. Experiments](#4. Experiments)
-
- [4.1. Comparisons with State-Of-The-Art (SOTA)](#4.1. Comparisons with State-Of-The-Art (SOTA))
- [4.2. Ablation Study and Analysis](#4.2. Ablation Study and Analysis)
- [5. Conclusion](#5. Conclusion)
- 阅读总结
文章信息:
发表于:CVPR 2022
Abstract
视频异常检测在弱监督和单类别分类(OCC)设置下已经得到很好的研究。然而,无监督视频异常检测方法相对较少,可能是因为异常事件发生频率较低,通常定义不清晰,并且在缺乏地面真实监督的情况下,这可能会对学习算法的性能产生不利影响。这个问题既具有挑战性,又具有回报,因为它可以完全消除获取繁琐注释的成本,并使这些系统能够在无人干预的情况下部署。
为此,我们提出了一种新颖的无监督生成合作学习(GCL)方法,用于视频异常检测,它利用了异常事件低频率的特点,构建了生成器和鉴别器之间的交叉监督。实质上,两个网络以协作方式进行训练,从而实现了无监督学习。我们在两个大规模视频异常检测数据集(UCF crime和ShanghaiTech)上进行了大量实验证明,相对于现有的无监督和OCC方法,我们的方法一致取得了改进,证实了其有效性。
1. Introduction
在现实世界中,基于学习的异常检测任务主要由于这类事件的罕见发生而极具挑战性。由于这些事件的不受约束的性质,这一挑战进一步加剧。因此,获取足够的异常示例相当繁琐,可以安全地假设永远不会收集到为训练完全监督模型所需的详尽集。为了使学习可行,通常将异常归因为与正常数据显著偏差的事件。因此,异常检测的一种常见方法是训练一个仅使用正常训练示例学习主导数据表示的单类分类器[14,17,25,28,41,42,45,47,60,64,66,72](图1)。一类分类(OCC)方法的一个显著缺点是正常训练数据的有限可用性,无法捕捉所有正常变化[9]。此外,OCC方法通常不适用于具有多个类别和视频监视中经常出现的多种动态情况的复杂问题。在这种情况下,未见过的正常活动可能与学习的正常表示显著偏离,被预测为异常,从而导致误报[14,67]。
最近,弱监督的异常检测方法变得越来越受欢迎[24,26,34,46,56,63],通过使用视频级别的标签[50,65,67,69,74]减少了获取手动精细注释的成本。具体而言,如果视频的某些内容是异常的,则将其标记为异常,如果所有内容都是正常的,则标记为正常,需要对完整的视频进行手动检查。尽管这样的标注相对经济实惠,但在许多现实世界的应用中仍然不切实际。有大量的视频数据,特别是原始镜头,如果没有注释成本,可以用于异常检测训练。然而,据我们所知,几乎没有人尝试利用未标记的训练数据进行视频异常检测。
在这项工作中,我们探索了视频异常检测的无监督模式,这显然比全监督、弱监督或单类别监督更具挑战性(图1)。然而,由于对假设较少,它也更具有吸引力,因此将鼓励开发新颖且更实用的算法。请注意,文献中的术语"无监督"通常指的是假设所有正常训练数据的OCC方法[11,37,64,66]。然而,它使整体学习问题变得部分监督[19]。在处理视频的无监督异常检测时,我们利用了视频相对于静止图像更丰富的信息和异常事件相对于正常事件更为罕见的简单事实,并试图以结构化的方式利用这样的领域知识。
为此,我们提出了一种生成式协同学习(GCL)方法,该方法以未标记的视频作为输入,并学习预测帧级别的异常分数预测作为输出。所提出的GCL包括两个关键组件,一个生成器和一个鉴别器,它们以相互合作的方式进行训练,以提高异常检测性能。生成器不仅重建丰富可用的正常表示,还通过使用一种新颖的负学习(NL)方法扭曲可能的高置信度异常表示。相反,鉴别器估计一个实例是异常的概率。对于无监督的异常检测,我们从生成器创建伪标签并使用这些标签来训练鉴别器。在接下来的步骤中,我们从训练过的鉴别器版本创建伪标签,然后使用这些标签来改进生成器。整个系统是以交替的方式进行训练的,每次迭代中生成器和鉴别器都通过相互合作得到改进。
贡献: 我们提出了一种异常检测方法,能够在复杂的监控场景中定位异常事件,而无需标记的训练数据。据我们所知,我们的方法是首次尝试在完全无监督模式下解决监控视频异常检测问题的方法。我们提出了一种新颖的生成式协同学习(GCL)框架,包括一个生成器、一个鉴别器和交叉监督。通过使用一种新颖的负学习方法,强制生成器网络不对异常进行重建。在两个大规模复杂异常事件检测数据集(UCF-Crime和ShanghaiTech)上进行了广泛的实验证明,我们的方法相对于基线和一些现有的无监督方法以及OCC方法提供了可见的性能增益。
2. Related Work
异常检测是图像[7,16,39]和视频[49,50,64,67,69]领域中广泛研究的问题。我们回顾了不同的视频异常检测和相互学习策略的监督模式。
Anomaly Detection as One-Class Classification (OCC).
OCC方法已经在广泛的异常检测问题中找到应用,包括医学诊断[58]、网络安全[11]、监控安全系统[20,29,32,64]以及工业检验[5]。其中一些方法使用手工设计的特征[3,31,38,55,71],而其他方法使用使用预训练模型提取的深度特征[42,47]。随着生成模型的出现,许多方法提出了这些网络的变体,以学习正常数据的表示[12,35,36,43--45,61,62,64]。OCC方法在避免对异常测试输入进行良好重建方面面临着挑战。这个问题归因于这样一个事实,即由于OCC方法在训练时只使用正常类别数据,可能会得到一个无效的分类器边界,该边界在包围正常数据的同时排除了异常数据[64]。为了解决这个限制,一些研究人员最近提出了伪监督方法,其中使用正常训练数据生成伪异常实例[1,64]。
Weakly Supervised (WS) Anomaly Detection.
视频级二进制注释用于训练能够预测帧级异常分数的WS分类器[40,50,52,65,67,69,74]。视频级标签以这样的方式提供,即正常标记的视频是完全正常的,而异常标记的视频包含正常和异常内容,而没有任何关于时间位置的信息(图1)。
Unsupervised Anomaly Detection.
使用未标记训练数据的异常检测方法在文献中相当稀少。根据图1所示的命名法,文献中的大多数无监督方法实际上属于OCC类别。例如,MVTecAD [5]基准测试确保训练数据仅正常,因此其评估协议是OCC,继承此假设的方法本质上也是一类分类器[6,12]。与这些算法相比,我们提出的GCL方法能够从未标记的训练数据中学习,而无需假设任何常态。视频形式的训练数据符合关于异常检测的几个重要属性,例如,异常比正常事件更不频繁,并且事件通常在时间上是一致的。我们从这些线索中获得动机,以完全无人监督的方式进行培训。
Teacher Student Networks.
我们提出的GCL与知识蒸馏中的Teacher Student(TS)框架有一些相似之处[18]。GCL与TS框架的主要区别在于其目标不是知识蒸馏。此外,我们的生成器生成带有噪声的标签,而我们的鉴别器相对于噪声较为强大,清理这些标签,而在TS框架中并非如此。
Mutual Learning (ML).
GCL框架与ML算法[73]也有一些相似之处。然而,GCL的两个组件学习不同类型的信息,并通过交叉监督进行训练,与ML算法使用的监督学习形成对比。此外,在GCL中,每个网络的输出经过一个阈值处理过程,生成伪标签。在ML中,群体学习以匹配每个成员的分布,而在GCL中,每个成员试图从其他生成的伪标签中学习。在无监督模式下使用未标记的训练数据进行群体的相互学习尚未被探索。
Dual Learning. 。
这也是一种相关的方法,其中两个语言翻译模型相互教授[15]。然而,通过使用预先训练的无条件语言专家模型提供外部监督,以检查翻译的质量。通过这种方式,不同的模型具有不同的学习任务,而在我们提出的GCL方法中,学习任务是相同的。以前曾提出过Cooperative Learning的另一种变体[4],用于在不同领域中共同学习相同任务的多个模型。例如,通过在RGB图像上训练一个模型和在深度图像上训练另一个模型来制定对象识别,然后这两个模型传递领域不变的对象属性。而在我们的GCL方法中,两个模型都在相同的领域中处理相同的任务。
3. Method
我们提出的异常检测的生成式协同学习方法(GCL)包括一个特征提取器、一个生成器网络、一个鉴别器网络和两个伪标签生成器。图2显示了整体架构。接下来将讨论每个组件。
3.1. Training Data Organization
为了最小化GCL的计算复杂性并减少训练时间,类似于现有的SOTA[50,52,65,67,69,74],我们利用深度特征提取器将视频数据转换为紧凑的特征。所有输入视频都被排列为片段,然后提取这些片段的特征。此外,这些特征被随机排列为批次。在每次迭代中,随机选择一个批次用于训练GCL模型(图2)。形式上,给定一个包含n个视频的训练数据集,每个视频被划分为不重叠的具有p帧的段 S ( i , j ) S_{(i,j)} S(i,j),其中 i ∈ [ 1 , n ] i ∈ [1,n] i∈[1,n]是视频索引, j ∈ [ 1 , m i ] j ∈ [1,m_i] j∈[1,mi]是段索引。段大小p在数据集的所有训练和测试视频中保持不变。对于每个 S ( i , j ) S_{(i,j)} S(i,j),使用特征提取器 E ( ⋅ ) E(·) E(⋅)计算一个特征向量 f ( i , j ) ∈ R d f(i,j) ∈ R^d f(i,j)∈Rd,其中 f ( i , j ) = E ( S ( i , j ) ) f(i,j)=E(S(i,j)) f(i,j)=E(S(i,j))。
在现有的弱监督异常检测方法中,每次训练迭代都在一个或多个完整的视频上进行[50,74]。最近,CLAWS Net [67]提出提取几批时间上一致的特征,然后将每个特征随机输入到网络中。这样的配置用于最小化连续批次之间的相关性的目的。在这些现有的方法中,重要的是在批处理或视频级别维持时间顺序。然而,在所提出的GCL方法中,我们随机化输入特征的顺序,从而去除了批内和批间的相关性。
3.2. Generative Cooperative Learning
我们提出的用于异常检测的生成式协同学习(GCL)方法包括一个生成器G,它是一个自动编码器(AE),和一个鉴别器D,它是一个全连接(FC)分类器。这两个模型都是以协同的方式进行训练,而无需使用任何数据注释。具体而言,我们既不使用正常类别注释,如一类分类(OCC)方法[12,37,54]中所使用的,也不使用弱监督异常检测系统[50,67,69,74]中使用的二进制注释。正如在第1节中讨论的那样,使用AE的背后的直觉是这样的模型可以在一定程度上捕捉整体主导的数据趋势[12]。另一方面,作为鉴别器的FC分类网络在提供监督训练时被认为是有效的,尽管有噪声[67]。为了进行训练,首先使用G创建的伪标注用于训练D。在下一步中,使用D创建的伪标注用于改进G。因此,这两个模型中的每一个都是通过使用另一个模型创建的标注来进行交替训练的。训练配置的目标是在训练迭代中改进伪标记,从而导致整体异常检测性能的提高。接下来将讨论特定的体系结构细节和几个设计选择。
3.2.1 Generator Network
G将特征作为输入,并将这些特征的重建作为输出。通常,通过最小化重建损失 L r L_r Lr来训练G,如下:
其中 f i , j q f^q_{i,j} fi,jq是输入到G的特征向量,并且 f i , j q ^ \widehat{f^q_{i,j}} fi,jq 是对应的重构向量,B是批量大小。
3.2.2 Pseudo Labels from Generator
在我们提出的协作学习中,使用G创建伪标签来训练D。这些标签是通过考虑每个实例 q q q在一个批次上的重构损失 L G q L^q_G LGq的分布来创建的。主要思想是将导致更高损失值的特征向量视为异常的,而生成较小损失值的特征向量视为正常的。为了实现这一直觉,可以考虑使用阈值 L G t h L^{th}_G LGth,如下所示:
我们采用了一种简单的方法来选择 L G t h L^{th}_G LGth,即考虑具有最大重构误差的样本的固定百分比作为异常。在 L G q L^q_G LGq直方图中,我们经验性地观察到朝向最小误差的较大峰值和朝向最大误差的较小峰值。由于类别边界通常落在低密度区域,误差直方图也是选择适当的 L G t h L^{th}_G LGth的有效工具。有关 L G t h L^{th}_G LGth选择的不同替代方案的分析详见补充材料。
3.2.3 Discriminator Network
作为鉴别器D的二元分类网络使用G生成的伪标签进行训练,通过在一个批次b上最小化二元交叉熵损失来实现:
其中 l G q l^q_G lGq ∈{0,1}是由G生成的伪标签,并且当输入特征向量 f i , j q f^q_{i,j} fi,jq时, l i , j q ^ \widehat{l^q_{i,j}} li,jq 是D的输出。
3.2.4 Pseudo Labels from Discriminator
从D生成的伪标签用于提高G的重构判别能力。D的输出 p i , j q ^ \widehat{p^q_{i,j}} pi,jq 是将特征向量 f i , j q f^q_{i,j} fi,jq视为异常的概率。因此,通过在D的输出 p i , j q ^ \widehat{p^q_{i,j}} pi,jq 上使用阈值机制,认为具有更高概率的特征是异常的。然后,D生成的注释用于在下一次迭代中微调G。
其中,以与计算阈值 L G t h L^{th}_G LGth相同的方式计算阈值 L D t h L^{th}_D LDth。
3.2.5 Negative Learning of Generator Network
通过使用D生成的伪标签,采用负学习(NL)对G进行训练。为了增加对正常和异常输入的重构之间的区别,鼓励G对具有异常伪标签的样本进行较差的重构,而旨在将具有正常伪标签的样本正常地重构为最小误差。
文献中已经探索了一些负学习的变体。例如,Munawar等人[33]和Astrid等人[1]对已知的异常输入的整个批次进行了负损失。然而,这种配置需要对整个数据集及其标签进行先验知识。在提出的GCL方法中,伪标签是随着训练的进行而迭代生成的,因此在同一个批次中可能会遇到正常和异常样本。此外,我们不是使损失为负,而是通过使用伪重构目标来强制使异常样本被差异化重构。因此,如图3所示,对于D伪标记为异常的每个特征向量,其重构目标将被替换为另一个特征向量。为了广泛探讨这个概念,我们提出以下不同类型的伪目标:
- 全1目标:原始重构目标被一个维度相似的全1向量替换。
- 随机正常目标:原始重构目标被任意选择的一个正常标记的特征向量替换。
- 随机高斯噪声目标:通过添加高斯噪声来扰动原始重构目标。
- 无负学习:对G不应用负学习。而是仅使用被伪标记为正常的特征向量来训练G。不同伪目标的详细分析见图5。
我们经验观察到,"全1"作为伪目标能够提供更有区分度的重构能力,因此更好地区分正常和异常输入。损失函数由公式(1)修改为包括负学习:
其中伪目标 t q t_q tq被定义为:
3.3. Self-Supervised Pre-training
提议的GCL是通过利用G和D的合作使用未标记的视频进行训练的。由于异常检测是一个不明确定义的问题,缺乏约束可能影响收敛性,系统可能会陷入局部最小值。为了改善收敛性,我们探索了通过预训练G和D来启动训练过程。我们经验性地观察到,使用基于方程(1)的预训练G对学习系统的整体稳定性是有益的,它还改善了收敛性以及系统的性能(第4节)。
自编码器被认为能够捕捉训练数据的主导表示[12, 64]。尽管异常是稀疏的,而正常特征在训练数据中丰富,但我们在实验证明,简单地利用所有训练数据对G进行预训练可能不会提供有效的启动。利用视频中事件按时间顺序发生以及异常帧通常比正常帧更具事件性的事实,我们利用连续特征向量之间的时间差作为一个估计器,最初用于清理G的预训练训练数据集。也就是说,仅当 ∣ ∣ f i , j t + 1 − f i , j t ∣ ∣ 2 ≤ D t h ||f^{t+1}{i,j} − f^t{i,j} ||2 ≤ D{th} ∣∣fi,jt+1−fi,jt∣∣2≤Dth 时,特征向量 f i , j t + 1 f^{t+1}{i,j} fi,jt+1将用于预训练,其中上标 t t t 和 t + 1 t+1 t+1 显示视频中特征的时间顺序, D t h D{th} Dth 是阈值。这种方法并不能保证完全消除异常事件,然而,它为 G G G的有效初始化清理了数据,以便启动训练。一旦 G G G被预训练,就会用它生成伪标签,然后这些伪标签被用于预训练鉴别器。在这一步中, G G G的作用类似于一个糟糕的老师,因为生成的伪标签相当嘈杂,而 D D D的作用类似于一个高效的学生,因为它学会了在嘈杂的标签下更好地区分正常和异常特征。在接下来的步骤中,预训练的 G G G和 D D D都被插入到我们的协同学习循环中。
3.4. Anomaly Scoring
为了在测试时计算最终的异常得分,有几种可能的配置,即使用 G G G的重构误差或 D D D的预测分数。我们在实验证明, G G G在连续的训练迭代中保持相对糟糕,而 D D D则保持高效。因此,为了简单起见,除非另有说明,本文中报告的所有结果都是使用 D D D的预测来计算的。
4. Experiments
在本节中,我们首先提供实验细节,然后与现有的SOTA方法进行比较,最后研究GCL方法的不同组成部分。
Datasets.
-
UCF-Crime(UCFC)数据集包含13个不同类别的真实世界异常事件,这些事件由CCTV监控摄像头捕获,时间跨度为128小时[50]。这个数据集是复杂的,因为不受约束的背景。训练分割包含810个异常视频和800个正常视频,而测试分割包含140个异常视频和150个正常视频。在训练分割中,提供视频级标签,而在测试分割中,提供帧级二进制标签。在我们的无监督设置中,我们放弃了训练分割标签,并使用未标记的训练视频训练拟议的GCL。
-
ShanghaiTech包含在大学校园13个不同地点拍摄的437个视频中的阶段性异常事件。该数据集最初是为OCC提出的,仅提供正常视频用于训练。后来,Zhong et al.[74]重新组织了这个数据集,以促进弱监督算法的训练。在训练和测试分割中,正常和异常视频都是混合的。新的训练分割包含63个异常视频和175个正常视频,而新的测试分割包含44个异常视频和155个正常视频。为了训练我们提出的GCL,我们在训练和测试时都遵循后者的分割,而不使用训练分割视频标签。
Evaluation Measures.
根据现有方法[14,27,50,74],我们使用ROC曲线下面积(AUC)进行评估和比较。AUC是基于两个数据集中测试视频的帧级注释计算的。
Implementation Details.
为了展示协同学习概念的真正本质,我们选择了相当简单的架构,没有任何花哨的元素,作为我们的生成器( G G G)和鉴别器( D D D)网络。G和D的架构被设置为全连接层[2048,1024,512,256,512,1024,2048]和[2048,512,32,1]。我们使用RMSprop优化器对这两个网络进行训练,学习率为0.00002,动量为0.60,在批量大小为8192的训练数据上进行15个epoch的训练。用于生成伪标签的处理是数据驱动的。对于 G G G的每个伪标签,损失函数 L G t h = μ R + σ R L^{th}_G = μ_R + σ_R LGth=μR+σR,其中 μ R μ_R μR和 σ R σ_R σR是重建误差的平均值和标准差,如等式(1)所示。
对于每个批次,损失函数 L D t h = μ P + 0.1 σ P L^{th}D = μ_P + 0.1σ_P LDth=μP+0.1σP 被用于D,其中 μ P μ_P μP 和 σ P σ_P σP是 D D D为每个批次生成的概率 p i , j q ^ \widehat{p^q{i,j}} pi,jq 的平均值和标准差。无监督预训练时使用 D t h = 0.70 D_{th}=0.70 Dth=0.70的阈值。作为特征提取器,我们采用了ResNext3d框架,由原等人提出[13],在默认模式下运行。用于特征提取的段大小p被设置为16个非重叠帧。所有实验都在配备Intel Core i7第8代和16GB RAM的NVIDIA RTX 2070上进行。
4.1. Comparisons with State-Of-The-Art (SOTA)
提出的GCL方法是以无监督的方式进行训练,没有使用任何类型的注释。没有预训练的GCL( G C L B GCL_B GCLB)被视为基准。此外,进行了GCL的预训练( G C L P T GCL_{PT} GCLPT)、与基于OCC的预训练自编码器相结合的GCL( G C L O C C GCL_{OCC} GCLOCC)以及弱监督的GCL( G C L W S GCL_{WS} GCLWS)的训练和评估,并应用在UCFC和ShanghaiTech数据集上。
如表1所示,在UCFC数据集上,提出的 G C L B GCL_B GCLB获得了总体AUC为68.17%,比Autoencoder( A E A l l D a t a AE_{AllData} AEAllData)在包括正常和异常训练样本的完整训练数据上以无监督方式训练的AUC高11.85%。图4(a)中重构上的直方图也提供了 A E A l l D a t a AE_{AllData} AEAllData无法学习区分性重构的见解。此外,在GCL中,鉴别器D的判别能力(图4©)明显优于生成器G(图4(b))。对kim等人[21]的实验是在重新实现的方法上进行的,用于无标签的训练数据。
G C L P T GCL_{PT} GCLPT是提出的GCL的版本,其中包含一个以无监督方式预训练的自编码器。在这个实验中,我们获得了71.04%的AUC性能,比基准GCLB提高了2.87%。这两种方法在图10中使用多个随机种子初始化进行比较,GCLPT展现出一致的性能提升。表1还显示,提出的GCLPT优于所有现有的基于单类分类的异常检测方法。尽管在训练 G C L P T GCL_{PT} GCLPT时没有使用标签监督,但它表现出色。相反,OCC方法使用干净的正常类进行训练,这与我们基于无监督训练的GCL相比提供了额外的信息。
在另一个实验中,自编码器仅在训练数据的正常类上进行预训练,这使得设置与单类分类器的设置相当。在表1中,以正常类标签形式提供额外信息的这种方案,被称为 G C L O C C GCL_{OCC} GCLOCC,获得了在UCFC上的改进性能,达到了74.20%,显著优于所有现有的最先进的OCC方法。值得注意的是, G C L O C C GCL_{OCC} GCLOCC的性能与Sultani等人[50]提出的利用视频级标签进行训练的方法相媲美。
尽管GCL的目标是无监督的协同学习,我们还将其扩展以纳入弱监督。表1中报告了这个版本的结果,称为 G C L W S GCL_{WS} GCLWS。尽管使用相当简单的G和D网络,没有任何花哨的元素,但 G C L W S GCL_{WS} GCLWS获得了与几种现有的弱监督学习方法相媲美的结果。
我们还在ShanghaiTech数据集[29]上评估了我们的方法,并将结果与表1中的现有最先进方法进行了比较。在这个数据集上,我们提出的 G C L B GCL_B GCLB获得了72.41%的AUC,比 A E A l l D a t a AE_{AllData} AEAllData高出了超过10%,显示了基线方法的有效性。 G C L P T GCL_{PT} GCLPT获得了78.93%的AUC,比 G C L B GCL_B GCLB提高了6.5%,证明了无监督预训练对于启动训练的重要性。尽管是无监督的, G C L P T GCL_{PT} GCLPT的性能优于所有现有的OCC方法。
4.2. Ablation Study and Analysis
表二是消融实验的结果:
5. Conclusion
我们提出了一种无监督的异常检测方法(GCL),利用未标记的训练视频,可以在不提供任何手动标注的情况下部署。GCL在两个具有不同监督级别的公共基准数据集上表现出色,包括无监督、单类和弱监督。最后,我们讨论了无监督设置的局限性,即在训练数据集中假定存在异常。然而,与OCC方法相比,这更为现实,因为在实际情况中存在异常是很自然的情况。
阅读总结
- 完全意义上的无监督
- 网络还是挺简单的,网络设计个人觉得还是很有意思,要是有源码就好了
- 做了很充分的实验