深度学习框架Keras与Pytorch对比
对于许多科学家、工程师和开发人员来说,TensorFlow是他们的第一个深度学习框架。TensorFlow 1.0于2017年2月发布,可以说,它对用户不太友好。
在过去的几年里,两个主要的深度学习库Keras和Pytorch获得了大量关注,主要是因为它们的使用比较简单。
本文将介绍Keras与Pytorch的4个不同点以及为什么选择其中一个库的原因。
Keras
Keras本身并不是一个框架,而是一个位于其他深度学习框架之上的高级API。目前它支持TensorFlow、Theano和CNTK。
Keras的优点在于它的易用性。这是迄今为止最容易上手并快速运行的框架。定义神经网络是非常直观的,因为使用API可以将层定义为函数。
Pytorch
Pytorch是一个深度学习框架(类似于TensorFlow),由Facebook的人工智能研究小组开发。与Keras一样,它也抽象出了深层网络编程的许多混乱部分。
就高级和低级代码风格而言,Pytorch介于Keras和TensorFlow之间。比起Keras具有更大的灵活性和控制能力,但同时又不必进行任何复杂的声明式编程(declarative programming)。
深度学习的从业人员整天都在纠结应该使用哪个框架。一般来说,这取决于个人喜好。但是在选择Keras和Pytorch时,你应该记住它们的几个方面。
(1)定义模型的类与函数
为了定义深度学习模型,Keras提供了函数式API。使用函数式API,神经网络被定义为一系列顺序化的函数,一个接一个地被应用。例如,函数定义层1( function defining layer 1)的输出是函数定义层2的输入。
img_input = layers.Input(shape=input_shape)
x = layers.Conv2D(64, (3, 3), activation='relu')(img_input)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)
在Pytorch中,你将网络设置为一个继承来自Torch库的torch.nn.Module的类。与Keras类似,Pytorch提供给你将层作为构建块的能力,但是由于它们在Python类中,所以它们在类的init_()方法中被引用,并由类的forward()方法执行。
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 64, 3)
self.conv2 = nn.Conv2d(64, 64, 3)
self.pool = nn.MaxPool2d(2, 2)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(F.relu(self.conv2(x)))
return x
model = Net()
(2)张量和计算图模型与标准数组的比较
Keras API向普通程序员隐藏了许多混乱的细节。这使得定义网络层是直观的,并且默认的设置通常足以让你入门。
只有当你正在实现一个相当先进或“奇特”的模型时,你才真正需要深入了解底层,了解一些基本的TensorFlow。
棘手的部分是,当你真正深入到较低级别的TensorFlow代码时,所有的挑战就随之而来!你需要确保所有的矩阵乘法都对齐。不要试着想打印出你自己定义的层的输出,因为你只会得到一个打印在你的终端上的没有错误的张量定义。
Pytorch在这些方面更宽容一些。你需要知道每个层的输入和输出大小,但是这是一个比较容易的方面,你可以很快掌握它。你不需要构建一个抽象的计算图,避免了在实际调试时无法看到该抽象的计算图的细节。
Pytorch的另一个优点是平滑性,你可以在Torch张量和Numpy数组之间来回切换。如果你需要实现一些自定义的东西,那么在TF张量和Numpy数组之间来回切换可能会很麻烦,这要求开发人员对TensorFlow会话有一个较好的理解。
Pytorch的互操作实际上要简单得多。你只需要知道两种操作:一种是将Torch张量(一个可变对象)转换为Numpy,另一种是反向操作。
当然,如果你从来不需要实现任何奇特的东西,那么Keras就会做得很好,因为你不会遇到任何TensorFlow的障碍。但是如果你有这个需求,那么Pytorch将会是一个更加好的选择。
(3)训练模型
用Keras训练模特超级简单!只需一个简单的.fit(),你就可以直接去跑步了。
history = model.fit_generator(
generator=train_generator,
epochs=10,
validation_data=validation_generator)
在Pytorch中训练模型包括以下几个步骤:
在每批训练开始时初始化梯度
前向传播
反向传播
计算损失并更新权重
# 在数据集上循环多次
for epoch in range(2):
for i, data in enumerate(trainloader, 0):
# 获取输入; data是列表[inputs, labels]
inputs, labels = data
# (1) 初始化梯度
optimizer.zero_grad()
# (2) 前向传播
outputs = net(inputs)
loss = criterion(outputs, labels)
# (3) 反向传播
loss.backward()
# (4) 计算损失并更新权重
optimizer.step()
光是训练就需要很多步骤!
我想这种方式你就会知道实际上发生了什么。由于这些模型训练步骤对于训练不同的模型本质上保持不变,所以这些代码实际上完全不必要的。
(4)控制CPU与GPU模式的比较
如果你已经安装了tensorflow-gpu,那么在Keras中使用GPU是默认启用和完成的。如果希望将某些操作转移到CPU,可以使用以下代码。
with tf.device('/cpu:0'):
y = apply_non_max_suppression(x)
对于Pytorch,你必须显式地为每个torch张量和numpy变量启用GPU。这将使代码变得混乱,如果你在CPU和GPU之间来回移动以执行不同的操作,则很容易出错。
例如,为了将我们之前的模型转移到GPU上运行,我们需要做以下工作:
#获取GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#传送网络到GPU
net.to(device)
# 传送输入和标签到GPU
inputs, labels = data[0].to(device), data[1].to(device)
Keras在这方面的优势在于它的简单性和良好的默认设置
选择框架的一般建议
我通常给出的建议是从Keras开始。
Keras绝对是最容易使用、理解和快速上手并运行的框架。你不需要担心GPU设置,处理抽象代码,或者做任何复杂的事情。你甚至可以在不接触TensorFlow的任何一行的情况下实现定制层和损失函数。
如果你确实开始深入到深度网络的更细粒度方面,或者正在实现一些非标准的东西,那么Pytorch就是你的首选库。在Keras上实现反而会有一些额外的工作量,虽然不多,但这会拖慢你的进度。使用pytorch能够快速地实现、训练和测试你的网络,并附带易于调试的额外好处!
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
深度学习框架Keras与Pytorch对比的更多相关文章
- 如何评价深度学习框架Keras?
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
- 基于Theano的深度学习框架keras及配合SVM训练模型
https://blog.csdn.net/a819825294/article/details/51334397 1.介绍 Keras是基于Theano的一个深度学习框架,它的设计参考了Torch, ...
- 【深度学习框架】使用PyTorch进行数据处理
在深度学习中,数据的处理对于神经网络的训练来说十分重要,良好的数据(包括图像.文本.语音等)处理不仅可以加速模型的训练,同时也直接关系到模型的效果.本文以处理图像数据为例,记录一些使用PyTorc ...
- 常用深度学习框架(keras,pytorch.cntk,theano)conda 安装--未整理
版本查询 cpu tensorflow conda env list source activate tensorflow python import tensorflow as tf 和 tf.__ ...
- 深度学习框架Keras介绍及实战
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行.Keras 的开发重点是支持快速的实验.能够以最小的时延 ...
- 基于Windows,Python,Theano的深度学习框架Keras的配置
1.安装Anaconda 面向科学计算的Python IDE--Anaconda 2.打开Anaconda Prompt 3.安装gcc环境 (1)conda update conda (2)cond ...
- 深度学习框架Keras安装
环境:Windows 10 64位 版本!版本!版本!不要下载最新版本的! 一点要按照这个来!安装顺序也最好不要错! 首先安装DirectX SDK工具包 ,这是链接:https://www.micr ...
- 深度学习与CV教程(8) | 常见深度学习框架介绍
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 转:TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比
http://geek.csdn.net/news/detail/138968 Google近日发布了TensorFlow 1.0候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步.自Tens ...
随机推荐
- 前阿里数据库专家总结的MySQL里的各种锁(上篇)
0.前言 MySQL按照加锁的范围,分为全局锁.表级锁.行级锁. 本文作为上篇,主要介绍MySQL的全局锁 和 表级锁. 重要的实战总结为,如何安全地变更一个表的表结构. 1.全局锁 定义: 全局锁就 ...
- 前端每日实战:102# 视频演示如何用纯 CSS 创作一个小和尚
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMmYXp 可交互视频 此视频是可 ...
- Could not find a valid gem 'redis' (= 0)
Could not find a valid gem 'redis' (= 0) 报错详情如下: ERROR: Could not find a valid gem 'redis' (>= 0) ...
- 一起了解 .Net Foundation 项目 No.18
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Protobuild Pr ...
- element多层导航菜单
很久没写博客了原因就是懒, 刚下班今天写了个基于element导航菜单实现多层菜单(可以无限多层) 组件核心思想就是组件递归(这个有时候面试会问到) 然后就判断children有没有内容,没内容就是选 ...
- flask 分页数据显示
填充一些数据在表中 @blue.route('/pages/') def pages(): # 默认进入这个视图函数 第一页并只显示5条数据 page = request.args.get('page ...
- 第一个爬虫经历----豆瓣电影top250(经典案例)
因为要学习数据分析,需要从网上爬取数据,所以开始学习爬虫,使用python进行爬虫,有好几种模拟发送请求的方法,最基础的是使用urllib.request模块(python自带,无需再下载),第二是r ...
- 用python实现LBP特征点计算
import cv2 import numpy as np def olbp(src): dst = np.zeros(src.shape,dtype=src.dtype) for i in rang ...
- 02-influxdb执行命令方式
influxdb执行命令方式 1. 三种操作方法 InfluxDB提供三种操作方式: 1)客户端命令行方式 2)HTTP API接口 3)各语言API库 2. 客户端命令行方式 查看influxdb占 ...
- Java反射之构造方法反射
上一篇Java反射之Class类我们介绍了java反射的关键类Class, 反射就是由一个java类映射得到一个java类. 所以,我们自然能想到,一个类中应该有哪些属性,这里做个比方,人有名字年龄等 ...