哪种框架最适合神经网络编程呢?是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>
<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>
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仍然是一个年轻的框架,但是有一个非常活跃的社区,特别是在研究领域。
从图中可以看出,相比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.总结
重要的是要了解深度学习,而不是每个框架的语法细节,