这学期老师让我研究图神经网络(GNN),但是这玩意有点大。一方面可以研究GNN的理论,解决目前GNN存在的问题;另一方面可以研究GNN的应用。跟老师详细探讨之后,发现老师想让我研究GNN在Few-Shot Learning上的应用。

上周读了几篇论文,想要总结一下。看看会不会有什么新的想法。

问题定义

其实,GNN可以用在四种学习任务中:Few-shot Learning、Zero-Shot Learning、Semi-supervised Learning和Avtive Learning。那么具体这几种任务有何区别呢?下面我们对这几种任务进行详细的说明及区分。

这几个问题都可以应用在不同的问题中,例如小样本目标检测,小样本数据分类。这里我的主要研究方向主要为小样本数据分类。所以下面的主要阐述均是针对小样本数据分类而言的。

阅读全文 »

在pytorch中,官方向我们提供了用于学习率控制的辅助类Scheduler,这些类位于torch.optim.lr_scheduler下。在这些类中提供了基于epoch的学习率调整方法。

torch.optim.lr_scheduler.LambdaLR

将每一个参数组的学习率设置为初始学习率乘以给定的学习率,当last_epoch=-1时,将学习率设定为初始学习率。

例如:

1
2
3
4
5
6
7
>>> lambda1 = lambda epoch: epoch // 30
>>> lambda2 = lambda epoch: 0.95 ** epoch
>>> scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()
阅读全文 »

ToTensor

Pytorch中有ToTensor()函数,经常用在加载数据的时候。注意该函数的API文档是这样说的:

1
2
3
4
5
6
7
8
9
 """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.

Converts a PIL Image or numpy.ndarray (H x W x C) in the range
[0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0]
if the PIL Image belongs to one of the modes (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1)
or if the numpy.ndarray has dtype = np.uint8

In the other cases, tensors are returned without scaling.
"""

也就是说,当该函数的输入为numpy.ndarray (H x W x C) np.uint8或者PIL Image(L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1)的时候,会对数据进行归一化处理。对于图像分割任务,一二分类为例,当类标为{0,1}的时候,满足以上条件,照样会对数据进行预处理。此时,类标就会变成很小的数,导致网络预测出的结果全为0。

值得注意的是,torchvision0.2.0并没有上面输入的前提,全部会归一化,也就是说下面的代码是错误的,而在torchvision0.2.0没有问题。

1
2
3
4
5
6
7
8
9
10
11
12
mask = Image.open(mask_path)
mask = mask.resize((224, 224))
# 将255转换为1, 0转换为0
mask = np.around(np.array(mask.convert('L'))/256.)
# mask = mask[:, :, np.newaxis] # Wrong, will convert range
mask = np.reshape(mask, (np.shape(mask)[0],np.shape(mask)[1],1)).astype("float32")
to_tensor = transforms.ToTensor()

transform_compose = transforms.Compose([to_tensor])
mask = transform_compose(mask)
mask = torch.squeeze(mask)
return mask.float()

对于这种情况,可以使用torch.from_numpy用法。避免不同torchvision版本的不同造成错误的影响。

1
2
3
4
5
6
mask = Image.open(mask_path)
mask = mask.resize((224, 224))
# 将255转换为1, 0转换为0
mask = np.around(np.array(mask.convert('L'))/256.)
mask = torch.from_numpy(mask)
return mask.float()

阅读全文 »

在对模型进行训练时,有时会需要冻结模型的一部分参数,不对其进行更新,而只更新剩余部分的参数。

tensor.requires_grad属性

在pytorch0.4版本之后,对Variabletensor进行了合并,通过设定tensor.requires_grad属性可以控制是否计算tensor的梯度。

1
2
x = torch.ones(1)  # create a tensor with requires_grad=False (default) x.requires_grad
x.requires_grad

默认情况下,创建的tensorrequires_grad属性为False,而创建的moduleparametersrequires_gradTrue

Optimizer控制参数的更新

阅读全文 »

常用指令

从github中同步代码到本地,以github分支为master为例

1
git pull origin master

从本地同步代码到github,以同步所有代码,github分支为master为例:

1
2
3
git add .
git commit -m "init"
git push origin master

查看当前所有远程分支

1
git branch -r

查看当前所有本地分支

1
git branch

阅读全文 »

最近要找工作,做了一些html文件,想要放在网站上,将链接放到简历上。让人家直接预览自己所做的工作,并且将自己做的报告放到网上,实现直接预览PDF功能。

知道这些需求之后,我就开始行动了。趁着自己还是学生。买了阿里的一个月的云服务器。一个月9.5。感觉还行吧。虽然比本科的时候,1元一个月的。

阿里云跟腾讯云相比确实好用很多。有很多镜像可以使用。例如WordPress、LAMP环境等等。

在这里,为了方便,我们选择了基于Centos的LAMP的应用镜像。之所以没有选择WordPress的,是因为我们这里并不是想用WordPress,而是只是想使用Apache服务器。

阅读全文 »

最近做了一些关于图像分割的任务,但是对于如何评价图像分割的好坏,之前自己并没有一个很深刻的了解。今天上午对这些指标进行一个总结。

图像分割中通常使用许多标准来衡量算法的精度。这些标准通常是像素精度及IoU的变种,以下我们将会介绍常用的几种逐像素标记的精度标准。为了便于解释,假设如下:共有$k+1$个类(从$L_0$到$L_k$,其中包含一个空类或背景),$p_{ij}$表示本属于类$i$但被预测为类$j$的像素数量。即$p_{ii}$表示真正的数量,而$p_{ij}, p_{ji}$则分别被解释为假正和假负,尽管两者分别为假正与假负数量之和。

基础知识

如下图所示,红色圆代表真实值,黄色圆代表预测值。橙色部分红色圆与黄色圆的交集,即真正(预测为1,真实值为1)的部分,红色部分表示假负(预测为0,真实为1)的部分,黄色表示假正(预测为1,真实为0)的部分,两个圆之外的白色区域表示真负(预测为0,真实值为0)的部分。

如何理解上面在说明真正、假负、假正、真负时用到的0和1呢?这个我觉得这么解释可能更加清晰。

阅读全文 »

在这学期刚开始的时候深入接触了TensorFlow的session和graph概念,虽然相比之前对Tensorflow有了更加深刻的理解。但是有的时候写起来代码还是不能随心所欲。幸好后来接触到了Pytorch框架,感觉设计的很少优雅,清晰易懂,想怎么写怎么写~再加上前段时间好好学习了什么是交叉熵。下面对Pytorch的损失函数进行详细的总结。其中大部分内容均来自于pytorch loss function 总结,然后会加上一些自己的看法。

最近看了下 PyTorch 的损失函数文档,整理了下自己的理解,重新格式化了公式如下,以便以后查阅。

值得注意的是,很多的 loss 函数都有 size_average 和 reduce 两个布尔类型的参数,需要解释一下。因为一般损失函数都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 (batch_size, ) 的向量。

  • 如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss;
  • 如果 reduce = True,那么 loss 返回的是标量
    • 如果 size_average = True,返回 loss.mean();
    • 如果 size_average = True,返回 loss.sum();

所以下面讲解的时候,一般都把这两个参数设置成 False,这样子比较好理解原始的损失函数定义。

阅读全文 »

之前在大三的时候,就已经接触这个库了,但是那个时候我是拒绝使用的,因为感觉好复杂。Python命名有更加简单的库去处理excel和csv文件。但是后来发现无法绕过去,因为pandas在数据科学中被广泛使用,其功能特别强大。最近参加kaggele竞赛的时候,提交结果的时候通常是csv文件。想了想,算了系统的学习一下吧。

数据类型

Pandas库有很一些自定义的数据结构,例如DataFrame和Series。下面我们对这些数据结构进行详细的介绍。

Series

它是一维标记数组,可以存储任意数据类型:int/string/float/Python对象,创建Series方法例子:

1
2
s = Series(data, index = index)
# data可以是Python字典/ndarray/标量值

阅读全文 »

最近老师买了两块华为海思A3559AV100的芯片,虽然自己内心不太想搞,但是2333,算了。还是看看吧。万一以后有用呢。在这先做个笔记。

该芯片的资料大概100多个G,但是有用的其实不太多。其中能够让我们马上上手的文档为Hi3559A╱C V100 开发环境用户指南.pdf,该文件目录为59A开发资料2018/开发资料hi3559A/原厂SDK/Hi3559A V100R001C02SPC002-正式版/ReleaseDoc/zh/01.software/board。首先打开该pdf,我们一步步的看如何搭建该芯片的开发环境。

交叉编译工具链

因为该芯片是ARM架构的处理器,而我们的PC通常为X86架构的。所以需要在PC上安装交叉编译工具,使得我们可以在PC上编译能够在ARM上运行的编译器。

这里我们需要用到的文件为aarch64-himix100-linux.tgzgcc-arm-none-eabi-4_9-2015q3.tgz,这两个文件均在59A开发资料2018/开发资料hi3559A/交叉工具链目录下可以找到。

阅读全文 »