暑假基本上也没做什么事情,就和小伙伴一起参加了Kaggle SIIM-ACR Pneumothorax Segmentation Challenge 比赛。最终名次34th,top3%,银牌。第一次真正的参加Kaggle比赛,取得这个成绩感觉还可以。特来进行一番总结,毕竟学到了很多东西。不总结的话就忘了。

另外,这次比赛的源代码已经释放出来了,具体点这里

任务介绍

这次比赛的主要任务是从胸部X光图片中判断图片是否含有气胸,如果含有的话分割出气胸。

比赛分为两个阶段,第一个阶段测试集数据有1372张,每天有5次提交机会,比赛时间较长,你可以根据第一阶段的测试集调整优化你的模型。在第一阶段结束之前,需要提交所用的代码,代码中包含两个模型(可以集成,这里两个模型的意思应该是产生两个submission)。注意提交完模型后,在第二阶段你不能再更改超参数以及阈值(自动化的阈值选取方法是允许的),但是可以更改路径以及重新训练。

阅读全文 »

最近在做比赛的时候,遇到了一个最好结果,但是之后无论怎样都复现不出来最好结果了。猜测是不是跟Pytorch中的随机种子有关。

训练过程

在训练过程中,若相同的数据数据集,相同的训练集、测试集划分方式,相同的权重初始化,但是每次训练结果不同,可能有以下几个原因:

  • Dropout的存在
  • Pytorch、Python、Numpy中的随机种子没有固定
  • 数据预处理、增强方式采用了概率,若没有设置固定的随机种子,结果可能不同。例如常用数据增强库albumentations就采用了Python的随机产生器
  • 训练数据集被随机打乱了顺序
  • 向上采样和插值函数/类的向后是不确定的(Pytorch的问题)

另外,在Pytorch官方文档中说明了在Pytorch的不同提交、不同版本和不同平台上,不能保证完全可重现的结果。此外,即使使用相同的种子,因为存在不同的CPU和GPU,结果也不能重现。

阅读全文 »

解决 Linux 和 Windows 双启动带来的时间同步问题

问题发现

本子上装的是Window 10(win7升级)和Ubuntu GNOME 14.04的双系统, 一直以来都发现双系统切换后系统的时间显示有问题

每次都发现进入ubuntu系统的时间显示不正确, 只有再重新使用网络对时之后系统的时间才正常

但是问题不仅于此, 切环回window之后, 会发现系统的时间也不正常了, window一直是网络自动对时的啊, 然后无语, 只能再次联网强制同步网络时间.

阅读全文 »

之前一直觉得一些平台上的博客比较优秀,真的是作者经过思考。例如当我查到一些文章的时候,若同时来在于CSDN、知乎、简书、CMD Markdown。那么我会看的顺序则为CMD Markdown > 简书 > 知乎 > CSDN。尤其是CSDN,基本都是照抄。虽然我也照抄。。最近在做图像分割的比赛。因为遇到了瓶颈,不能再停留在表面了,需要深挖一下内部原理。看到CMD Markdown上有一篇文章不错,特来照抄一下。

本文翻译自An overview of semantic image segmentation,原作者保留版权。

这篇文章讲述卷积神经网络在图像语义分割(semantic image segmentation)的应用。图像分割这项计算机视觉任务需要判定一张图片中特定区域的所属类别。

这个图像里有什么?它在图像中哪个位置?

更具体地说,图像语义分割的目标是将图像的每个像素所属类别进行标注。因为我们是预测图像中的每个像素,这个任务通常被称为密集预测(dense prediction)。如下图所示

阅读全文 »

在前端时间,我使用了Ngrok实现了内网穿透,但是遇到了几个问题:

  • 有的时候服务端会莫名其妙崩掉,网上说有可能是内存泄漏问题
  • 暂时无法实现多客户端(可能官方支持,但是我没摸索)
  • 软件好久不更新了,可能存在着未知的bug和未知的漏洞
  • 需要有一个域名

于是,我又把目光投向了frp,发现这个软件真的是太棒了,支持的功能很多、文档很齐全配置相当方便、比较稳定、不需要自己编译并且还在持续更新中。本来觉得不需要这篇文章的,但是算了,还是写吧,因为其中也有一部分坑。

准备工作

  • 这里下载最新的软件。例如我这里服务端和客户端均为amd64架构的Linux系统,所以要下载最新frp_0.28.0_linux_amd64.tar.gz版本
  • 一台有公网IP的服务器
阅读全文 »

最近参加kaggle比赛,才发现对于图像分割损失函数有各种形式。同时,关于如何实现这些损失函数,尤其是加权的损失函数,之前并没有研究过。但是在实际应用中,应该还是挺常见的,毕竟样本不均衡问题时有发生。好了,废话不多说了, 进入正题。下面的内容均以二分类问题为例。

cross entropy

图像分割任务的本质为对于像素点的分类,通常称为密集预测(dense prediction)。分类问题自然可以使用cross entropy(交叉熵损失函数)。

设真实情况下$\mathbf{P}(Y = 0) = p$,$\mathbf{P}(Y = 1) = 1 - p$。通过 logistic/sigmoid 函数得到的预测$\mathbf{P}(\hat{Y} = 0) = \frac{1}{1 + e^{-x}} = \hat{p}$,$\mathbf{P}(\hat{Y} = 1) = 1 - \frac{1}{1 + e^{-x}} = 1 - \hat{p}$,则交叉熵损失函数CE为

在keras中,对应函数为binary_crossentropy(y_true, y_pred),在TensorFlow中,对应函数为softmax_cross_entropy_with_logits_v2,在Pytorch中,对应的损失函数为torch.nn.BCEWithLogitsLoss()

阅读全文 »

前言

首先说一下,什么是内网穿透?我举个栗子,比如你在本地搭建的网站,想让局域网外的人访问,该怎么实现?这里有个很多人都熟知的工具:花生壳。最开早我用的是向日葵+花生壳,一个实现远程连接;一个实现内网穿透;在后来自己买了阿里云服务器,感觉不用了很可惜,正好最近需要回家,要在家远程访问我的服务器。后来在网上查到有ngrok这样的神器。在这里记录一下自己的折腾之路。

安装环境

一台云服务器,一个域名,并且域名泛解析解析到云服务器,此处我用的服务器的操作系统为CentOS7(amd64)

安装gcc和git(用于下载ngrok源码)

1
2
yum install gcc -y
yum install git -y

阅读全文 »

服务器Nginx配置

登录到Centos系统root用户。

安装 Git Nginx

1
yum install -y git nginx

Nginx 配置(创建文件目录, 用于博客站点文件存放):

1
2
3
cd /usr/local/
mkdir pub
chmod 775 -R /usr/local/pub/

添加 index.html,用于检测配置 Nginx 是否成功:

阅读全文 »

基本知识

  • 反馈的分数是基于测试集的一部分计算的,剩下的另一部分会被用于计算最终的结果。所以最后排名会变动。
  • LB 指的就是在 Leaderboard 得到的分数,由上,有 Public LB 和 Private LB 之分。
  • 自己做的 Cross Validation 得到的分数一般称为 CV 或是 Local CV。一般来说 CV 的结果比 LB 要可靠。

数据标准化

数据需要进行归一化或者标准化的重要性就不再提了,想必大家都知道。在Pytorch中,对于图像数据,通常使用totensor方法进行归一化,然后使用normalize方法进行标准化。另外,在使用ImageNet预训练权重的时候,均值和方差也尽量使用ImageNet数据的均值和方差。在siim-acr-pneumothorax-segmentation比赛中,数据为胸部放射图像,使用ImageNet数据的均值方差比使用该数据集的均值方差效果好。一种解释是,网络本质学习的是数据的分布,使用ImageNet的均值和方差可以保证得到的数据分布和预训练权重学习到的数据分布相差不大。当然,使用ImageNet数据的均值方差不一定一定比特定数据集的均值方差好,这需要实验。

数据增强

阅读全文 »

在上研究生之前,自己配了一台电脑。最近马上就研二了,学校也配了一个电脑。于是乎,我就有了两台电脑和两个显示屏。本来可以只靠一个电脑主机和两个显示器就可以正常愉快的玩耍了。但是当我的电脑跑深度学习环境的时候,变得特别卡。于是乎,就有了下面各种神奇的骚操作。

首先,我们梳理下已有的设备:

  • 一套鼠标键盘
  • 两个显示器:以主显示器和副显示器命名区分两个显示器
  • 两个主机:以学校主机(Windows系统)和我的主机(Ubuntu系统)命名区分两个主机

观察到我的主显示器有多个输入,例如DP口、HDMI口、VGA口等。我可以调整主显示器的菜单切换显示源。所以拿一条DP线连接我的主机和主显示器,另一条VGA线连接学校主机和主显示器,最后一根HDMI线连接我的主机和副显示器。当两个电脑都开机的时候,我可以调整主显示器菜单切换两台电脑。

现在,还有一个问题,我只有一套比较好的鼠标键盘,怎么办呢?如果经常切换两台电脑,两套鼠标键盘也不太方便啊。答案是使用Synergy神器。

阅读全文 »