GAT:图注意力网络
论文标题 | Graph Attention Networks 论文来源 | ICLR 2018 论文链接 | https://arxiv.org/abs/1710.10903 源码链接 | https://github.com/PetarV-/GAT TL;DR 论文中提出基于注意力机制的图神经网络,利用一个隐藏的 self-attention 层,来处理一些图卷积中的问题。不需要复杂的矩阵运算或者对图结构的事先了解,通过叠加self-attention层,在卷积过程中将不同的重要性分配给邻域内的不同节点,同时处理不同大小的邻域。作者分别设计了inductive setting和transductive setting的任务实验,GATs模型在基线数据集Cora、Citeseer、Pubmed citation和PPI数据集上取得了state-of-the-art的结果。 Algorithm/Model 将卷积泛化到图表数据领域的方法可以分类为谱方法和非谱方法。其中,谱方法是基于图的谱表达,这类方法已经成功的运用在上下文节点分类上。非谱方法直接在graph上定义卷积,核心是定义一个 ...
VGAE:图变分自编码器
论文标题 | Variational Graph Auto-Encoders 论文来源 | NIPS 2016 论文链接 | https://arxiv.org/abs/1611.07308 源码链接 | https://github.com/tkipf/gae TL;DR 本文是将变分自编码器(Variational Auto-Encoders)迁移到了图领域,基本思路是:用已知的图经过编码(图卷积)学到节点向量表示的分布,在分布中采样得到节点的向量表示,然后进行解码(链路预测)重新构建图。 Algorithm/Model 假设已具有自编码器AE和变分自编码器VAE的基础知识,可以参考另一篇文章自编码器变形和变分自编码器理论介绍及其 PyTorch 实现,下面介绍如何将自编码器引入图结构中。 输入为邻接矩阵AAA 和节点特征矩阵 XXX , 通过编码器(GCN)可以得到节点向量的低维表示高斯分布(μ,σ2)(\mu, \sigma^2)(μ,σ2),然后通过解码器生成图结构(链路预测)。模型架构如下所示: 编码器 Encoder 编码器为简单的两层图卷积网络: q(Z∣X,A)= ...
Docker 容器中解决用户访问权限的问题
问题引入 默认情况下,容器中的进程以 root 用户执行,并且这个 root 用户和宿主机中的 root 是同一个用户,这意味着: 容器中运行的进程,在合适的机会下,有权限控制宿主机中的一切; 容器中运行的进程,以 root 用户执行,外界很难追溯到真实的用户; 容器进程生成的文件,是 root用户所有,普通用户没有权限读取修改。 可知,以 root 权限执行是很不方便且很不安全的。 解决方法 在容器内创建用户并且切换用户; 增加一个新用户,名为user; 让这个用户有root权限; 置其密码为 password; Container启动后以user登录,并且直接到user的home目录下; 将下面代码片段放到Dockerfile里面。 123456RUN useradd --create-home --no-log-init --shell /bin/bash user \&& RUN adduser user sudo \&& RUN echo 'user:password' | chpasswd ...
自编码器变形和变分自编码器理论介绍及其 PyTorch 实现
自编码器(autoencoder, AE)是一类在半监督学习和非监督学习中使用的网络,其功能是通过将输入信息作为学习目标,对输入信息进行表征学习,通常用于降维与异常检测。本文主要是学习传统的自编码器 AE 及其变形、和变分自编码器 VAE(Variational AE)。 自编码器 自编码器是一种无监督学习模型,利用神经网络进行表征学习将原始输入进行知识压缩,网络架构如下图所示: 模型由输入层、隐藏层及输出层构成,输出层神经元数量与输入层相同: 编码器(encoder)可以表示为: h=f(W1Tx+a)h=f\left(W_{1}^{T} x+a\right) h=f(W1Tx+a) 解码器(decoder)可以表示为: x^=g(W2Th+b)\hat{x}=g(W_{2}^{T} h+b) x^=g(W2Th+b) 模型相当于将原始输入进行重构,因此训练的目标是是重构后的 x^\hat{x}x^ 和原始输入 xxx 间的误差较小。 当输入为二值时目标函数为交叉熵函数: L(W1,W2,a,b)=−∑k=1n(xklogx^k+(1−xk)log(1−x^ ...
Python 代码优化技巧(二)
Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足,但是可以通过代码调整来提高代码的执行效率。本文整理一些代码优化技巧。 代码优化基本原则 代码正常运行后优化。 很多人一开始写代码就奔着性能优化的目标,“让正确的程序更快要比让快速的程序正确容易得多”,因此,优化的前提是代码能正常工作。过早地进行优化可能会忽视对总体性能指标的把握,在得到全局结果前不要主次颠倒。 权衡优化的代价。 优化是有代价的,想解决所有性能的问题是几乎不可能的。通常面临的选择是时间换空间或空间换时间。另外,开发代价也需要考虑。 优化关键耗时部分。 如果对代码的每一部分都去优化,这些修改会使代码难以阅读和理解。如果你的代码运行速度很慢,首先要找到代码运行慢的位置,通常是内部循环,专注于运行慢的地方进行优化。在其他地方,一点时间上的损失没有什么影响。 优化技巧 避免全局变量 在函数中编写代码而不要将其写为全局变量。 由于全局变量和局部变量实现方式不同,定义在全局范围内的代码运行速度会比定义在函数中的慢不少。通过将脚本语句放入到函数中,通常可带来 15% - 30% 的速度提升 ...
数据类别的不平衡问题与过采样方法比较
背景 数据类不平衡问题(Class-imbalance)是指在训练分类模型时所使用的训练集的标签类别分布不均匀。例如正类样本995个,负类样本仅5个(少数类),这样的数据集中就存在类不平衡问题。 对于不平衡类的研究通常认为不平衡意味着少数类只占少于10%到20%。 对于数据集中类别不平衡的问题是否需要特殊处理,需要取决于训练出来的模型在验证集中的效果,如果效果较好说明没有必要进行处理。 类不平衡导致的问题可能导致模型出现问题,模型训练过程中某类的样本数量太少说明在训练过程中提供的“特征信息”少,模型对少数类的判定效果差。可能由于验证集准确率较高而终止优化那么会导致模型不知如何去判别出少数类。 解决方案 对于数据不平衡问题,当前有不同的方法来缓解: 取决于数据,不处理时可能效果也不差。 数据层面上通过某种方法是数据更加平衡: 对于少数类进行过采样; 对于多数类进行欠采样; 合成新的少数类样本; 舍弃所有少数类,使用异常检测框架。 算法层面上调整模型: 调整类权重; 调整决策阈值; 使用已有的算法对少数类更加敏感; 构造一个在不平衡数据上表现效果好的全新算法。 注意: ...
PyCharm + Jupyter + Docker 搭建远程机器学习开发环境
背景 作为机器学习开发者,一般都在远程连接服务器开发,每次搭建本地环境实在是太麻烦了啊!本文主要记录个人远程开发环境的搭建过程。 本文需要一定的背景知识,已了解如何使用 docker 和 pycharm!No BB,下面直接上! Docker 配置 创建容器 前提是容器中 Python 开发环境已搭建好,例如本人执行命令: 后台执行容器: 1docker run -d -p 8022:22 --name='dreamhomes' -v /home/workspace:/home/workspace dreamhomes/dev-env 然后再进入容器中: 1docker exec -it dreamhomes bash 创建容器并进入交互界面: 1docker run -it -p 8022:22 --name='dreamhomes' -v /home/workspace:/home/workspace dreamhomes/dev-env bash 进入容器 如果容器内未安装ssh服务则需安装,如果已安装则省略此步骤: 12 ...
Scala Jupyter中配置Scala kernel
背景 对于初学者入门 Scala 编程,如果在学习过程中需要编写一些代码片段来实操 Scala 语法的时候是怎么测试的呢?对于菜鸡的我起初只想到了两种方法: Scala Terminal:在终端中进行交互。 IntelliJ IDEA:IDE中编写代码片段。 在实践的时候就慢慢发现上述两种的方法的弊端:Scala Terminal 中测试语法没有问题但不能保存语法介绍和说明,遗忘之后不能再次查询;IDEA 非常强大但对于初学者测试代码片段就有点杀鸡用牛刀的感觉(PS:打开IDEA就写一小段代码也太浪费电脑资源了😂)!因此是否存在高性价比的工具来解决这问题呢?答案是有的! 类比于python的学习,是否想起有一款 jupyter notebook 交互编程环境呢?Jupyter notebook中编写python脚本实时交互可视化太爽了,如果jupyter notebook 能支持 scala 语法多么完美啊!心里一想然后一搜,卧槽!真有!开源大佬牛鼻!!!传送门直达~ 本文就介绍如何在jupyter notebook 中配置 scala 交互式编程环境。 配置流程 安装scal ...
Scala 系列学习教程
Jupyter 中的 Scala 系列教程 目前根据网上的教程学习了 Scala 的基础语法,记录下来待以后查询。 基础语法 Scala 简介与安装配置 Jupyter Lab 中配置 Scala kernel Scala 基本语法与规则 Scala 条件和循环语句 Scala 集合类型 Scala 类、对象和Trait Scala 模式匹配与异常处理 Scala 正则表达式 Scala 文件 I/O 学习资料 菜鸟教程/Scala教程 lauris/awesome-scala 目前由于未涉及到实际项目的处理,仅更新基础理论知识,待以后在工作中边学习边更新! 联系作者
Scala 正则表达式
本文主要介绍 Scala 中的正则表达式的简单用法,在 jupyter 中学习效果更加哦!传送门~ Scala 正则表达式 Scala 通过 scala.util.matching 包中的 Regex 类来支持正则表达式。 12345// 使用正则表达式查找单词 Scalaval pattern = "Scala".rval str = "Scala is Scalable and cool"println(pattern findFirstIn str) Some(Scala) 实例中使用 String 类的 r() 方法构造了一个 Regex 对象。 然后使用 findFirstIn 方法找到首个匹配项。 如果需要查看所有的匹配项可以使用 findAllIn 方法。可以使用 mkString() 方法来连接正则表达式匹配结果的字符串,并可以使用管道(|) 来设置不同的模式: 123456import scala.util.matching.Regexval pattern = new Regex("(S|s)cala") ...
Scala 模式匹配与异常处理
本文介绍 Scala 中的模式匹配与异常处理,这两部分内容放在一起的原因是 Scala 中的异常处理是利用模式匹配的思想! 在 Jupyter 中学习效果更加哦!传送门~ Scala 模式匹配 Scala 提供了强大的模式匹配机制,一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 1234567// 模式匹配实例def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many"}println(matchTest(3)) many match 对应 Java 里的 switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。 match 表达式通过以代码编写的先后次序尝试每个模式来完成计算,只要发现有一个匹配的 case, ...
Scala 类、对象与特征
Scala作为纯面向对象语言,其类定义学习的重要性不言而喻。本文将介绍Scala 中的类(class)、对象(object)及其 特征(trait)。在 Jupyter 中学习体验更加哦!传送门~ Scala 类和对象 类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。 Scala中的类不声明为public,一个Scala源文件中可以有多个类。Scala 的类定义可以有参数,称为类参数,如下面的 xc, yc,类参数在整个类中都可以访问。可以使用 new 关键字来创建类的对象。 123456789101112131415161718import java.io._class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("x 的坐标点: " + x); println ...
Scala 条件与循环语句
Scala 的基础语法与 Java 类似,对于计算机专业学过 Java 的同学较为友好!对于 Python 开发者就怕写出 Pythonic Scala,还是需要简单记录一下。本文简单介绍下Scala中的基本语法和规则,后续再填充。 基本语法 Scala 基本语法需要注意以下几点: 区分大小写 Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。 类名 对于所有的类名的第一个字母要大写。如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。如:class MyFirstScalaClass 方法名称 所有的方法名称的第一个字母用小写。如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。如:def myMethodName() 程序文件名 程序文件的名称应该与对象名称完全匹配。保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加".scala"为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。如: 假设HelloWorld是对象的名称,那么该文件应保存为Hello ...
利用镜像解决开发环境中一系列下载速度慢的问题
docker pull 速度慢的问题 最近docker pull 下载远程镜像时,速度慢的简直难以忍受!于是搜索了一下解决方法在此记录下来! 主要解决思路是使用阿里云镜像加速器,个人专属加速地址可以登录阿里云查看:网站地址传送门~ 解决方法 登录阿里云查看个人加速地址: 在配置镜像加速器一栏选择自己的系统,例如我选择的是 Ubuntu。然后根据下面的配置方法配置即可解决问题,速度快的飞起~~~~ pip install *** 速度慢的问题 pip install 报错:read timed out 问题。 解决方法 主要思路是使用清华大学镜像地址:https://mirrors.tuna.tsinghua.edu.cn/ 至于安装可以使用命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package-name 例如安装jupyterlab命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab conda install ...
IntelliJ IDEA + Pycharm 2020.1 版安装与破解教程
最近更新Pycharm2020.1时发现,本文的激活方法同时适用。 IntelliJ IDEA 下载 最新版下载地址,小编使用的是windows版。 官网地址:https://www.jetbrains.com/idea/download/#section=windows 直接下载进行安装; 破解补丁下载 百度云补丁下载地址: 链接:https://pan.baidu.com/s/1t5SoNEaN79LXlTyX2v1NIw 提取码:xgs4 破解方法 安装好软件选择试用; 下载补丁完成后,解压补丁文件; 直接将lib目录下的jetbrains-agent.jar文件拖入IDE界面中; 在弹出来的界面中选择验证码方式安装补丁; 完成安装后重启,软件完成破解; 如果失效那么使用激活码激活; 联系作者