0%

深度学习系列(一)——数据科学开发环境与工具

数据科学与传统的程序开发开发有些许不同,数据科学面向非专业的研发人员,更需要简单的,所见即所得的开发方式。因此,通常选择一种可交互的解释型语言,如Python、Ruby、Scala等。其次,数据科学更加注重推理的逻辑与过程,因此它需要可读性强的注释、图标,这往往通过Notebook来实现,这类Notebook可以实现代码的直接运行与保存结果,并且在代码中嵌入macdown来添加详细的讲解注释。本文主要涉及下面几个方面:

  • 开发语言:Python。这里我们选择了最常见、最容易入门的开发语言Python3,由于Python3与python2并不完全兼容,在不特殊说明的情况下,我们使用Python3作为标准。
  • Notebook:Jupyter。这也是Python最常用的Notebook,可以在其中选择编译环境,运行Pythhon代码,添加macdown代码块。绘制图标这些常见的功能。值得注意的是,Jupyter只是一个前端显示笔记本,其后端可以支持除了Python以外的其他语言。
  • 环境管理:Conda。由于Python版本兼容问题,不同的package可能需要不同的Python环境。因此,需要一款可以管理不同环境的工具,Conda提供了一个虚拟的环境,我们可以在不同环境中设置不同的Python版本,开发包版本,并且可以在这些环境中切换(类似的工具有virtualenv)。

环境管理:Conda

我们可以安装miniconda。由于完整版的Anaconda比较大(500MB,包含默认安装各种常用库,pydata库)推荐用miniconda,再依据需要安装package。

比较conda与pip

  1. conda与pip区别
    • conda是专注数据领域的,pip不是
    • conda不仅仅包括python包,也包括非python工具。pip只是python的。
  2. conda对于python库而言并不全。如果在conda中没有,可以用pip安装,没有冲突。
  3. conda下载的版本是预编译好的(使用MKL库编译,对速度进行了优化),而pip不是。所以版本可能不是最新的。
  4. conda还是一个环境管理工具(类似virtualenv,pyenv),可以不同项目用不同的环境,而pip不是。常见的应用是
    • py3与py2同时安装,避免冲突。
    • 需要旧版本功能时,安装不同版本的numpy。

常见操作

安装miniconda

1
2
3
4
brew install Caskroom/cask/miniconda
## 可选
conda upgrade conda
conda upgrade --all # 默认环境升级到了python3

PS:不要忘记,覆盖了以前的python环境 export PATH=~/miniconda3/bin:"$PATH"

安装完成后,系统的Python环境默认是root环境(conda自带),此时使用pip/conda安装package会安装到此环境中。请使用where python && where pip确认。

配置

conda安装完了可以直接使用,不需要特别的配置。但是这里提一个概念channels,他是最常用的配置选项,我们可以通过选择不同的channels来安装其他人的扩展包。 通过类似 conda install -c some-channel packagename的命令来从其他源安装软件。最常见的源是conda-forge,一个开源的代码库,许多软件通过这个源来安装。

1
2
3
4
5
6
7
8
# 显示配置
conda config --show
# 单独显示channels
conda config --get channels
# 添加 conda-forge channel到源(示例,建议直接通过-c方式指定channel安装)
conda config --add channels conda-forge
# 通过conda-forge源安装tensorflow 1.1.0
conda install -c conda-forge tensorflow=1.1.0

使用

  • conda list:查看当前环境中所有的package
  • conda env list:查看系统中所有的环境与当前的环境,注意默认环境root
  • conda install xxx 可以在当前环境中安装package
  • 创建新环境并安装一些包:conda create -n env_name list_of_packages
    • conda create -n py3 python=3
    • conda create -n py2 python=2
  • 进入环境 source activate my_env
  • 直接在环境内安装包:conda install package
  • 退出环境 source deactivate
  • 删除环境 conda env remove -n env_name
  • 共享环境安装的package
    • 导出:conda env export > environment.yaml
    • 导入:conda env create -f environment.yaml

实践技巧

如何加速package安装速度

由于墙的存在,我们需要镜像来加速conda install/pip install的安装速度。建议使用清华tuna的Anaconda镜像豆瓣的pip镜像

  • 加速默认源:
    • conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    • conda config --set show_channel_urls yes
  • 加速conda-forege channel
    • conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
    • 或者 conda install -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge tensorflow=0.11.0
  • 加速pip
    • pip install packagename -i https://pypi.douban.com/simple

如何Python分配环境

  • 分别建立python2和python3的环境,并安装常用的package,如jupyter
    • conda create -n py3 python=3 ipykernel
    • conda create -n py2 python=2 ipykernel
  • 为每个项目创建环境建立独立的env。比如为你博客创建一个python环境。

笔记本:Jupyter Notebook

Jupyter Notebook可以方便我们开发测试与Review整个研发的过程。一个有用的提示,在github可以识别Jupyter,直接打开渲染好的.ipynb笔记本文件。另外,要打开其他任何地方的Jupyter文件可以使用这个网站

安装jupyter

我们可以为conda中有需要的环境安装jupyter notebook,下面以默认环境为例,如果需要jupyter可以识别、切换其他conda环境,需要先切换到对应的env中重复执行下面的安装命令。

1
2
conda install jupyter notebook # pip也行
conda install nb_conda_kernels # 为notebook添加conda环境识别功能,似乎安装ipykernel也可以

如果出无jupyter前端无法识别多个环境的问题,参考stackoverflow的这篇文章说明miniconda与jupyter结合的问题

安装完成后,访问访问http://localhost:8888,如果启动多个notebook,访问http://localhost:8889 ,端口+1。

使用

常用

  • 一个code cell中定义的变量可以在另一个中访问
  • 默认输出最后一行的结果,可以直接用print输出
  • tab代码补全
  • shift+tab 查看文档
  • shift+tab两次,查看详细文档

快捷键

  • control+enter :运行
  • Shift + Control/Command + P 命令板
  • DD 删除
  • A 新建
  • H 帮助
  • L 代码行数

Magic命令

magic命令可以大大增强jupyter的能力,添加一下功能。

% 作用于一行
%% 作用于一个cell

  • 计算运行时间

    • %timeit func() 计算函数func的运行时间
    • %%timeit 计算单元格的运行时间
  • 绘图%matplotlib xxx xx代表后端(显示的终端)

    • %matplotlib inline matplotlib库在notebook中内联显示图像
    • 在retina屏显示:
      1
      2
      %matplotlib inline
      %config InlineBackend.figure_format = 'retina'
  • debug

    • %pdb 打开调试,当出现错误时自动中断,可以查看变量值。输入q退出。
  • 其他:http://ipython.readthedocs.io/en/stable/interactive/magics.html

其他功能

  • 转换ipynb格式:ipynb本质是一个json文档可以,转换成html,macdown等格式
    • jupyter nbconvert --to html notebook.ipynb
    • macdown
    • pdf
    • 幻灯片
  • 制作幻灯片:效果不错
    • 在web中,点击 View > Cell Toolbar > Slideshow
    • 在每个cell上面选择样式
      • side
      • sub-side
      • fragment
      • skip
      • notes
    • 生成jupyter nbconvert notebook.ipynb --to slides --post serve

Python与数据科学常用的Lib

python的基本语法在此不再赘述,下面介绍一下常用的功能。

Python特性

Python2与Python3的区别

  • print的改变:py2中使用print "hello" ,py3中使用print("hello")
  • 原来1/2(两个整数相除)结果是0,现在是0.5了
  • xrange重命名为range,并且返回不是list了,是可遍历的range对象,可以使用list()在转换一下
  • *的作用,python3中加在list前,可以展开list,作为多个参数传入函数。

强大的列表/字典推导式

基本格式,其中if过滤条件可有可无。

  • 生成列表[expr for value in collection if condition]
  • 生成字典{ key_expr: value_expr for value in collection if condition }
  • 生成集合 { expr for value in collection if condition }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# example

names = ['Bob','Tom','alice','Jerry','Wendy','Smith']

# 列表的例子,注意if位置
# 过滤 ['ALICE', 'JERRY', 'WENDY', 'SMITH']
[name.upper() for name in names if len(name)>3]

# 按照条件赋新值 [False, False, True, True, True, True]
[ True if len(name)>3 else False for name in names]

# 字典的例子
# {'Bob': 3, 'Smith': 5, 'Jerry': 5, 'Wendy': 5, 'alice': 5, 'Tom': 3}
{name:len(name) for name in names}

# 集合的例子
# {3, 5}
{len(name) for name in names}

# 遍历嵌套list的例子
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],
['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
# ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
[name for lst in names for name in lst if name.count('e')>=2]

星号的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
def test(*args, **kwargs):
print args, kwargs

a={"a":1, "b":2}

# ({'a': 1, 'b': 2},) {}
test(a)

# ('a', 'b') {}
test(*a) #这里等同于test('a', 'b')

# () {'a': 1, 'b': 2}
test(**a) #这里等同于test(a=1, b=2)

一个星号就是把一个序列拆解传入,如果变量本身是字典,会退化成key的序列。两个星号就是把key-value拆解传入。可以当是语法糖。

常用内置函数

  • zip
  • range
  • str 对象转换成可打印字符串
  • type
  • filter/map/reduce
  • 其他,参考blog

基础库

numpy

一个科学计算的基础库,为Python提供了最常用的向量&&矩阵这个功能(N-dimensional array object)。以及他们常见的操作函数,如转置、点积等。具体的使用参考官方文档,这里一般性的介绍。

  • 虽然都是N纬度的数组,但是请区分向量与矩阵
    • np.array([1,2,3]): 是一个向量==>shape (3,)
    • np.array([1,2,3],ndmin=2):是一个矩阵==>shape(1,3)。因此,矩阵才有转置Tnp.array([1,2,3],ndmin=2).T==>shape(3,1)
  • 乘法规则:区别点乘与element-wise相乘
    • 点乘的规则
      • np.dot(向量,向量):向量的点积 a1b1+a2b2
      • np.dot(矩阵,矩阵):两个矩阵相乘
      • np.dot(向量,矩阵)
      • np.dot(矩阵,向量)
    • element-wise相乘:广播机制—不同shape的矩阵运算
  • numpy中的range:np.arange(10)==>array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  • 生成zeros数据:np.zeros(len(vocab),dtype=np.int_) 向量类型是int(默认是float
  • np.rollaxis(self.train_x, 3)把第三纬度换到第0纬度
  • 随机
    • shuffle:np.random.shuffle([1,2,3])
    • np.random.randn(10,5) 10*5的随机矩阵
    • np.random.randint(0,100),生成0—100的随机数一个

scipy

对numpy库的扩展,提供了更多的函数。scipy似乎包含了numpy的所有函数,应当优先考虑使用他们。深度学习课程中使用的并不多

all of the Numpy functions have been subsumed into the scipy namespace so that all of those functions are available without additionally importing Numpy.

panda

一个极受欢迎的 Python 数据处理库,为Python提供了结构化的数据结构Series、DataFrame。是数据处理里面经常使用的库,可以把数据组织成表格的形式。数据的输入时常用,尤其是读取cvs表格数据。参考:10 分钟讲解 Pandas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
# 读入cvs表格为dataframe数据结构,df由data,column,index组成,行与列都可以理解成Series
data = pd.read_csv("data_file.csv") # cvs的格式是第一行是col名字,所有数据用逗号分割
# 获取列
df = data[['ColumnName']] # 返回df
series = data['ColumnName'] # 注意这个返回的是Series
# 获取行(返回Series) ,index的概念
data.ix[0]
# 某一行的N列
data.ix[0,["ColumnName""ColumnName2"]]

##### 转换为numpy #####
df.values ==> 二维 array
series.values ==> 一维 array

Matplotlib

Python 图表绘制与可视化库,在本课程中经常使用来展现数据(如准确率的变换)。参考Matplotlib 官方教程

机器学习库

TensorFlow

Google出品的机器学习/深度学习库,提供了张量Tensor的底层表示和运算方法,此外,还包含了构建神经网络以及构建/训练各种model的常用函数,属于比较底层的库,很多高级API基于他实现。这个会在后面的文章中重点介绍。

高层API—scikit-learn,keras,tf-learn,TensorLayer

  • scikit learn:一套高层次通用机器学习API,是综合性 Python 机器学习库(API也很经典,其他的库都有类似的API),提供了传统的机器学习方法,功能全面,后端可以选择Tensorflow。由于包含很多传统机器学习方法,可以与其他库配合使用。参考Scikit-learn 官方教程。推荐一个不错的中文视频教程

  • keras:一个高层次的深度学习API,专注于深度学习方面。后端可以选择Tensorflow/Theano,封装的比较死??据说Keras准备作为官方默认API了???

  • tf-learn:是tf.contrib包中的深度学习API,也是一个高层次的API,后端只能选择Tensorflow。类似scikit-learn,通过简单的几行代码就可以开始深度学习。事实上tflearn期初是Scikit Flow (SKFlow)这个独立的项目。

    skflow : Simplified interface for TensorFlow (mimicking Scikit Learn) for Deep Learning.

  • TensorLayer:一个比较新的库,对TensorFlow的封装,很灵活,运行速度快。教程很强大,中文文档更新速度基本与英文文档同步,还包含了 Google TensorFlow 官网的模块化实现。同时提供scikit-learn式的 fit(), test(), predict() 的API和专业级的API,适合新手到老手过渡。

总结

至此,学习深度学习需要的开发环境与工具介绍完毕,Conda为我们提供方便的环境管理,提供了环境的隔离机制,解决了不同python版本/Lib版本切换的问题。Jupyter Notebook为我们提供了方便的前端开发环境与展示工具,使得记录数据探索的过程更具加高效。最后,Python以及相关的库是深度学习的核心与基础。后面我们就要启程,从传统的机器学习方法开始一步步走向深度学习。

欢迎关注我的其它发布渠道