全文共3376字,预计学习时长7分钟
对许多科学家、工程师和开发人员而言,TensorFlow是他们的第一个深度学习框架。
TensorFlow 1.0于2017年2月发布;但客观来说,它对用户不是非常友好。
过去几年里,由于Keras和PyTorch比TensorFlow更容易使用,这两个主要的深度学习库已得到较广的普及。
本文将从四个方面来介绍Keras和Pytorch,以及选择其中一个学习库的理由。
Keras
Keras自身并不是框架,它其实是一个位于其他高级学习框架之上的高级API。目前,它支持TensorFlow, Theano和CNTK。
Keras的吸引力在于使用简单。它是目前为止启动和运行最快且最简单的框架。神经网络的定义是直观的,使用功能API则允许人们将函数定义为层次。
Pytorch
Pytorch是由Facebook AI 研究组开发的深度学习框架(如Tensorflow)。像Keras一样,它也提炼了深度网络编程的大多混乱部分。
就编码风格的高级和低级而言,Pytorch介于Keras和TensorFlow之间。使用时,你有比Keras更多的灵活性和控制力,同时还无需冗长的声明式编程。
应该使用哪一个编程框架,是深度学习练习者一直在争论的问题。一般来说,这取决于个人偏好。但在做选择时,需要记住Keras和Pytorch的这几个方面的知识。
用于定义模型的类与函数
为了定义深度学习模型,Keras设置了功能API。在功能API的范畴里,神经网络被定义为一组顺序函数,需要接连使用。比如说,函数定义层1的输出是函数定义层2的输入。
img_input = layers.Input(shape=input_shape)x = layers.Conv2D(64, (3, 3), activation='relu')(img_input)x = layers.Conv2D(64, (3, 3), activation='relu')(x)x = layers.MaxPooling2D((2, 2), strides=(2, 2))(x)
而Pytorch将网络设置为一个类,该类拓展了Torch库中的torch.nn模块。与Keras类似,Pytorch使用的层为构建块,但由于它们在Pytorch的类中,因此它们属于‘__init__()’类下的一种字符,并由‘forward()’类执行。
class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, 3) self.conv2 = nn.Conv2d(64, 64, 3) self.pool = nn.MaxPool2d(2, 2) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(F.relu(self.conv2(x))) return xmodel = Net()
因为Pytorch允许访问Python的所有的类功能而不是简单的函数调用,所以定义网络可以更清晰,包容量更多。这真没有什么不好的,除非你认为,尽可能快地编写网络代码对你来说是最重要的,那么Keras使用起来会更方便。
张量和计算图对比标准数列
对于随意的程序员来说,Keras API隐藏了许多混乱的细节。定义网络层十分直观,通常默认设置就足够入门。
只有你处理到前沿的、或是奇特的模型时,才需要开始着手处理低级、细节的TensorFlow。
然而麻烦的是,当你处理到更低级别的TensorFlow时,随之而来的是所有具有挑战性的部分。必须保证排好所有的矩阵乘法。你甚至不用尝试打印任何一个图层输出,因为你将在终端得到一个漂亮的Tensor定义。
Pytorch对这些方面的要求往往更加宽松。你必须知道每个层输入和输出的大小,但这是一个可以快速掌握的简单技能。不必构建一个无法在调试中直观看到的抽象计算图。
Pytorch的另一个优点是可以在Torch Tensors和Numpy阵列之间来回切换。如果你要做一些自定义的东西,那么在TF张量和Numpy阵列之间来回切换可能会很麻烦。此时,开发人员需要对TensorFlow会话有充分的了解。
Pytorch的交互操作实际上更简单。你只要知道两个操作:一个是将Torch Tensor(一个变量对象)切换为Numpy,另一个就是切换到相反方向。
当然,如果你不需要执行任何花哨的东西,那么Keras就已经足够好了,因为不会遇到任何TensorFlow的阻碍。但如果你需要执行复杂的编程,那么使用Pytorch可能会更顺畅。
训练模型
在Keras中训练模型非常简单!仅需一个的‘.fit()’,你就可以甩开步子,享受这场“编程之行”。
history = model.fit_generator( generator=train_generator, epochs=10, validation_data=validation_generator)
在Pytorch中训练模型包括几个步骤:
1. 每批训练开始时初始化梯度
2. 运行前进模式
3. 运行后退模式
4. 计算损失并更新权重
for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # Get the inputs; data is a list of [inputs, labels] inputs, labels = data # (1) Initialise gradients optimizer.zero_grad() # (2) Forward pass outputs = net(inputs) loss = criterion(outputs, labels) # (3) Backward loss.backward() # (4) Compute the loss and update the weights optimizer.step()
这些都不过是运行训练的常见步骤!
如此一来,你总能意识到发生了什么。同时,由于这些模型训练步骤在训练不同模型时基本保持不变,因此它们显得十分不必要。
控制CPU与GPU模式
如果安装了tensorflow-gpu,你可以选择用Keras的默认设置启动并使用GPU。然后,如果你想把某些操作移动到CPU里,可以执行以下单行操作:
with tf.device('/cpu:0'): y = apply_non_max_suppression(x)
至于Pytorch,你必须为每个torch张量和Numpy变量明确指定运行GPU。如果在CPU和GPU之间来回切换来进行不同的操作,这会使代码变得混乱,且有可能容易出错。
例如,要把以前的模型转移到GPU上运行,我们必须执行以下操作:
# Get the GPU devicedevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Transfer the network to GPUnet.to(device) # Transfer the inputs and labels to GPUinputs, labels = data[0].to(device), data[1].to(device)
Keras赢在它的简洁和良好的默认设置。
选择框架的一般建议
通常我们建议从Keras入门。
Keras无疑是最容易使用,理解且快速启动和运行的框架。你不用担心它的GPU设置,不需要摆弄抽象代码,总之,你不必做任何复杂的事情。你甚至可以在不触及任何一行TensorFlow 的情况下,执行自定义图层和损失函数的操作。
如果你开始深入了解深层网络的更精细的方面,或者正在执行一些非标准化的东西,那么Pytorch就是首选深度学习库。用Keras的话,就会多一些额外的工作,但不会太多,只不过这会使你的工作效率降低。可是,你依旧可以快速执行,训练和检测网络,而且还能轻松调试!
留言 点赞 关注
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”