专栏首页新智元深度学习框架如何选?4大场景对比Keras和PyTorch

深度学习框架如何选?4大场景对比Keras和PyTorch

新智元报道

编辑:元子

【新智元导读】Keras和PyTorch变得极为流行,主要原因是它们比TensorFlow更容易使用。本文对比了Keras和PyTorch四个方面的不同,读者可以针对自己的任务来选择。

对于许多科学家、工程师和开发人员来说,TensorFlow是他们的第一个深度学习框架。但indus.ai公司机器学习工程师George Seif认为,TF并不是非常的用户友好。

相比TF,Seif认为Keras和PyTorch比TensorFlow更易用,已经获得了巨大的普及。

Keras本身不是框架,而是一个位于其他Deep Learning框架之上的高级API。目前它支持TensorFlow,Theano和CNTK。Keras是迄今为止启动和运行最快最简单的框架。定义神经网络是直观的,使用功能性API允许人们将层定义为函数。

而PyTorch像Keras一样,它也抽象了深度网络编程的大部分混乱部分。PyTorch介于Keras和TensorFlow之间,比Keras拥有更灵活、更好的控制力,与此同时用户又不必做任何疯狂的声明式编程。

深度学习练习者整天都在争论应该使用哪个框架。接下来我们将通过4个不同方面,来对比Keras和PyTorch,最终初学者会明白应该选谁。

用于定义模型的类与函数

Keras提供功能性API来定义深度学习模型。神经网络被定义为一组顺序函数,功能定义层1的输出是功能定义层2的输入,例如下面demo代码:

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,PyTorch允许用户访问所有Python的类功能而不是简单的函数调用。与Keras类似,PyTorch提供了层作为构建块,但由于它们位于Python类中,因此它们在类的__init __()方法中引用,并由类的forward()方法执行。例如下面demo代码:

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()

所以如果你想更清晰、更优雅地定义网络,可以选择PyTorch;如果只是求快好上手,可以选择Keras。

张量、计算图与标准阵列

Keras API隐藏了编码器的许多混乱细节。定义网络层非常直观,默认设置已经足以应付大部分情况,不需要涉及到非常底层的内容。

而当你真正触达到更底层的TensorFlow代码时,同时你也获得了随之而来的最具有挑战性的部分:你需要确保所有矩阵乘法都排成一行。哦对了,甚至别指望打印出图层的一个输出,因为你只会在终端上打印出一个漂亮的Tensor定义。

相比起来,PyTorch在这些方面就做的更让人欣慰一些。你需要知道每个层的输入和输出大小,但这很快就能掌握。同时你也不必处理构建一个无法在调试中看到的抽象计算图。

PyTorch的另一个优势是可以在Torch Tensors和Numpy阵列之间来回切换。而反观TF,如果需要实现自定义的东西,在TF张量和Numpy阵列之间来回转换可能会很麻烦,需要开发人员对TensorFlow会话有充分的了解。

PyTorch上这种操作实际上要简单得多。你只需要知道两个操作:一个将Torch Tensor(一个Variable对象)切换到Numpy,另一个反过来。

当然,如果不需要实现任何花哨的东西,那么Keras会做得很好,因为你不会遇到任何TensorFlow路障。

训练模型

在Keras上训练模型非常容易!一个简单的.fit()走四方。下面是demo代码:

history = model.fit_generator(

    generator=train_generator,

    epochs=10,

    validation_data=validation_generator)

但在PyTorch中训练模型就费点事了,包括几个步骤:

  • 在每批训练开始时初始化梯度
  • 运行正向传递模式
  • 运行向后传递
  • 计算损失并更新权重
for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0

    for i, data in enumerate(trainloader, 0):

        # Get the inputs; data is a list of [inputs, labels]

        inputs, labels = data

        # (1) Initialise gradients

        optimizer.zero_grad()

        # (2) Forward pass

        outputs = net(inputs)

        loss = criterion(outputs, labels)

        # (3) Backward

        loss.backward()

        # (4) Compute the loss and update the weights

        optimizer.step()

你看看,就运行个训练就得这么多步骤!

我想这样你总能意识到发生了什么。同时,由于这些模型训练步骤在训练不同模型时基本保持不变,因此非常不必要。

控制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上运行,我们必须执行以下操作:

# Get the GPU device

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# Transfer the network to GPU

net.to(device)

# Transfer the inputs and labels to GPU

inputs, labels = data[0].to(device), data[1].to(device)

在GPU这块,Keras凭借其简洁和漂亮的默认设置赢得了胜利。

选择框架的建议

Seif通常给出的建议是从Keras开始,毕竟又快、又简单、又好用!你甚至可以执行自定义图层和损失函数的操作,而无需触及任何一行TensorFlow。

但如果你确实开始深入了解深层网络中更细粒度的方面,或者正在实现非标准的东西,那么PyTorch就是首选库。

参考链接:

https://towardsdatascience.com/keras-vs-pytorch-for-deep-learning-a013cb63870d

本文分享自微信公众号 - 新智元(AI_era)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ArXiv最火深度学习框架:TensorFlow第一,PyTorch第二!

    一年不算短,但也不算长。一年时间,可以让Swift从11位跌倒13位,也可以让PyTorch从第4位飙升194%至第2位!

    新智元
  • Reddit热议:为什么PyTorch比TensorFlow更快?

    近日,Reddit 上有一个热帖:为什么 PyTorch 和 TensorFlow 一样快 (有时甚至比 TensorFlow 更快)?

    新智元
  • 强推!《PyTorch中文手册》来了

    自 2017 年初首次推出,PyTorch 很快成为 AI 研究人员的热门选择并受到推崇。PyTorch 有许多优势,如采用 Python 语言、动态图机制、网...

    新智元
  • Keras vs PyTorch:谁是「第一」深度学习框架?

    值得一提的是,尽管在 4 月底 PyTorch 在 0.4 版本中已经加入了对于 Windows 的支持,但其对比 Keras 与 TensorFlow 在 W...

    机器之心
  • Keras vs PyTorch:谁是「第一」深度学习框架?

    值得一提的是,尽管在 4 月底 PyTorch 在 0.4 版本中已经加入了对于 Windows 的支持,但其对比 Keras 与 TensorFlow 在 W...

    IT派
  • 深度学习框架对决篇:Keras VS PyTorch

    TensorFlow 是很多科学家、工程师和开发人员的首个深度学习框架。虽然 TensorFlow 1.0 早在 2017 年 2 月就发布了,但使用过程中对用...

    小小詹同学
  • 「决战紫禁之巅」之深度学习框架篇:Keras VS PyTorch

    TensorFlow 是很多科学家、工程师和开发人员的首个深度学习框架。虽然 TensorFlow 1.0 早在 2017 年 2 月就发布了,但使用过程中对用...

    机器之心
  • Github项目推荐 | 深度学习资源,包括一系列架构、模型与建议

    项目地址:https://github.com/rasbt/deeplearning-models

    AI研习社
  • NeurIPS顶会接收,PyTorch官方论文首次曝光完整设计思路

    论文地址:https://papers.nips.cc/paper/9015-pytorch-an-imperative-style-high-performa...

    机器之心
  • 内容运营连接用户和产品之间的纽带!

    内容运营连接用户和产品之间的一种主要表现方式,是整个运营中非常重要的一部分。这几年互联网里面也开始推崇一种“内容为王”的说法。如何理清内容运营里面的各种关系,是...

    大葡萄

扫码关注云+社区

领取腾讯云代金券