深度学习框架哪个最好用?TensorFlow还是PyTorch?

深度学习框架哪个最好用?TensorFlow还是PyTorch?

作为人工智能领域的一员,你认为神经网络中最好用的框架是什么?TensorFlow 还是 PyTorch ?下面这篇文章将会告诉你答案。

在这两种环境下神经网络的操作步骤在机器学习基本都是相似的:

  • 导入所需库;
  • 加载和预处理数据;
  • 定义模型;
  • 定义优化器和损失函数;
  • 训练模型;
  • 最后,评估模型。

这些步骤可以在两个框架中非常相似地实现。为此,在本文中,我们将分别用PyTorch接口和Tensor Flow的Keras接口构建一个神经网络模型,并对手写数字进行分类。整个代码可以在 GitHub 上测试,并作为 colab google notebook运行。

1. 编程神经网络的步骤

A)导入所需库

在这两个框架中,我们都需要首先导入一些Python库,并定义一些需要训练的超参数:

<code>import numpy as np 
import matplotlib.pyplot as plt epochs = 10 
batch_size=64/<code>

对于 TensorFlow ,只需要这个库:

<code>import tensorflow as tf/<code>

而在 PyTorch 的情况下,则需要这两个:

<code>import torch 
import torchvision/<code>

B)加载和预处理数据

通过这两行代码,可以使用 TensorFlow 加载和准备数据:

<code>(x_trainTF_, y_trainTF_), _ = tf.keras.datasets.mnist.load_data() x_trainTF = x_trainTF_.reshape(60000, 784).astype('float32')/255 y_trainTF = tf.keras.utils.to_categorical(y_trainTF_, 
            num_classes=10)/<code>

而在PyTorch中则是:

<code>xy_trainPT = torchvision.datasets.MNIST(root='./data', train=True, download=True,transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()])) xy_trainPT_loader = torch.utils.data.DataLoader(xy_trainPT, batch_size=batch_size)/<code>

我们可以用库 matplotlib.pyplot验证这两个代码是否加载了相同的数据:

<code>print("TensorFlow:")
fig = plt.figure(figsize=(25, 4))
for idx in np.arange(20):
   ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])
   ax.imshow(x_trainTF_[idx], cmap=plt.cm.binary)
   ax.set_title(str(y_trainTF_[idx]))/<code>
深度学习框架哪个最好用?TensorFlow还是PyTorch?

<code>print("PyTorch:")
fig = plt.figure(figsize=(25, 4)) 
for idx in np.arange(20):
   ax = fig.add_subplot(2, 20/2, idx+1, xticks=[], yticks=[])
   ax.imshow(torch.squeeze(image, dim = 0).numpy(), 
             cmap=plt.cm.binary)
   image, label = xy_trainPT [idx]
   ax.set_title(str(label))/<code>
深度学习框架哪个最好用?TensorFlow还是PyTorch?

C)定义模型

为了定义模型,在这两种情况下,都使用了相当相似的语法。在 TensorFlow 的情况下,可以使用以下代码完成:

<code>modelTF = tf.keras.Sequential([ tf.keras.layers.Dense(10,activation='sigmoid',input_shape=(784,)), tf.keras.layers.Dense(10,activation='softmax') ])/<code>

在PyTorch可以用

<code>modelPT= torch.nn.Sequential( torch.nn.Linear(784,10),torch.nn.Sigmoid(), torch.nn.Linear(10,10), torch.nn.LogSoftmax(dim=1) )/<code>

D)定义优化器和损失函数

同样,指定优化器和损失函数的方法是也差不多。使用 TensorFlow ,我们可以这样做:

<code>modelTF.compile( 
               loss="categorical_crossentropy",     
               optimizer=tf.optimizers.SGD(lr=0.01), 
               metrics = ['accuracy'] 
               )/<code>

而 PyTorch 如下:

<code>criterion = torch.nn.NLLLoss() 
optimizer = torch.optim.SGD(modelPT.parameters(), lr=0.01)/<code>

E)训练模型

训练模型是两个接口差距最大的部分。在 TensorFlow 的情况下,我们只能使用以下代码行:

<code>_ = modelTF.fit(x_trainTF, y_trainTF, epochs=epochs, 
                batch_size=batch_size, verbose = 0)/<code>

在 PyTorch 中,我们需要更长的代码:

<code>for e in range(epochs):
    for images, labels in xy_trainPT_loader:
        images = images.view(images.shape[0], -1)
        loss = criterion(modelPT(images), labels)
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()/<code>

在 PyTorch 中,没有像在 Keras 或 Scikit-learn 中 fit ()那样的“预制”数据模型调整函数,因此训练循环必须由程序员指定。好吧,这里有一个折衷方案,在简单和实用之间,能够做更多的量身定做的事情。

F)评估模型

当我们需要评估模型时,同样的情况也会发生,而在 TensorFlow 中,你只需要用测试数据调用方法 evaluate ():

<code>_, (x_testTF, y_testTF)= tf.keras.datasets.mnist.load_data()
x_testTF = x_testTF.reshape(10000, 784).astype('float32')/255
y_testTF = tf.keras.utils.to_categorical(y_testTF, num_classes=10)

_ , test_accTF = modelTF.evaluate(x_testTF, y_testTF)
print('\nAccuracy del model amb TensorFlow =', test_accTF)TensorFlow model Accuracy = 0.8658999800682068/<code>

在 PyTorch 中,再次要求程序员指定评估循环:

<code>xy_testPT = torchvision.datasets.MNIST(root='./data', train=False, download=True, 
            transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor()]))

xy_test_loaderPT = torch.utils.data.DataLoader(xy_testPT)

correct_count, all_count = 0, 0
for images,labels in xy_test_loaderPT:
  for i in range(len(labels)):
    img = images[i].view(1, 784)

    logps = modelPT(img)
    ps = torch.exp(logps)
    probab = list(ps.detach().numpy()[0])
    pred_label = probab.index(max(probab))
    true_label = labels.numpy()[i]
    if(true_label == pred_label):
      correct_count += 1
    all_count += 1

print("\nAccuracy del model amb PyTorch =", (correct_count/all_count))TensorFlow model Accuracy = 0.8657/<code>

2.两者殊途同归!

好吧,如这个简单的例子所示,在TensorFlow和Pythorch中创建神经网络的方法其实并没有什么不同,只是在一些细节上,程序员必须实现训练和评估循环,并且在不同的步骤中指定了一些超参数,如epoch或batch_size。

事实上,这两个框架在过去两年中一直在不断地融合,相互学习并采用它们的最佳特性。例如,在不久前发布的 TensorFlow 2.2的新版本中,训练步骤可以等同于PyTorch ,现在程序员可以通过实现 traint_step ()来指定循环体的详细内容。所以不要担心选择“错误”的框架,它们会收敛的!最重要的是要学习背后的深度学习概念,而你在其中一个框架中获得的所有知识都将对你在另一个框架中有作用。

3.工作还是研究?

如果你想在神经网络中将解决方案投入工作或进行研究,两者存在不同之处。在这种情况下,选择正确的接口十分重要。

TensorFlow 是一个非常强大和成熟的 Python库,具有强大的可视化功能和各种选择高性能的模型开发,它有可供生产和自动支持 web 和移动平台的推出选项。

另一方面, PyTorch 仍然是一个年轻的框架,而且有一个非常活跃的社区,特别是在研究领域。如下图片所示,Pythorch的兴起和采用基于在主要会议主题(CVPR、ICRL、ICML、NIPS、ACL、ICCV等)上发表的研究论文的数量。

深度学习框架哪个最好用?TensorFlow还是PyTorch?

从2018年的数据可以看出, PyTorch 框架的使用相对于2019年是少数的,而2019年的使用是压倒性的。

因此,如果你想创建与人工智能相关的产品, TensorFlow 是一个很好的选择。如果你想做研究,我推荐 PyTorch 。

4. 如果不知道选哪个,请选择 Keras

如果你不确定,那就从 TensorFlow 的 Keras API 开始吧。PyTorch 的 API 有更多的灵活性和控制,但很明显 TensorFlow 的 Keras API 更容易上手。

顺便说一句, Keras 计划在2020年推出几项新功能,这些产品符合“让事情变得更容易”的标准。下面是最近添加的一些新特性:

层和预处理接口

到目前为止,我们已经用 NumPy 和 PIL ( Python 影像库)编写的辅助工具进行了预处理。这种外部预处理使得模型变得不那么便携,因为每次有人重用一个已经训练过的模型时,他们都必须重放预处理器接口。因此,通过“预处理层”,预处理现在可以成为模型的一部分。这包括文本标准化、标记化、矢量化、图像归一化、数据增强等方面。也就是说,这将允许模型接受原始文本或原始图像作为输入。

Keras调参器

它是一个框架,允许你在 Keras 中找到最好的超参数模型。当你花了一些时间在深度学习中工作时,你会发现这解决了模型构建的一个代价高昂的问题,例如精炼超参数,使模型性能最佳。这是一项非常困难的任务。

AutoKeras

如果你的项目要求在几行代码中为数据找到一个好的 ML 模型,那么你就能在可能的模型空间里自动搜索最好的模型,并使用 Keras 调参器查找超参数。对于高级用户来说, AutoKeras 还允许对搜索空间和进程的配置进行更高级别的控制。

Cloud Keras

Cloud Keras的愿景是让程序员更容易地在本地进行开发工作,然后将代码存放到云端,使其能够在云端以最佳和分布式的方式执行此代码,而不必担心集群或Docker参数。

与TensorFlow集成

为了更好地与 TFX ( TensorFlow Extended ,一个管理 ML 生产应用程序的平台)集成,以及更好地支持将模型导出到 TF Lite (移动和嵌入式设备的 ML 执行引擎)。毫无疑问,提高对模型生产的支持对于 Keras 忠实粉丝来说是至关重要的。

5.总结

你认为哪种语言是开始编程的最佳语言, C ++还是 Java ?这取决于我们想用它做什么,最重要的是,我们可以使用什么工具来学习。在这方面我们可能永远无法达成一致,因为每个人都有一个先入为主的观点,我们很难改变我们彼此对这个问题的答案。但我们肯定都同意,我们的目的就是要知道如何编程。事实上,无论我们从一种语言的编程中学到什么,当我们使用另一种语言时,它都会为我们服务,对吧?同样的事情发生在这里的框架,重要的是了解深度学习,而不是关于一个框架的语法细节,然后我们将使用这个知识的框架是在节省我们的访问时间。

这篇文章的代码可以从 GitHub 上下载:https://github.com/jorditorresBCN/PyTorch-vs-TensorFlow/blob/master/MNIST-with-PyTorch-and-TensorFlow.ipynb


--END--

学习更多人工智能知识,欢迎关注我们的公众号:为AI呐喊(weainahan)


分享到:


相關文章: