当前位置: 首页 > 科技观察

对比复现34个预训练模型,PyTorch和Keras你选谁?

时间:2023-03-17 01:08:56 科技观察

Keras和PyTorch当然是最适合初学者的深度学习框架,它们就像一种简单的语言来描述架构,告诉框架使用哪一层。这样就减少了很多抽象的工作,比如设计静态计算图,定义每个张量的维度和内容等等。但是哪个框架更好呢?当然,不同的开发人员和研究人员有不同的爱好和看法。本文主要在抽象和性能方面对PyTorch和Keras进行比较,并介绍了一个新的基准测试,可以再现和比较两个框架的所有预训练模型。在Keras和PyTorch基准项目中,麻省理工学院博士生CurtisG.Northcutt重现了34个预训练模型。这个benchmark将Keras和PyTorch结合起来,统一到一个框架中,这样我们就可以知道两个框架的对比结果,知道对于不同的模型哪个框架更好。比如项目作者表示,ResNet架构的模型使用PyTorch优于Keras,Inception架构的模型使用Keras优于PyTorch。Keras和PyTorch基准测试项目:https://github.com/cgnorthcutt/benchmarking-keras-pytorch一、两种框架的性能和易用性作为TensorFlow的高层封装,Keras具有非常高的抽象层次,并且隐藏了许多API细节。虽然PyTorch比TensorFlow的静态计算图更易于使用,但Keras通常隐藏了更多细节。至于性能,其实每个框架都会进行很多优化,它们的差异不是很明显,不会作为主要的选择标准。1.易用性Keras是一个更高层次的框架,将常用的深度学习层和操作封装成方便的积木,像积木一样搭建复杂的模型。开发人员和研究人员无需考虑深度学习的复杂性。PyTorch提供了一个相对底层的实验环境,允许用户更自由地编写自定义层、查看数值优化任务等。例如,在PyTorch1.0中,编译工具torch.jit包含了一种名为TorchScript的语言,它是Python的子语言,开发者可以利用它进一步优化模型。我们可以通过定义一个简单的卷积网络来了解两者的易用性:model=Sequential()model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))model.add(MaxPool2D())model.add(Conv2D(16,(3,3),activation='relu'))model.add(MaxPool2D())model.add(Flatten())model.add(Dense(10,activation='softmax'))如上图是Keras的定义方法。很多时候,操作会作为参数嵌入到API中,这样代码会显得非常简洁。下面是PyTorch的定义方法。一般是通过class和instance来定义的,需要定义很多具体操作的维度参数。classNet(nn.Module):def__init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(3,32,3)self.conv2=nn.Conv2d(32,16,3)self.fc1=nn.Linear(16*6*6,10)self.pool=nn.MaxPool2d(2,2)defforward(self,x):x=self.pool(F.relu(self.conv1(x)))x=self.pool(F.relu(self.conv2(x)))xx=x.view(-1,16*6*6)x=F.log_softmax(self.fc1(x),dim=-1)returnxmodel=Net()虽然Keras感觉比PyTorch好用,但是两者区别不大,预计模型的编写会更方便。2.性能目前,很多对比各种框架性能的实验表明,PyTorch的训练速度比Keras更快。下面两张图表展示了不同框架在不同硬件和模型类型上的表现:下面两张图同时展示了不同模型在PyTorch和Keras框架下的表现。两次18年的测试都表明PyTorch比Keras快那么一点点。这两个对比的细节可以看:https://github.com/ilkarman/DeepLearningFrameworks/https://wrosinski.github.io/deep-learning-frameworks/二、Keras和PyTorchBenchmark现在如果我们从预训练模型从一个角度来看,同一个模型在不同框架上的验证集准确率是多少?在这个项目中,作者用两个框架共复现了34个预训练模型,并给所有的预训练模型验证了模型的准确率。所以这个项目不仅可以作为对比的依据,也可以作为学习资源。还有什么比直接学习经典模型的代码更好的方法呢?1.预训练模型不是可复现的吗?PyTorch中就是这种情况。但是,一些Keras用户发现很难重现。他们遇到的问题可以分为三类:无法重现已发布的Keras基准测试结果,即使将示例代码完全复制。事实上,他们报告的准确性(截至2019年2月)通常略高于实际准确性。当部署到服务器或与其他Keras模型顺序运行时,一些预训练的Keras模型会产生不一致或低准确性。使用批量归一化(BN)的Keras模型可能不可靠。对于某些模型,前向传递评估仍然会导致推理阶段的权重变化。这些问题是真实的,原始GitHub项目为每个问题提供了一个链接。项目作者的目标之一是通过为Keras预训练模型创建可重现的基准来帮助解决上述一些问题。解决方案分为以下三个方面,在Keras中完成:推理时避免batches。一次运行一个样本非常慢,但每个模型都会产生可重现的输出。仅在局部函数或with语句中运行模型,以确保在加载下一个模型时,不会将前一个模型的任何内容保留在内存中。2.预训练模型的可重现结果以下是Keras和PyTorch的“真实”验证集精度表(在macOS10.11.6、LinuxDebian9和Ubuntu18.04上验证)。3.复现方法首先需要下载ImageNet2012验证集,包含5万张图片。ILSVRC2012_img_val.tar下载完成后,运行以下命令行预处理/提取验证集:#CredittoSoumith:https://github.com/soumith/imagenet-multiGPU.torch$cd../&&mkdirval&&mvILSVRC2012_img_val.tarval/&&cdval&&tar-xvfILSVRC2012_img_val。tar$wget-qO-https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh|bashImageNet对验证集中每个例子的前5个预测都进行了预测,运行如下命令行将直接使用这些预计算结果并在几秒钟内重现Keras和PyTorch基准测试。$gitclonehttps://github.com:cgnorthcutt/imagenet-benchmarking.git$cdbenchmarking-keras-pytorch$pythonimagenet_benchmarking.py/path/to/imagenet_val_data可以在不使用预计算数据的情况下重现每个Keras和PyTorch的推理输出。Keras中的Inference耗时较长(5-10小时),因为forwardpass一次只计算一个example,避免了向量计算。这是迄今为止发现的能够可靠地重现相同精度的最佳方法。PyTorch中的推理非常快(不到一个小时)。复现代码如下:$gitclonehttps://github.com:cgnorthcutt/imagenet-benchmarking.git$cdbenchmarking-keras-pytorch$#ComputeoutputsofPyTorchmodels(1hour)$./imagenet_pytorch_get_predictions.py/path/to/imagenet_val_data$#ComputeoutputsofKerasmodels(5-10hours)$./imagenet_keras_get_predictions.py/path/to/imagenet_val_data$#Viewbenchmarkresults$./imagenet_benchmarking.py/path/to/imagenet_val_data可以控制GPU使用率、batchsize、输出存储目录等,添加-hflag运行时,可以查看命令行参数选项。看完文章,你更喜欢谁呢?原文链接:http://l7.curtisnorthcutt.com/towards-reproducibility-benchmarking-keras-pytorch《机器之心(id:almosthuman2014)》】点此阅读本作者更多好文