TensorFlow vs PyTorch:哪个是深度学习网络编程的最佳框架呢?

TensorFlow vs PyTorch:哪个是深度学习网络编程的最佳框架呢?

哪种框架最适合神经网络编程呢?是TensorFlow还是PyTorch ?

首先让我们构建一个神经网络模型,该模型分别使用PyTorch和Keras(TensorFlow)对手写数字进行分类。

1.对神经网络进行编程的步骤

a)导入所需的Python库

在这两个框架中,我们需要首先导入一些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 vs 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 vs 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中,没有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('\nTensorFlow model Accuracy  =', 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("\nPyTorch model Accuracy=", (correct_count/all_count))
#PyTorch model Accuracy  = 0.8657/<code>

2.更多

正如这个简单的示例所示,它在TensorFlow和PyTorch中创建神经网络的方式实际上并没有什么不同,只是在一些细节上有所不同,比如程序员必须实现训练和评估循环,以及在不同步骤中指定了一些超参数,比如epochs或batch_size。

实际上,在过去两年中,这两个框架一直在不断融合,相互学习。例如,在发布的TensorFlow 2.2的新版本中,训练步骤可以等同于PyTorch,现在程序员可以通过实现traint_step()来指定循环体的详细内容。所以不要担心选错了框架。最重要的是要学习他们背后的深度学习概念,您在其中一个框架中获得的知识在另一个框架中仍然有用。

3.生产还是研究?

但是,如果你想要的是将一个解决方案投入生产或在神经网络中进行研究,情况就不同了。

TensorFlow是一个非常强大和成熟的Python库,具有强大的可视化特性和多种用于高性能模型开发的选项。它为生产和web和移动平台提供了自动支持。

另一方面,PyTorch仍然是一个年轻的框架,但是有一个非常活跃的社区,特别是在研究领域。

TensorFlow vs PyTorch:哪个是深度学习网络编程的最佳框架呢?

从图中可以看出,相比2018年,2019年使用PyTorch框架的人变多了。如果你想创造与人工智能相关的产品,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

这样做的目的是使程序员更轻松地将代码迁移到云中,从而使其能够以最佳的分布式方式在云中执行此代码,而不必担心群集或Docker参数。

与TensorFlow集成

与TFX (TensorFlow Extended,一个管理机器学习生产应用程序的平台)进行更多集成的工作正在进行中,并更好地支持将模型导出到TF Lite。

5.总结

重要的是要了解深度学习,而不是每个框架的语法细节,


分享到:


相關文章: