TensorFlow还是PyTorch?哪一个才更适合编写深度神经网络?

简介: TensorFlow还是PyTorch?哪一个才更适合编写深度神经网络?

1. 神经网络编程步骤

a)导入必要的库

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

import numpy as np
import matplotlib.pyplot as plt
epochs = 10
batch_size=64
对于TensorFlow,您仅需要额外导入以下库:
import tensorflow as tf
而对于PyTorch,您还需要导入这两个库:
import torch
import torchvision

b)导入并预处理数据

使用TensorFlow加载和准备数据可以使用以下两行代码:

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

而在PyTorch则是这两行代码:

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)

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

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

image.png

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

image.png

c)定义模型

在定义模型的时候,这两种框架都使用相当相似的语法来完成。对于TensorFlow,可以使用以下代码来完成:

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

在PyTorch下则这么完成:

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

d)定义优化器与损失函数

同样,指定优化器和loss函数的方法在两个框架下也是很相似的。在TensorFlow下,我们可以这样做:

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

在PyTorch下则是这样的:

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

e)训练模型

最大的不同在于训练。对于TensorFlow,我们只需要这一行代码:

_ = modelTF.fit(x_trainTF, y_trainTF, epochs=epochs,
                 batch_size=batch_size, verbose = 0)

而在PyTorch下则更长,像这样:

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

PyTorch没有内置像在Keras或Scikit-learn中非常常见的fit()等训练方法,因此训练循环必须由程序员手动指定。嗯,这其实是在简单性和实用性之间进行一定的折衷,以便能够做更多自定义的事情。

f)评估模型

评估模型也是如此,在TensorFlow中,您只需对测试数据调用evaluate()方法:

_, (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

在PyTorch中,再次需要程序员手动定义评估循环:

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

2. 更重要的是,它们在相互融合!

好了,如这个简单的示例所示,在TensorFlow和PyTorch中创建神经网络的方式并没有真正的区别,只是在一些细节方面,程序员必须实现训练和评估循环的方式,以及一些超参数,像epochbatch_size是在不同的步骤中指定的。

实际上,在过去两年中,这两个框架一直在不断融合,相互学习并采用它们的长处。例如,在几周前发布的新版本TensorFlow 2.2中,训练步骤可以像PyTorch一样,现在程序员可以通过实现train_step()来指定循环主体的详细内容。因此,不必担心选择“错误的”框架,它们正在相互融合!最重要的是要学习背后的深度学习概念,您在其中一个框架中获得的所有知识在另一个框架下照样有用。

3. 工业应用还是学术研究?

但是,很明显,神经网络的工业应用与学术研究是截然不同的。在这种情况下,决定选择哪一个很重要。

TensorFlow是一个非常强大且成熟的Python库,具有强大的可视化功能以及用于高性能模型开发的各种选项。它具有准备用于生产的部署共轭能,并自动支持Web和移动平台。

另一方面,PyTorch仍然是一个年轻的框架,但是拥有一个非常活跃的社区,尤其是在研究领域。门户网站The Gradient在附图中显示了主要的深度学习会议(CVPR,ICRL,ICML,NIPS,ACL,ICCV等)发表的研究论文中PyTorch的使用量,可以看到PyTorch在研究界的兴起和广泛采用。

从2018年的数据可以看出,Pythorch框架的使用还是少数,而相比之下,2019年的使用量对比TensorFlow是压倒性的。因此,如果你想创造与人工智能相关的产品,TensorFlow是一个不错的选择。如果你想做研究,我推荐PyTorch。

4. 新手请选择Keras

如果你还是个萌新,对这一切都还很不了解,请从TensorFlow的Keras API开始。PyTorch的API具有更大的灵活性和控制力,但显然TensorFlow的Keras API可以更容易上手。而且,如果您正在阅读这篇文章,我假定您是深度学习领域的入门者。

顺便说一句,Keras计划在2020年推出几种新特性,它们都是为了“让事情变得更容易”。以下是最近添加的或即将发布的一些新功能的列表:

  • 预处理层API

到目前为止,我们已经使用NumPy和PIL(Python Imaging Library)编写的辅助工具完成了预处理。这种外部预处理使模型的可移植性降低,因为每次有人重用已经训练好的模型时,他们都必须重新实现整个预处理流程。因此,通过“预处理层”,预处理现在可以成为模型的一部分。这包括诸如文本标准化,标记化,向量化,图像标准化,数据增强等方面。也就是说,这将允许模型接受原始文本或原始图像作为输入。我个人认为这将非常有趣。

  • Keras Tuner

这是一个可让您在Keras中找到模型的最佳超参数的框架。当你开始进行一些深度学习工作时,您会发现超参数的调整将是整个工作中最为繁重的部分,这个框架旨在解决这一问题。

  • AutoKeras

该项目旨在用几行代码建立一个很好的机器学习模型,根据可能的模型空间自动搜索最佳模型,并使用Keras Tuner查找进行超参数调整。对于高级用户,AutoKeras还允许对搜索空间和过程的配置进行更高级别的控制。

  • Cloud Keras

我们的愿景是让程序员更容易地将本地代码(我们的笔记本电脑或Google Colab本地工作)移动到云端,使其能够在云端以最佳和分布式的方式执行此代码,而不必担心集群或Docker参数。

  • 与TensorFlow集成

与TFX(TensorFlow Extended,用于管理机器学习生产应用程序的平台)进行更多集成的工作正在进行中,并为将模型导出到TF Lite(用于移动和嵌入式设备的机器学习执行引擎)提供更好的支持。毫无疑问,改善对模型生产的支持对于Keras程序员的忠诚度至关重要。

5. 小结

打个比方,你认为哪种语言是入门编程的最佳语言,C++还是Java?好吧…这取决于我们想用它做什么,最重要的是取决于我们能学到什么样的工具。我们可能无法达成一致,因为我们有一个先入为主的观点,我们很难改变对这个问题的回答(同样的情况也发生在PyTorch和TensorFlow的“粉丝”身上😉 )。但我们都同意的一点是,最重要的是知道如何编程。事实上,无论我们从一种语言的编程中学到什么,当我们使用另一种语言时,它都会为我们服务,对吧?对于框架来也是如此,重要的是要了解深入学习,而不是框架的语法细节,然后我们将这些知识用于正在流行的框架或者我们想用的其他框架。

作者:Jordi TORRES.AI

deephub翻译组:Alexander Zhao

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 PyTorch
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
RPN(Region Proposal Networks)候选区域网络算法解析(附PyTorch代码)
233 1
|
2月前
|
机器学习/深度学习 编解码 PyTorch
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
Pytorch实现手写数字识别 | MNIST数据集(CNN卷积神经网络)
|
1月前
|
机器学习/深度学习 PyTorch 测试技术
|
3月前
|
机器学习/深度学习 算法 TensorFlow
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
63 0
文本分类识别Python+卷积神经网络算法+TensorFlow模型训练+Django可视化界面
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
61 0
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)
60 0
|
10天前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch小技巧:使用Hook可视化网络层激活(各层输出)
这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。
12 1
|
1月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
57 2
|
1月前
|
机器学习/深度学习 自然语言处理 PyTorch
【PyTorch实战演练】基于全连接网络构建RNN并生成人名
【PyTorch实战演练】基于全连接网络构建RNN并生成人名
23 0
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
卷积神经元网络中常用卷积核理解及基于Pytorch的实例应用(附完整代码)
卷积神经元网络中常用卷积核理解及基于Pytorch的实例应用(附完整代码)
20 0