0

编译、链接、调试

目前工作方向发生了挺大的变化,现在已经从Researcher慢慢过渡到了Developer。现在主要是负责一些SDK相关的设计和开发工作,最常使用到的就是C/C++。众所周知,C/C++是最复杂,最强大的一套编程工具,当然其中的概念和坑也是十分的多。这一系列的文章主要是记录我对编译、链接、动静态库、符号表、ABI、以及调试等的理解。

关于编译链接等的知识,可以参考这本经典的参考书:《程序员的自我修养——链接、装载与库》。不过呢,如果只是阅读而不实践的话,很多的知识很难记住。但一般也只需要了解相关的概念,在遇到问题的时候能够想到坑的突破点,其实就已经足够了。 read more

0

国庆快乐

这个是参考了一张Saber的插画。之后绘画的时候是一点都没有再看原图。和官方的Saber比,脸是不太一样。

0

端午啦

端午节,画了两天,才画了一张带颜色的图,感觉颜色啥的,好难画,阴影的过渡有待进步~

1

2B

昨天晚上,终于把Nier的一周目打通了。最后2B小姐姐的眼罩居然掉了。真心好看。所以今天呢,就在没有任何参考的情况下,自己练习了一下头像,感觉效果似乎还可以。难道说,我的插画生涯终于要开始了吗,嘻嘻。

0

TICTOC: Header Only C++ Timer

感觉最近的更新频率略高啊~哈哈~

这次的带来的是一个十分简单便利的C++计时库。

项目地址:https://github.com/miaoerduo/tictoc 欢迎Start和提MR

项目中有详细的说明和Demo,可以很直观的体验到这个库的易用性。

先看一下效果,如果我们正确使用的话,大致会出现类似下面的信息:

可以显示,我们的每个区域的代码(包括行号)的消耗时间。精确到微秒。

起因是这样的,之前有很长时间的工作内容是优化一些特定的函数,保证新旧的SDK的速度的对齐。然后C++虽然有一些工具可以分析运行状态,但通常还是简单的打印时间来的方便 /* Print大法好 */ 。之后,和工程的小伙伴一起Debug的时候,就发现他写了一个头文件,然后用绝对路径的方式去include,而头文件里面就是各种常用的小工具,而最常用到的就是时间的打印。 read more

2

Easy Pipeline,一种轻量级的Python Pipeline库

嗯,很久没有写博客了,最近的工作都是偏开发性质的,以至于没有时间对自己感兴趣的领域进行探索,感觉个人的成长停滞了一些。如何在枯燥的工作中,提取出有助于自己成长的养分,对于每个人来说都是不小的考验。

这次,带来的是之前编写的一下挺简单的库,用来简化流水线作业的小框架。

Github: https://github.com/miaoerduo/easy-pipeline 欢迎Star和提交MR。

起因是这样的,组内有一个需求,需要挖掘视频中的检测难样本,这样可以极大地减少标注的量,从而降低成本。难样本挖掘的策略,简单来说就是如果视频的前几帧和后几帧都能检测到目标,而就只有当前帧没有检测到,就说明当前帧很可能存在漏检(没有检测本到该检测到的目标);反之,如果前后都没有检测到目标,而当前帧检测到了,那就很可能是误检(检测到不是目标的东西)。 read more

0

vim配置

下面是我的VIM的主要配置。应该就是网上找到的一个,加了点功能。权当在这里备份一下了。

将下面的内容写入自己的~/.vimrc文件即可。

针对自动跳转到上次关闭位置的这个功能,我在Ubuntu 14这个系统上失败了一次。是由于viminfo文件的权限不对。使用ls -l ~/.viminfo。如果发现其创建用户不是当前用户的话,那么可以将其删除。下次打开vim的时候会自动新建。这样就搞定了!

另外,附上Ubuntu下,VIM 8升级的命令:

0

嗯,此刻一个非技术板块诞生了

先贴上一张昨晚的作品,这样这篇博客会自动有个插图。:P

左边的男生是想象着随便画的,右边的女生其实是参考的一个插画画的,画的和原图一点都不像就是了。

之前一直在博客里面记录一下自己学习的技术技能,最近写博客的频率已经降到了一个很可怕的数值。一方面是工作的内容过于枯燥,没有什么新技术的使用,不知道要写些什么有意思的内容,另一方面就是工作确实太忙了,写一篇博客需要至少半天的时间,平时肯定是没有的,周末又要陪女票大人出去逛街。这真是现实和生活之间的巨大的矛盾啊,果然有句话是对的:成人的世界里,没有容易二字。实在伐开心。 read more

0

_rebuild_tensor_v2?pytorch版本间模型兼容性脱坑实践

最近使用Pytorch 0.4.0 进行模型训练,之后使用一个转模型的工具时,报了一个错,就是标题里面的_rebuild_tensor_v2相关的错误。最后发现是本地使用的pytorch的版本是0.3.0,和0.4.0模型上不兼容。各论坛上的解决方案都是说pytorch版本不向后兼容,建议升级pytorch。无奈我这里不方便升级pytorch版本。那么问题就来了,有没有什么不需要修改pytorch源码,或是不升级pytorch,又能让老版本的pytorch读取新版本模型的方案呢?

当然是有的,而且工作量很小。

一、Pytorch模型存储和读取的流程

首先,我们使用pytorch存储模型会使用 torch.save 这个函数,直接将模型的state_dict()保存下来。类似下面的代码:

读取参数的代码也十分简单:

而低版本的pytorch就是在load_state_dict这里报了错。

二、State Dict

我们首先要知道,model.state_dict()的返回值究竟是什么。

这里我直接给出结论:

model.state_dict()的返回值是一个collections.OrderedDict对象,它的键是一个字符串,它的值是Tensor的对象。所以造成兼容性问题的其实是Tensor对象的不兼容。

那么是不是可以将Tensor转化成一个新的非Pytorch内置的数据类型呢?这样就可以避免兼容性问题。

numpy.ndarray就是我们需要的中间态。

三、模型转换

首先,我们需要将state_dict的参数转换成numpy.ndarray保存下来。这里使用高版本的pytorch。

之后,用低版本的pytorch载入这个numpy的state_dict。

四、总结

对于这个问题,还有很多的解决方案,这里是比较简单的一种。

PS. 这是目前为止,写的最快的一篇博客了。。。

 

转载请注明出处,谢谢!