SSL-MoCov3

SSL-MoCov3

@Aiken 2021

恺明大神对自监督学习+transformer的实证研究,针对Transformer再自监督学习学习框架中的训练不稳定问题提出了Random Patch Projection的解决方案。

ArticlePaper

Motivation

ViT的方法在自监督学习的任务中,精度下降的主要原因是由于算法的不稳定性,容易陷入局部的最优值,本文主要聚焦于采用视觉领域的自监督框架进行Transformer的训练,CNN的训练方法已经是一个比较明确约定俗称的方法,而Transformer的训练架构实际上还没有被完全的构建。


python 与标记语言的交互

python 与标记语言的交互

对于各种形式的标记文档(markup)和数据集的处理进行一个整合,还有一些python中的相关模块(比比如glob,后续可能会迁移到别的文档中),主要包括:yaml,json,csv,xml,这些可拓展的标记语言.

TODO:

  • [ ] csv,xml:这一部分可以看一下吉仲师兄那边是怎么存和取文件的,继承一下代码减少我这一部分的工作量
  • [ ] 按照csv文件对数据集进行本地的文件夹切分。实际上很多数据集,像mini-imageNet这类的是需要我们下载下来之后按照csv文件对训练集和测试集进行切分的
  • [ ] 使用sklearn对完整的未切分数据进行切分。

Python: Glob

文件操作相关模块,用于简单的路径匹配的模块,用来查找路径中的相关文件,基本的正则匹配规则如下:

“*”: 匹配0哥或多个字符

“?” : 匹配单个字符

“[ ]”: 匹配指定范围内的字符,如[0-9]匹配所有的数字

glob.glob:

返回所有匹配的路径列表,只有一个参数pathname,定一乐文件路径的匹配规则,可以是绝对路径或者是相对路径,具体的使用可以参考如下的方式:

1
2
3
4
5
6
7
8
9
10
11
12
for xmlpath in glob.glob('media/all/DATAPART/' + "*")
# xmlpath 遍历文件夹下的所有文件和文件夹

for xmlpath in glob.glob(xmlpath + "/*/*")
# xmlpath 遍历文件夹下所有文件夹中的文件夹中的文件:按照层数自由设定

img_path = sorted(glob.glob(os.path.join(images, '*.npy')))
# 遍历文件夹下的所有npy文件,说实话感觉这个怪离谱的,晚点试一下

import glob
print(glob.glob(r"E:/imgdir/*/*.jpg"))


C++的常见数据类型和操作

C++的常见数据类型和操作

主要介绍一些常用数据类型的一些method,区别还有一些特殊的定义;

priority_queue 默认是大顶堆,great的话是小顶堆,less的话是大顶堆,自定义的话不知道是不是一致的

set默认top是小顶,这个大小我就不知道了,自定义的话,好像和我想得是一致的

所有的动态容器都是存放在heap上的,像是什么Vector,String,unordered_map之类的

指定精度的输出和计算

在腾讯的笔试中出现的需要指定精度和指定的计算精度的分析,在使用常数的时候一定要使用.0去修正一个方法。

Vector 动态数组

Vector中的一些常用的函数,方法,以及一些属性介绍和辨析

emplace_back & push_back(在末尾添加元素)

empalce_back直接在数组的末尾进行构造,而push_back借助于构造的临时变量再将其加入数组末尾,所以在一些操作中empalce_back对于空间时间的效率是会更高的,但是如果我们有重复构筑的数据的话,可能就需要使用push_back

要注意实际上vector中并没有append的方法。


(转)What the Fuck Python! 一些python特性

(转)What the Fuck Python! 一些python特性

What the f*ck Python! 🐍

一些有趣且鲜为人知的 Python 特性.

English | 中文


WTFPL 2.0 Commit id 996.icu

Python, 是一个设计优美的解释型高级语言, 它提供了很多能让程序员感到舒适的功能特性. 但有的时候, Python 的一些输出结果对于初学者来说似乎并不是那么一目了然.

这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性, 并尝试讨论这些现象背后真正的原理!

虽然下面的有些例子并不一定会让你觉得 WTFs, 但它们依然有可能会告诉你一些你所不知道的 Python 有趣特性. 我觉得这是一种学习编程语言内部原理的好办法, 而且我相信你也会从中获得乐趣!

如果您是一位经验比较丰富的 Python 程序员, 你可以尝试挑战看是否能一次就找到例子的正确答案. 你可能对其中的一些例子已经比较熟悉了, 那这也许能唤起你当年踩这些坑时的甜蜜回忆 :sweat_smile:

PS: 如果你不是第一次读了, 你可以在这里获取变动内容.

那么, 让我们开始吧…


Linux 基础操作 01

Linux 基础操作 01

学习资源汇总

manual:菜鸟Shell | ExplainShell

收录一些Linux的工具书以及相关的OnLine-Doc,方便后续进行学习和查阅:

  1. 鸟哥的Linux私房菜:相对全面一点但是内容有点太多了
  2. Linux就该这么学:从开始到结束的流程挺完善的,但是这个网站做的是纯傻逼
  3. Linux Tools Quick Tutorial:简单入门教程好像是
  4. Linux命令行于Shell脚本编程大全:本地PDF,在当前文件夹下面进行查看

文件架构&系统信息

Linux各文件夹的含义分析LInux下的文件架构体系,包括最外层的一些系统文件夹的基础作用以及对应的特殊功能等等,帮助我们能够更清楚我们文件的存储体系以及系统文件的存储地址。


Data Augmentation

Data Augmentation

intergrate with those augmentation method.

this doc will

  • Record those theory and the effect after transformation
  • Show the codes for ez use

And the complete .py will be intergrate in my classification pipeline

reference below:arrow_down_small:, if use them,start it for respect for his work.

Principle

Principle 1 of coding: Don’t reinvent the wheel unless it’s needed

  • 具体而言,仅在函数的拓展性较差,无法对其定制化,满足我们的日常需求的时候,我们会自行编写函数从而满足我们的需求,否则我们直接引用已知的库,提升我们的实现效率。

MLFlow

MLFlow

MLFlow 机器学习系统的使用

@Aiken 2020

基于Python开发的DAG数据工作流系统,面向机器学习,支持Spark并行环境和K8S容器集群;

MLFlow主要解决了三个问题,也就是三个我们可能会需要使用的功能:

  1. Tracking:跟踪实验训练结果,记录算法参数,模型结果和运行效果等等;
  2. Projects:对所有的算法项目有一套标准的projects概念,记录下代码版本,参数和运行环境这些东西,并且projects是可以拟合所有的算法框架的;
  3. Models:解决的是打包和部署模型的这样一个行为,提供json接口给后续的flsk框架等等进行使用

基本部署

INSTALL:

DEPLOY:

Tracking 实验版本跟踪

Tracking为本次描述的重点,来做一个训练过程中的版本管理,记录每一次训练的参数和变量信息等等,这样便于后续的恢复和实验信息的整理。便于统计和管理。使用的时候好像也是需要代码嵌入的部分,就是需要在代码中调用MLFlow的API。

但是在Tracking的时候有一个比较重要的点在于,这个方法和Tensorboard对原模型的参数的嵌入和Logging记录中会不会产生冲突,同时两个方法之间是不是有什么overlap;关键的问题:

  • 这两个API能不能进行混合使用
  • 怎么统一和区分两个方法的应用情景

Reference


Hard Task Sampling

Hard Task Sampling

Trick:Hard Task

思路来源于Meta-Tranfer-Learning,基本思路是在Meta-Learning的每一次Meta-Test的时候,会从预训练错误率比较高的Task中再次采样,增加那些task的训练次数。也就是难题多做的策略。

基本思路

对比Adaboost

这样的思路其实和AdaBoost的想法是有一定的异曲同工之妙的,或者说其实就是AdaBoost的思路:

Adaboost

参考笔记,从该笔记中我们可以看到,AdaBoost的基本思路如下:

Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器.

和Meta-Transfer-Learning对比一下,我们可以发现,这个方法实际上就是讲Transfer Learning的与训练网络当成弱学习器1,然后通过弱学习器1的训练样本权重,来增大Hard-Task的配比(也就是增加任务的权重)完全一致。

具体实现

实现上主要是,样本sample的过程,就是如何在进行参数选择后和原本的Dataloader,结合起来。在这里我们主要参考MTL中的方法,进行网络的构建处理。

第一部分:sampler构建,为了后续Dataloader中进行数据的采样,需要构建一个这样的sampler,关键在于index的对应关系,以及最后输出的是index的集合。


并行训练
MIM-V-simMIM

MIM-V-simMIM

@Author: MSRA Zhenda Xie
@Source:ArxivCode TBPBlog_CVer
@Read:AikenHong 2021.11.22

“What I cannot create, I do not understand.” — Richard Feynman

Intro & Simple Conclusion

Conclusion

继MAE和iBoT之后,MSRA也提出了一个图像掩码建模的新框架,SimMIM,该方法简化了最近这些提出的方法,不需要特殊设计,作者也验证了不需要那些特殊设计就已经能让模型展现出优秀的学习能力

  • 采用中等大小的掩码块(32),对输入图像进行随机掩码,能使其成为强大的代理任务(pretext task)
  • 直接回归预测原始像素的RGB值的效果并不比复杂设计的Patch分类方法差
  • Projector Head可以是轻量的Linear Layer,效果并不一定比MLP(多层)的差

Motivation

通过这种MIM方法可以实现在大量无标注的数据上得到一个表征能力up的通用特征模型,这种方式的backbone可以广泛的应用到图像上的各种子任务中(按照NLP)的经验来说,而为了类似的方式在图像上的大放异彩,我们首先需要分析Vision和Language的不同

  1. 图像有更强的局部关系:相互靠近的像素是高度相关和近似的,我们可以通过简单的copy padding复制一部分缺失
  2. 视觉信号是原始,低层次的,而文本分词是高级概念:对低层次信号的预测是否对高层次的视觉识别任务有用呢?
  3. 视觉信号是连续的,而文本的分词是离散的: 如何基于分类的掩码语言建模方法来处理连续的视觉信号

Theoretical Design

掩码选择:同样的掩码的策略还是基于Patch进行的,对于掩码的设计来说,太大的掩码快或者太密集的掩码快,可能会导致找不到附近的像素来预测,实验证明32是一个具有竞争力的size,和文本任务的信息冗余程度不同也带来了覆盖比的选择,NLP通常是0.15,而在V中,32size可以支持0.1-0.7的覆盖率。

任务选择:使用原始像素的回归任务,因为回归任务和具有有序性的视觉信号的连续性很好的吻合。

预测头选择:使用轻量的预测头如(linear),迁移性能与繁琐的预测头相似或者略好,同时训练上更加的块。虽然较大的头或更高的分辨率通常会导致更强的生成能力,但这种更强的能力不一定有利于下游的微调任务