0%

在Pytorch里面使用交叉熵loss函数的时候,发现结果最是比较差,通过搜索才发现这样一段话:

You should pass raw logits to nn.CrossEntropyLoss, since the function itself applies F.log_softmax and nn.NLLLoss() on the input.

也就是用交叉熵损失的时候,不能在网络的最后用 log_softmax 或者 Softmax层,因为交叉熵损失相当与是 log_softmax + NLLLos的组合。

如果网络最后用了Softmax层的话,需要使用 NLLLoss 或者 MSE loss

参考:

  1. https://discuss.pytorch.org/t/logsoftmax-vs-softmax/21386/9

这里列出了我平时关注的一些技术博客列表,希望给看到这个页面的你一些新的知识来源:

  1. https://ruanyifeng.com/ 阮一峰的网络日志,应该不需要我介绍他是谁了吧
  2. https://ring0.me/ 科大师兄的网站
  3. http://blog.devtang.com/
  4. https://www.yejianye.com/
  5. https://ewind.us/
  6. https://www.barretlee.com/entry/
  7. https://www.hahack.com/

另外发现,最近大家不怎么更新自己的博客了,至于为什么,我想了几个可能的原因。

一个是缺少来自用户的反馈,或者激励。大部分博客,来自读者的反馈少,不像知乎,微信公众号,有方便及时的用户反馈和激励(点赞,在看,收藏),反馈少对作者写作的积极性应该还是很有很大影响的。

另一个是写博客还是有一定成本的。自己搭建的博客,需要自己维护环境,不像公众号和知乎,打开网页就能写,实时保存草稿。

在中文互联网越来越碎片化和圈地化的今天,希望独立的技术博客能给我们带来新的思路,新的启发,新的激动人心的东西。

概述

最近在学习Libtorch——即Pytorch的C++版本,需要使用 Pytorch 导出的 tensor 以便对模型进行 debug。下面是转换代码,总体原理是将 tensor 转换为二进制数据,再在 C++ 里面读入。

阅读全文 »

概述

doctest 是 python 系统库中用于交互式会话例子测试的工具,用于搜索以 >>> 开头的语句,并且将其作为Python命令,对结果进行测试。

这个工具可以方便地用于检测自己写的库是否有bug,例如某些函数功能可能发生改变,借此工具可以方便地对代码中的示例语句进行测试。

阅读全文 »

C++17标准库里面引入了轻量级的只读字符串表示类型string_view,用来替代const char*const string&,在传入函数的时候减小内存开销(因为string_view类只包含字符串的指针和字符串的长度值,开销小于string类型)。

阅读全文 »

0. 概述

Python有各种各样的系统包和第三方开发的包,让我们的开发变得异常容易。不过也引入了一个问题,不同代码需要的包版本可能是不一样的,所以常常回出现这种情况,为了代码B修改了依赖包的版本,代码B能work了,之前使用的代码A就没法正常工作了。因此常常需要对不同的代码设置不同的Python虚拟环境。venv是Python自带的虚拟环境管理工具,使用很方便,这里简单记录一下使用方法。

阅读全文 »

2020流水记录

新的一年又开始了,记录一下2020年发生的一些事情,作为对这不平凡的一年的简单的回顾。

1月14日,农历腊月二十,我和彤彤在我家结婚了,作为主人翁参与其中,是一种很神奇却很美好的感觉,结婚的大小事情都是爸妈和村里的亲戚邻居一起来做的,很感谢爸妈亲戚邻居们的付出,让寒冬里面的腊月二十热闹而温暖。

关于结婚几天发生的事情,我写了一些流水账记录,不过后面没有完全写完,等有空了再回忆回忆,完全写完再发出来吧,也算是给自己一个交代。

总之非常感谢所有人的帮助和支持。

阅读全文 »

NumPy提供了很多开箱即用的函数,用处非常大,所以写C++的时候,让人无比怀念,要是有一个替代版本,就太好了。最近搜索发现, NumCpp 这是我想要的,而且因为是 Header-only的库,因此使用时不需要编译,直接添加到头文件包含目录即可,使用很方便。不过NumCpp使用了boost库,需要进行一些下载和配置,这里记录一下。

阅读全文 »

概述

  1. detectron2 大部分代码都需要GPU
  2. detectron2 主要是用于检测和分割的代码框架,像分类这种任务的代码暂时没有
  3. 官方示例有一些是基于Colab的,需要科学上网才能访问

    安装依赖

    1
    2
    3
    4
    5
    sudo pip install -U torch==1.4+cu100 torchvision==0.5+cu100 -f https://download.pytorch.org/whl/torch_stable.html
    sudo pip install cython pyyaml==5.1 --ingnore-installed

    # 安装 cocoapi
    sudo pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
    其中cocoapi 需要从GitHub下载代码,如果安装太慢,可以先clone下代码,再进PythonAPI子目录,运行setup.py安装:
    1
    2
    3
    git clone https://github.com/cocodataset/cocoapi.git
    cd cocoapi/PythonAPI
    sudo python3 setup.py install

安装 detectron2

这里直接安装编译好的二进制文件。

1
sudo pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu100/index.html

如果文件下载太慢或者超时,可以手动在浏览器里面下载好文件,再用下面的命令安装(假设下载的whl文件是xxx.whl):

1
sudo pip install xxx.whl

安装完后,打开 Python 命令行,执行下面的命令,如果不报错,说明安装成功:

1
import detectron2

测试

为了测试,需要下载 detectron2 的源代码,基于 demo/demo.py 进行简单的测试:

1
2
git clone https://github.com/facebookresearch/detectron2
python3 detectron2/demo/demo.py --config-file detectron2/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --input ~/test.jpg --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl

注意上述代码需要在 detectron2 的 git 仓库外面执行,否则会报错。
测试时输入支持单张图片、多张图片、单个图片文件夹、网络摄像头以及视频文件,每种情况参数设置如下:

1
2
3
4
5
6
7
8
9
10
# 单张图片
--input test.jpg
# 多张图片
--input test1.jpg test2.jpg test3.jpg
# 单个图片文件夹
--input imgs/*.jpg
# 网络摄像头
--webcame
# 视频文件
--video-input test.mp4

``–opts MODEL.WEIGHTS表示测试用的模型参数,可以是一个本地目录,也可以是一个detectron2://`开头的一个模型路径,这时会先下载模型到本地再测试:

1
2
3
4
# 使用本地的模型参数
--opts MODEL.WEIGHTS ./model_final_f10217.pkl
# 使用网络模型地址
--opts MODEL.WEIGHTS ./model_final_f10217.pkl

模型的名字可以在 Model Zoo 查看。

训练

训练代码参考 tools/train_net.py,目前Detection看。

一些代码分析

  1. DefaultTrainer 是针对目前常用的Detection设置而写的一个类,为了不用修改太多就直接复现最佳结果。但另一方面,由于有比较多的假设情况,因此通用性有所降低
  2. SimpleTrainer 是 DefaultTrainer 的父类,限制条件更少,对于做新的研究任务,作者推荐继承 SimpleTrainer 来修改
  3. 代码支持多机多卡多进程,基于 Pytorch 的多级多卡代码写了一些wrapper
  4. 代码注释很完善,而且其中很多是给用户怎么基于现在代码进行修改来跑新的网络、做新的任务,有些地方说的很细致,这一点很棒

一些资源

  1. 文档
  2. Git 仓库

在启用/关闭 VPN 的时候, WSL 里面,有时候网络会无法连接。根据这里的讨论,这是由于 WSL 在网络变化的时候,未能正确解析 DNS 导致的。网友在这里也给出了一个解决办法,试了以后是可以的,因此记录下来。

阅读全文 »