Peter's Blog


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索

Mask矩阵在深度学习中的应用

置顶 | 发表于 2019-08-01 | 分类于 深度学习 , NLP

定义

mask矩阵是一个由0和1组成的矩阵。在NLP中,一个常见的问题是输入序列长度不等,而mask可以帮助我们处理。虽然RNN等模型可以处理不定长的输入,但是在实践中,需要对输入中长度较短的句子进行填充,即在句尾填充0占位,转换成固定大小的tensor,方便矩阵操作。

举个例子:

1
2
case 1: I like cats.
case 2: He does not like cats.

假设默认的序列长度是5,一般会对case 1做pad处理,变成

1
I like cats <PAD> <PAD>

在上述例子数字编码后,开始做embedding,而pad也会有embedding向量,但pad本身没有实际意义,参与训练可能还是有害的。因此,有必要维护一个mask tensor来记录哪些是真实的value,上述例子的两个mask如下:

1
2
1 1 1 0 0
1 1 1 1 1

后续再梯度传播中,mask起到了过滤的作用。

使用TensorFlow实现上述过程:

1
2
3
4
5
6
7
8
import tensorflow as tf
maxlen = 5
lengths = [[3, 5, 4], [1, 3, 2]]
mask = tf.cast(tf.sequence_mask(lengths, maxlen), tf.float32)
sess = tf.Session()
mask = sess.run(mask)
print(mask)

运行结果:

1
2
3
4
5
6
7
[[[1. 1. 1. 0. 0.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 0.]]
[[1. 0. 0. 0. 0.]
[1. 1. 1. 0. 0.]
[1. 1. 0. 0. 0.]]]
阅读全文 »

Git常用操作记录

置顶 | 发表于 2019-03-24 | 分类于 Git

基本操作

Git基本配置(git config)

git config可以配置git的参数,可以使用git config --list查看已经配置的git参数。其中有三个级别的保存位置,—system、—global、—local,分别表示所有用户(本系统)、当前用户(全局)、本地配置(当前目录),默认使用—local。

配置用户名及邮箱
在使用Git提交前,必须配置用户名和邮箱,这些信息会永久保存到历史记录中。

1
2
git config --global user.name "Peter"
git config --global user.email Peter@gmail.com
  1. 创建Git仓库(git init)

    可以直接调用git init初始化当前目录,即创建Git仓库。

  2. 获取Git仓库(git clone)

    如果需要克隆远程仓库,可以使用git clone,比如:

    1
    git clone https://github.com/tensorflow/tensorflow.git
阅读全文 »

Tensorflow中矩阵乘法matmul和multiply详解

置顶 | 发表于 2018-04-09 | 分类于 tensorflow

在机器学习或者神经网络编程过程中,我们的运算对象通常是矩阵,而常用的矩阵操作就是点乘(dot product)和元素相乘(elementwise multiplication)。学过线性代数的读者肯定对点乘不会陌生,但是元素相乘就不一定知道了。其实elementwise multiplication就是将两个shape一样的矩阵按照对应元素相乘。

点乘matmul

在tensorflow中的点乘使用matmul方法,其中matmul分两种情况。

首先我们通过一个例子来了解matmul方法的使用 :
代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import tensorflow as tf
""" 2-D """
print("2-D:")
sess = tf.Session()
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3]) # 2-D tensor `a`
print("a = ", sess.run(a))
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2]) # 2-D tensor `b`
print("b = ", sess.run(a))
c = tf.matmul(a, b)
print("c = ", sess.run(c))
""" 3-D """
print("3-D:")
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3]) # 3-D tensor `a`
print("a = ", sess.run(a))
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2]) # 3-D tensor `b`
print("b = ", sess.run(a))
c = tf.matmul(a, b)
print("c = ", sess.run(c))
sess.close()

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2-D:
a = [[1 2 3]
[4 5 6]]
b = [[1 2 3]
[4 5 6]]
c = [[ 58 64]
[139 154]]
3-D:
a = [[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
b = [[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
c = [[[ 94 100]
[229 244]]
[[508 532]
[697 730]]]
阅读全文 »

机器学习模型评估方法及代码实现

发表于 2020-01-10 | 分类于 机器学习

混淆矩阵

混淆矩阵(confusion matrix)如下所示:

真实\预测 正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

TP: 将正例预测为正例(预测正确);

FN: 将正例预测为负例(预测错误);

FP: 将负例预测为正例(预测错误);

TN: 将负例预测为负例(预测正确)。

正例包括 TP、FN;反例包括 TN、FP

阅读全文 »

轻量级Git服务Gogs搭建教程

发表于 2019-12-30 | 分类于 服务器配置

前言

Gogs是一个类似于Gitlab的开源Git服务,它具有易安装、跨平台、轻量级等特点。相比于Gitlab它的资源占有率极低,对于个人开发者或者小型团队是非常实用的一款Git服务。

创建系统用户

创建新的系统用户 “git”,并切换为 “git” 用户:

1
2
sudo useradd -m git
sudo su - git

创建数据库

创建新的数据库并命名为gogs:

1
mysql>create database gogs;
阅读全文 »

Pyinstaller打包Python程序攻略

发表于 2019-08-25 | 分类于 python

PyInstaller基本使用方法

下面列举几个常见的可选参数:

1
2
3
4
5
6
7
8
9
10
pyinstaller [options] my_script.py
[options]:
-h 显示帮助并退出
-D 生成一个文件夹,其中包含一个可执行文件(默认)
-F 生成单个可执行文件
-w 生成一个无命令行界面的程序
-i file.ico 指定图标
--add-data SRC;DEST 在程序中用到的其他(非二进制)文件,不建议用
--hidden-import MODULENAME 在程序中隐式导入的库,可多次使用
--exclude-module MODULENAME 不希望导入的库,可多次使用

更详细的使用方法可以参看官方手册,本文不再赘述。

问题:打包后程序体积太大

由于笔者使用的是Anaconda作为Python环境,最近有个项目需要将Python代码打包成可执行文件。在之前的需求中没有使用科学计算库(例如numpy、pandas等)所以打包出来的结果也就10M左右,完全可以接受。但是最近在项目中使用了numpy等科学计算库之后,程序打包的结果接近1G左右,这样的打包结果简直令人窒息。这里主要有两个解决方案:1. 使用虚拟环境打包 2. 使用纯净版本的Python打包

推荐使用第二种方法。

阅读全文 »

使用VIM作为IDE

发表于 2019-08-01 | 分类于 VIM

Windows环境

插件管理器

VIM的插件管理器主要有vim-plug和vundle

Vim-plug

  1. 首先下载vim-plug,可以去github下载

  2. 下载完成后解压压缩包将plug.vim复制到vim安装目录下的autoload文件夹下,即可完成vim-plug的安装。

  3. 使用管理员身份运行gvim,,然后点击gvim的“编辑”——“启动设定”,打开_vimrc配置文件。

插件安装示例

在_vimrc中添加如下的内容,这里以vim-plug下载nerdtree插件为例。设置完成后保存设置。

1
2
3
call plug#begin('~/.vim/plugged') "插件保存的目录
Plug 'scrooloose/nerdtree', {'on': 'NERDTreeToggle'} "NERDTree插件
call plug#end()

常用操作

命令 解释
:PlugStatus 查看插件安装状态
:PlugInstall 安装在_vimrc中配置的插件。注意命令的大小写,执行后vim-plug会自动克隆并安装插件
:PlugUpdate 更新插件
:PlugClean 清理插件(需要先在_vimrc中删除或注释)
:PlugUpgrade 更新vim-plug

Vundle

  1. 首先下载vundle,可以去github下载

  2. 下载完成后解压压缩包到vim安装目录下的bundle文件夹下(没有就新建),即可完成vundle的安装。

  3. 使用管理员身份运行gvim,,然后点击gvim的“编辑”——“启动设定”,打开_vimrc配置文件。

插件安装示例

在_vimrc中添加如下的内容,这里以vundle下载nerdtree插件为例。设置完成后保存设置。

1
2
3
4
5
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
call vundle#end()

常用操作

命令 解释
:PluginList 查看插件安装状态
:PluginInstall 安装在_vimrc中配置的插件。注意命令的大小写,执行后vundle会自动克隆并安装插件
:PluginUpdate 更新插件
:PluginClean 清理插件(需要先在_vimrc中删除或注释)
:PluginSearch 搜索插件,例如:PluginSearch xml可以搜到xml相关的插件
阅读全文 »

Tensorflow共享变量机制理解与应用

发表于 2019-02-25 | 分类于 tensorflow

创建变量

Tensorflow创建变量有两种方式:

  1. tf.get_variable()
  2. tf.Variable()

它们的区别如下:

在 tf.name_scope下时,tf.get_variable()创建的变量名不受 name_scope 的影响,而且在未指定共享变量时,如果重名会报错,tf.Variable()会自动检测有没有变量重名,如果有则会自行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf
with tf.name_scope('name_scope_x'):
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var3.name, sess.run(var3))
print(var4.name, sess.run(var4))
# 输出结果:
# var1:0 [-0.30036557] 可以看到前面不含有指定的'name_scope_x'
# name_scope_x/var2:0 [ 2.]
# name_scope_x/var2_1:0 [ 2.] 可以看到变量名自行变成了'var2_1',避免了和'var2'冲突

如果使用tf.get_variable()创建变量,且没有设置共享变量,重名时会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
import tensorflow as tf
with tf.name_scope('name_scope_1'):
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
var2 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var2.name, sess.run(var2))
# ValueError: Variable var1 already exists, disallowed. Did you mean
# to set reuse=True in VarScope? Originally defined at:
# var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
阅读全文 »

Ubuntu环境MYSQL乱码问题修复

发表于 2018-12-09 | 分类于 服务器配置

首先声明笔者使用的服务器是Ubuntu16.04,数据库安装的是Mysql 5.7。初始的mysql默认字符集是latin1,如果向数据库中插入中文就会出现乱码,下面我们通过修改配置文件的方式修改mysql的默认编码。

修改配置文件

修改[mysqld]

找到文件/etc/mysql/mysql.conf.d/mysqld.cnf 中的[mysqld]并在其最后面追加如下代码:

1
character-set-server=utf8

修改[mysql]

找到文件/etc/mysql/conf.d/mysql.cnf中的[mysql]并在其最后面追加如下代码:

1
default-character-set=utf8

修改[client]

找到文件/etc/mysql/debian.cnf中的[client]并在其最后面追加如下代码:

1
default-character-set=utf8

重启MYSQL

1
service mysql restart
阅读全文 »

LAMP环境搭建以及MYSQL远程访问配置

发表于 2018-12-04 | 分类于 服务器配置

首先声明笔者使用的服务器是Ubuntu16.04。下面正式进入配置教程:

LAMP环境搭建

安装Apache2

1
sudo apt-get install apache2

检查apache2是否安装成功

1
apache2 –v

安装PHP7

1
sudo apt-get install php

查看PHP版本并检查PHP是否按照成功

1
php –v

安装MYSQL

1
2
sudo apt-get install mysql-server
sudo apt-get install mysql-client
阅读全文 »
123
Peter Chiang

Peter Chiang

Stay hungry, stay foolish!

23 日志
14 分类
40 标签
RSS
GitHub E-Mail Weibo Zhihu
友情链接
  • 52nlp
  • 科学空间
  • 阿拉灯神丁Vicky侃AI
© 2022 Peter Chiang
由 Hexo 强力驱动
主题 - NexT.Gemini