[Ref: https://arxiv.org/abs/2104.14294]
DINO 的初衷是质疑自监督学习相较于 CNN 是否为 Transformer(ViT) 提供了新的属性,但是在过程中,发现:
论文将这个自监督结构命名为 DINO ,这种**没有引入标签的“自蒸馏”**形式在结合各种 ViTs 以后可以达到 80.1% top-1.
下面的这幅 GIF 很简洁地表示了 DINO 的结构:
其中 Student 模型和 Teacher 模型是完全一样的
在训练中,Teacher 模型是没有训练的,它的权重更新是通过对 Student 模型权重的 EMA(exponential moving average )
来更新 Teacher 模型的。下面的图是 EMA 的举例,可以感受一下。
还有值得注意的是两个模型的输入是完全独立的数据增强。
具体的表示可以参考 [Ref: https://en.wikipedia.org/wiki/Moving_average]
下面就是代码层面的一些展示了。
!git clone https://github.com/facebookresearch/dino.git /home/featurize/dino
!mkdir /home/featurize/dino/input
!mkdir /home/featurize/dino/output
!wget https://www.snowskool.com/uploads/images/ski_and_snowboard_snowsport12.jpg -O /home/featurize/dino/input/ski.jpg
import matplotlib.pyplot as plt
import cv2
plt.axis('off')
plt.imshow(cv2.cvtColor(cv2.imread('/home/featurize/dino/input/ski.jpg'), cv2.COLOR_BGR2RGB));
!python /home/featurize/dino/visualize_attention.py \
--image_path /home/featurize/dino/input/ski.jpg \
--output_dir /home/featurize/dino/output
f, axs = plt.subplots(2,3, figsize=(12,8))
for i, ax in enumerate(axs.reshape(-1)):
ax.axis('off')
ax.imshow(cv2.cvtColor(cv2.imread(f'/home/featurize/dino/output/attn-head{i}.png'), cv2.COLOR_BGR2RGB));
!unset http_proxy;unset https_proxy;unset all_proxy
!wget https://featurize.oss-cn-chengdu.aliyuncs.com/input.mp4 -O /home/featurize/dino/input/input.mp4
from IPython.display import Video
Video('/home/featurize/dino/input/input.mp4', embed=True, width=800, height=600)
!python /home/featurize/dino/video_generation.py \
--pretrained_weights dino_deitsmall8_pretrain.pth \
--input_path /home/featurize/dino/input/input.mp4 \
--output_path /home/featurize/dino/output \
--video_format mp4 \
--fps 25
Dave 觉得自监督学习在并未输入人类的理解信息的情况下,模型能够给出语义级别的解释并且能够超过监督学习,这就十分符合我对智能体的期望。