笔记
菜鸟滚滚
这个作者很懒,什么都没留下…
展开
-
Python正则表达式嵌套组
组的概念其实就是筛选特定区域的字符串部分,而不是把上下文信息一起给出来,比如,"aaa(.*)bbb"就是筛选出aaa和bbb之间的字符串,而"aaa.*?bbb"则是把上下文信息一起给出来。一个正则匹配表达式可以有多个组,组之间也可以嵌套,但是需要满足一个原则,就是先要匹配到上层的组,再匹配下层的组,上层组的序号先于下层组,如果一个上层组满足匹配条件,一定是以嵌套组也满足为前提。原创 2022-10-11 11:36:26 · 713 阅读 · 1 评论 -
关于python的import机制
那就使用自己定义的查找器,比如importlib.abc.meta_path_finder,继承之后这里边需要写一个find_spec方法,这个方法是用来找到模块的ModuleSpec类的,这个包含加载器,模块名和模块绝对地址。我们需要把自定义的查找器插入到sys.meta_path,然后一旦默认查找器找不到模块,就调用自定义的查找器。自定义的查找器,返回ModuleSpec对象,然后会调用加载器,在加载器中将模块写入sys.modules(当然这一步是python自己完成的)。...原创 2022-07-27 18:22:25 · 366 阅读 · 0 评论 -
一文解读模拟训练量化
"Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference"量化paper解读概述神经网络模型的量化是模型压缩的一种方式,在不更改模型结构的情况下,压缩模型的参数比特,减小模型大小,加速模型推理速度,在部署中常用的一种方式。常见的模型一般都是32bits的浮点参数,我们会使用16F,int8, int4或者2bit来压缩,16F本质上来说并不是严格意义上的量化,只不过是利用更原创 2021-08-14 16:59:05 · 1555 阅读 · 0 评论 -
Gan中的标签反转和域自适应中的梯度反转
Gan中的标签反转和域自适应中的梯度反转有个想法,为什么gan不用梯度反转呢,而是给定一个相反标签,其实梯度反转也是可以的,但是在同样的输出情况下,我们会发现直接给相反标签会更快地指导网络往相反方向学习,也就是梯度更大,这个可以根据公式推导出来。另外域自适应中对backbone的梯度反转也是为了提取更通用的特征,是为了找到两种分布间的共性,让网络着重学习这些。而不简简单单为了让两种分布得到同样的标签。...原创 2021-08-07 19:32:37 · 975 阅读 · 0 评论 -
detr和transformer的区别
detr和transformer的区别简而言之,就是detr的decoder端没有严格的时序关系,就是可以并行的解码,对于N=100个object query embedding,直接利用self-attention解码即可,在训练时,也不需要加上mask attention,就是像输入一样即可。...原创 2021-07-27 11:52:06 · 1024 阅读 · 2 评论 -
一文了解模型量化中的QAT和PTQ
一文了解模型量化中的QAT和PTQ由于前一段时间在做模型的转换工作,实际部署的时候需要一些模型加速的方法,常用的有各家的inference框架,如mnn,tnn,tensorrt等,这些框架除了fp32精度外,都支持了int8的精度,而量化到int8常常可以使我们的模型更小更快,所以在部署端很受欢迎。常用的模型量化方式有训练中量化,QAT,和训练后量化,PTQ,之前转trt时,用的就是PTQ,在一些常用的模型上表现还不错,几乎没有什么掉点,但是在复杂模型,如带有swish的模型啊,或者nas搜出来的模型原创 2021-06-27 20:05:47 · 24898 阅读 · 6 评论 -
关于yolov3和fcos中inference差异
关于yolov3和fcos中inference差异:yolov3和fcos的结构其实比较像,前者有类别+置信度,后者有类别+中心度,而且训练时对于类别都是使用了多个bce,对于objness则另外约束,除了Yolov3有3个anchor之外好像区别不大。但在Inference的时候,根据阅读的源码,yolov3是先对每个anchor取出分数最高的那类,然后与Obj相乘,得到一个综合的分数,再根据这个进行nms,但是,fcos则是保留每个point的所有类别分数,在每一层上把所有的point的所有类别分数原创 2021-06-26 20:03:41 · 539 阅读 · 0 评论 -
关于python对象序列化的一些记录
关于python对象序列化的一些记录其实这个问题,老早之前在用torch.save时就有了,torch.save存模型和存权重有啥区别,今天来具体说一说。首先python序列化的目的是为了把内存中的结构化数据存到磁盘上也有同样的结构,常用的工具是pickle,命令是pick.dumps和pick.loads,不带s的dump和load是直接用于文件描述符的。那序列化时到底存了什么呢,存了以self.开头的属性,是属性,不是方法哈,也就是方法是没有存下来的,方法是类的,而不是对象的,对象只有属性,这里插原创 2021-06-25 00:21:53 · 130 阅读 · 0 评论 -
关于分布式框架ray的一些细节
Ray是什么?这里讲的很仔细和专业一句话来说就是使用户能够更好利用多个节点进行多进程协同计算,类似于slurm这些,但是更高效和方便。Ray怎么和python结合使用?这里也有逐步的教程可以使用最简单的代码,如初始化,@remote等修饰符完成功能。理解的一些点:ray是基于Node的,如果要进行分布式运算,需要绑定对应的ip:port,也就是参数address。当然,也可以不需要,直接在本地ray.init()也可以,这样ray获得的是本地的资源。当我们进行在tmux中开启多个shell,转载 2021-06-23 21:47:51 · 1366 阅读 · 0 评论 -
关于python运行环境的路径问题
关于python运行环境的路径问题最近写脚本遇到一些路径的困惑,记录一下。1.我们在shell中运行python命令时,此时的路径就是python的工作路径,我们在python脚本中写的相对路径都是相对工作路径的,而不是相对于脚本所在的路径。2.当我们需要在脚本中去导入一些别的模块时,此时使用的就是相对脚本路径,比如在A.py中from . import B,那此时B就是和A在同一级目录,如果是…就是上一级目录,但是注意这种相对路径导入不可超越当前工作路径本层,也就说不能越过工作路径去导入别的模块,导原创 2021-06-22 14:42:21 · 1807 阅读 · 0 评论 -
关于linux环境变量的一些归纳
关于linux环境变量的一些归纳最近在写一些脚本时常常遇到关于环境变量设置不当导致的问题,这里记录一下我归纳的细节吧。首先就ubuntu系统而言,环境变量分为系统级和用户级的,这里有博客说的比较清楚了 环境变量详解我大概归纳一下,就是我们常用的shell 登录时,即ssh登录,如果默认是bash的情况下(大多数如此),会自动调用/etc/profile和/.profile,而这两个profile中都会去调用/etc/bash.bashrc和/.bashrc,完成环境变量的初始化,而在我们手动开原创 2021-06-19 12:38:44 · 111 阅读 · 0 评论 -
关于ubuntu上使用docker环境的小记
关于ubuntu上使用docker环境的小记docker环境是一种隔离式的系统,用户在容器中进行操作,互不影响,可以随时创建和销毁,比较方便和灵活。这里记录一些细节吧。首先,我们可以直接利用dockerhub的镜像来创建容器,即docker run ---- -it,这里使用-it是为了获得伪交互终端,后面也要跟/bin/bash这种不退出的命令。如果想要个人的镜像,则需要进行镜像的生成,常常使用Dockerfile来进行,Dockerfile里边有一系列操作,类似与shell操作,如ADD,COPY原创 2021-06-17 22:01:38 · 304 阅读 · 0 评论 -
Fasterrcnn一些细节
Fasterrcnn一些细节目前的fasterrcnn基本都是基于resenet系列,分为C4版和FPN版的,后者用得比较多。这两者的区别在与C4版的时在resnet50基础上改的,利用res4输出来进行rpn计算和roi pooling,然后roi head是和res5共享的,也就是说并没有单独再设计roi head了,res4输出14x14的roi,然后再经过res5降采样一下就得到了7x7的roi,然后在avg pool,最后连接cls head和box head。 FPN的fasterrcnn则是原创 2021-04-24 11:05:22 · 443 阅读 · 0 评论 -
记录一点关于python的c++拓展的知识点
python和c++那点事儿这个博客我觉得写得挺好,从简单例子给我们展示了一般会用到的几种扩展方式,如torch.util.cpp_extension,.pyx,distutils.extension,还有pybind11,直接调用动态库等。点这里看学习一下的缘由其实,我是在复现一篇基于faster rcnn的代码时遇到的问题,由于是基于torch0.3,所以使用了torch,util.cffi来扩展c++,但是这个却在后面的torch版本中被淘汰了,所以我就索性把这个拓展方式改成高版本的torch转载 2021-04-13 11:54:37 · 150 阅读 · 0 评论 -
一文掌握Pytorch-onnx-tensorrt模型转换
一文掌握Pytorch-onnx-tensorrt模型转换pytorch转onnxpytorch转onnx对于实际部署的需求,很多时候pytorch是不满足的,所以需要转成其他模型格式来加快推理。常用的就是onnx,onnx天然支持很多框架模型的转换,如Pytorch,tf,darknet,caffe等。而pytorch也给我们提供了对应的接口,就是torch.onnx.export。下面具体到每一步。首先,环境和依赖:onnx包,cuda和cudnn,我用的版本号分别是1.7.0, 10.1原创 2021-03-07 12:07:24 · 25032 阅读 · 8 评论 -
关于python中元类理解
关于python中元类的理解这篇博客讲得很好,先贴在这。简而言之额外这篇博客讲得很好,先贴在这。添加链接描述简而言之元类就是类的类,python中一切皆对象,类也是一种对象,是元类的对象。我们在创建字符串对象时会使用str,在创建整形变量对象时会使用int,同样,对于类,我们也可以使用Metaclass。Python中默认的metaclass是type,我们可以通过type(…)来创建类,只需要给出类名,父类,属性等。一般来说是通过__new__方法来创建的,__new__方法是在__init__转载 2021-02-28 14:00:21 · 134 阅读 · 0 评论 -
git初学需要掌握的一些操作
git初学需要掌握的一些操作clone下来基础代码我们一般基于现有的代码框架来做一些修改和提交,所以第一条命令就是git clone git@[path]这条命令将远程的代码分支clone到本地,一般是master分支/建立新的分支作为初学者,我们修改的代码一般不直接在master上,而是新建一个分支,所以第二条命令就是git checkout -b [branch_name]这条命令在master或者其他已有的分支上checkout出一条新的分支。进行修改提交在完成一些修改后,我们需要原创 2021-02-01 22:50:50 · 125 阅读 · 0 评论 -
关于python的多进程的一些细节
不同平台的区别在 windows平台,python是使用spawn方式创建子进程,即导入当前的脚本作为module运行。在linux平台,则是以fork的方式创建子进程,父进程会拷贝当前的进程信息给子进程,子进程和父进程在异步继续执行。这两种方式的不同,会导致我们在写代码时需要注意一些细节,对于spawn方式,由于子进程是重新导入一份脚本,所以创建子进程之前的代码也有可能被子进程执行,导致子进程又创建子进程,会出错。我们需要加入if name == 'main’来规避这种意外,即将只希望主进程执行的代原创 2020-11-14 14:48:15 · 667 阅读 · 0 评论 -
python中的二进制逻辑运算
python中的二进制逻辑运算逻辑运算逻辑运算python中含有和c++一样的&,|,~,^等逻辑运算,可以模拟加减乘除等基础运算。由于在python中定义变量类型没有固定的位长,我们在使用bin()方法打印变量的二进制表示时,会遇到负数打印的是原码的情况。如下图所示,这与我们印象中的计算机存储的是补码的概念不符,这里打印的是原码,主要还是因为Python变量没有固定位长,不存在溢出情况,故而无法确定符号位。那怎么办呢?这里,我们需要手动的给变量设置位长,如下图所示,我们将变量与上一个值原创 2020-09-08 12:13:57 · 1304 阅读 · 0 评论 -
关于docker容器中socket配置端口问题
关于docker容器中socket配置端口问题关于容器端口和主机端口的关系Socket端口配置关于0.0.0.0和127.0.0.1和其他ip的关系关于容器端口和主机端口的关系首先,我们在创造容器时,如果不指定端口映射,那么这个容器时封闭的,不能与外界网络通信。而我们一般情况下则需要指定端口映射,使得我们可以通过主机的端口访问到容器。我们常用docker container run -p 8080:80 -d *progamme_name*这里我们将容器的80端口映射到主机的8080端口,之后我们就原创 2020-09-01 19:06:24 · 3447 阅读 · 0 评论 -
关于mmdetection中cuda环境配置
关于mmdetection中cuda环境配置Mmdetection有两种版本、2.3之前的版本需要分别编译mmcv和mmdetection、2.3版本将ops目录转移到了mmcv中、组成了mmcv-full版本,而mmdetection中没有需要编译的c++代码了。对于mmdet2.3、需要先安装mmcv-full、这里有两种安装方式、直接pip安装编译好的mmcv和下载mmcv源码进行本地的编译、前者比较简单、但需要注意匹配本地的pytorch和cuda的版本,后者需要本地编译、所以需要原生的cuda原创 2020-07-31 21:37:23 · 1236 阅读 · 1 评论