深度学习框架像Caffe、tensorflow,这些是深度学习的工具,简单来说就是库,编程时需要import caffe、import tensorflow。
作一个简单的比喻,一套深度学习框架就是这个品牌的一套积木,各个组件就是某个模型或算法的一部分,你可以自己设计如何使用积木去堆砌符合你数据集的积木。
深度学习框架的出现降低了入门的门槛,你不需要从复杂的神经网络开始编代码,你可以依据需要,使用已有的模型,模型的参数你自己训练得到,你也可以在已有模型的基础上增加自己的layer,或者是在顶端选择自己需要的分类器和优化算法(比如常用的梯度下降法)。当然也正因如此,没有什么框架是完美的,就像一套积木里可能没有你需要的那一种积木,所以不同的框架适用的领域不完全一致。 总的来说深度学习框架提供了一些列的深度学习的组件(对于通用的算法,里面会有实现),当需要使用新的算法的时候就需要用户自己去定义,然后调用深度学习框架的函数接口使用用户自定义的。
大部分深度学习框架都包含以下五个核心组件:
1. 张量(Tensor)
2. 基于张量的各种操作
3. 计算图(Computation Graph)
4. 自动微分(Automatic Differentiation)工具
5. BLAS、cuBLAS、cuDNN等拓展包
caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,tiny-dnn,deeplearning4j,matconvnet等
其中:
谷歌:TensorFlow
Facebook:pytorch
百度:Paddle Paddle
微软:CNTK
亚马逊的AWS:MXNet
华为:mindspore
一流科技:oneflow
旷世:MegEngine
清华:Jittor
不应该停留在官方的demo上
深度学习系统通常有两种编程方式:
1.一种是声明式编程(declarative programming):
用户只需要声明要做什么,而具体执行则由系统完成。
以Caffe,TensorFlow的计算图为代表。
1.由于在真正开始计算的时候已经拿到了整个计算图,所以可以做一系列优化来提升性能。
2.实现辅助函数也容易。
例如对任何计算图都提供forward和backward函数
3.另外也方便对计算图进行可视化
将图保存到硬盘和从硬盘读取。
1.debug很麻烦,
监视一个复杂的计算图中的某个节点的中间结果并不简单
2.逻辑控制也不方便。
2.一种是命令式编程(imperative programming):
以numpy,torch/pytorch为代表
每个语句按照原来的意思顺序执行。
1.语义上容易理解,灵活,可以精确控制行为。
2.通常可以无缝地和主语言交互,方便地利用主语言的各类算法,工具包,debug和性能调试器
流程相互之间是解耦合的,所以caffe的使用非常优雅简单。
1.以C++/CUDA/python代码为主,速度快,性能高。
2.工厂设计模式,代码结构清晰,可读性和拓展性强。
3.支持命令行、Python和Matlab接口,使用方便。
4.CPU和GPU之间切换方便,多GPU训练方便。
5.工具丰富,社区活跃。
1.源代码修改门槛较高,需要实现前向反向传播,以及CUDA代码。
2.不支持自动求导。
3.不支持模型级并行,只支持数据级并行
4.不适合于非图像任务。
Tensor
就是张量,代表N维数组,这与Caffe中的blob是类似的;Flow
即流,代表基于数据流图的计算。 (1) 创建计算图
1.表示计算的数据流。
2.它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是Caffe中的prototxt 的 定义过程。
(2)运行会话
1.执行图中的运算,可以看作是Caffe中的训练过程。
2.只是TensorFlow的会话比Caffe灵活很多,由于是Python接口,取中间结果分析,Debug 等方便很多
MXNet
提供张量运算,进行模型的迭代训练和更新中的控制逻辑;MXNet
支持符号表达式,用来描述神经网络,并利用系统提供的自动求导来训练模型Torch
是纽约大学的一个机器学习开源框架Pytorch
并开源。特点:
1.TensorFlow从静态图发展到了动态图机制Eager Execution
2.pytorch则一开始就是动态图机制。
3.动态图机制的好处就是随时随地修改,随处debug,没有类似编译的过程。
1.相比TensorFlow1.0中Tensor、Variable、Session等概念充斥,数据读取接口频繁更新,tf.nn、 tf.layers、tf.contrib各自重复
2.Pytorch则是从Tensor到Variable再到nn.Module
最新的Pytorch已经将Tensor和Variable合并
这分别就是从数据张量到网络的抽象层次的递进。
TensorFlow的设计是“make it complicated”,那么 Pytorch的设计就是“keep it simple”。
Keras
是一个非常流行、简单的深度学习框架
它的设计参考了torch
,用Python
语言编写,是一个高度模块化的神经网络库
能够在TensorFlow
,CNTK
或Theano
之上运行
Keras
的特点是能够快速实现模型的搭建,是高效地进行科学研究的关键
对小白用户非常友好而简单的深度学习框架
严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。
theano
,cntk
,tiny-dnn
,deeplearning 4j
,matconvnet
等1.微软开源的深度学习工具包
2.它通过有向图将神经网络描述为一系列计算步骤。
在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。
3.CNTK允许用户非常轻松地实现和组合流行的模型
包括前馈DNN,卷积网络(CNN)和循环网络(RNN / LSTM)。
4.与目前大部分框架一样,实现了自动求导,利用随机梯度下降方法进行优化。
matlab
作为接口语言的开源深度学习库**,底层语言是cuda。java
和jvm
编写的开源深度学习库,支持各种深度学习模型。Define-by-Run
”方案,即通过实际的前向计算动态定义网络。1. Darknet本身是Joseph Redmon为了Yolo系列开发的框架。
2. Joseph Redmon提出了Yolo v1,Yolo v2,Yolo v3。
1. Darknet几乎没有依赖库
2. 从C和CUDA开始撰写的深度学习开源框架
3. 支持CPU和GPU
4. Darknet跟caffe颇有几分相似之处,却更加轻量级,非常值得学习使用。
1.不管怎么说,tensorflow/pytorch你都必须会,这是目前开发者最喜欢,开源项目最丰富的两个框架。
2.如果你要进行移动端算法的开发,那么Caffe是不能不会的。
3.如果你非常熟悉Matlab,matconvnet你不应该错过。
4.如果你追求高效轻量,那么darknet和mxnet你不能不熟悉。
5.如果你很懒,想写最少的代码完成任务,那么用keras吧。
6.如果你是java程序员,那么掌握deeplearning4j没错的。
7.其他的框架,也自有它的特点,大家可以自己多去用用。
Python
机器学习库,基于Torch
,用于自然语言处理等应用程序。1. PyTorch的前身是Torch,其底层和Torch框架一样
2. 但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。
3. 由Torch7团队开发,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。
4. PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。
anaconda
为例。cuda
9.2**以上了,所以需要对cuda进行升级。#默认 使用 cuda10.1
pip3 install torch===1.3.0 torchvision===0.4.1 -f https://download.pytorch.org/whl/torch_stable.
#cuda 9.2
pip3 install torch==1.3.0+cu92 torchvision==0.4.1+cu92 -f https://download.pytorch.org/whl/torch_stable.html
#cpu版本
pip3 install torch==1.3.0+cpu torchvision==0.4.1+cpu -f https://download.pytorch.org/whl/torch_stable.html
验证输入python 进入
import torchtorch.__version__# 得到结果'1.3.0'
TensorFlow支持多种客户端语言下的安装和运行。
截至版本1.12.0,绑定完成并支持版本兼容运行的语言为C和Python,
其它(试验性)绑定完成的语言为JavaScript、C++、Java、Go和Swift,依然处于开发阶段 的包括C#、Haskell、Julia、Ruby、Rust和Scala
pip install tensorflow
conda install -c conda-forge tensorflow
Docker
安装docker pull tensorflow/tensorflow:latest
# 可用的tag包括latest、nightly、version等
# docker镜像文件:https://hub.docker.com/r/tensorflow/tensorflow/tags/
docker run -it -p 8888:8888 tensorflow/tensorflow:latest
# dock下运行jupyter notebook
docker run -it tensorflow/tensorflow bash
# 启用编译了tensorflow的bash环境
# 确认GPU状态
lspci | grep -i nvidia
# 导入GPU加速的TensorFlow镜像文件
docker pull tensorflow/tensorflow:latest-gpu
# 验证安装
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
# 启用bash环境
docker run --runtime=nvidia -it tensorflow/tensorflow:latest-gpu bash
低阶API
在这里插入代码片import numpy as np
import tensorflow as tf
# tf.constant(value, dtype=None, name='Const', verify_shape=False)
tf.constant([0, 1, 2], dtype=tf.float32) # 定义常数
# tf.placeholder(dtype, shape=None, name=None)
tf.placeholder(shape=(None, 2), dtype=tf.float32) # 定义张量占位符
#tf.Variable(, name=)
tf.Variable(np.random.rand(1, 3), name='random_var', dtype=tf.float32) # 定义变量
# tf.SparseTensor(indices, values, dense_shape)
tf.SparseTensor(indices=[[0, 0], [1, 2]], values=[1, 2], dense_shape=[3, 4]) # 定义稀疏张量
# tf.sparse_placeholder(dtype, shape=None, name=None)
tf.sparse_placeholder(dtype=tf.float32)
在这里插入代码片import numpy as np
import tensorflow as tf
# tf.constant(value, dtype=None, name='Const', verify_shape=False)
tf.constant([0, 1, 2], dtype=tf.float32) # 定义常数
# tf.placeholder(dtype, shape=None, name=None)
tf.placeholder(shape=(None, 2), dtype=tf.float32) # 定义张量占位符
#tf.Variable(, name=)
tf.Variable(np.random.rand(1, 3), name='random_var', dtype=tf.float32) # 定义变量
# tf.SparseTensor(indices, values, dense_shape)
tf.SparseTensor(indices=[[0, 0], [1, 2]], values=[1, 2], dense_shape=[3, 4]) # 定义稀疏张量
# tf.sparse_placeholder(dtype, shape=None, name=None)
tf.sparse_placeholder(dtype=tf.float32)
# 定义二阶常数张量
a = tf.constant([[0, 1, 2, 3], [4, 5, 6, 7]], dtype=tf.float32)
a_rank = tf.rank(a) # 获取张量的秩
a_shape = tf.shape(a) # 获取张量的形状
b = tf.reshape(a, [4, 2]) # 对张量进行重构
# 运行会话以显示结果
with tf.Session() as sess:
print('constant tensor: {}'.format(sess.run(a)))
print('the rank of tensor: {}'.format(sess.run(a_rank)))
print('the shape of tensor: {}'.format(sess.run(a_shape)))
print('reshaped tensor: {}'.format(sess.run(b)))
# 对张量进行切片
print("tensor's first column: {}".format(sess.run(a[:, 0])))
参考链接:
1.深度学习框架究竟是什么?
2.【机器学习】深度学习框架是什么?有哪些?如何选择?
3.深度学习框架