作者|PRUDHVI VARMA
编译|VK
起源|Analytics Indiamag

在当今世界,人工智能已被大多数商业运作所利用,而且因为先进的深度学习框架,它非常容易部署。这些深度学习框架提供了高级编程接口,帮忙咱们设计深度学习模型。应用深度学习框架,它通过提供内置的库函数来缩小开发人员的工作,从而使咱们可能更快更容易地构建模型。

在本文中,咱们将构建雷同的深度学习框架,即在Keras、PyTorch和Caffe中对同一数据集进行卷积神经网络图像分类,并对所有这些办法的实现进行比拟。最初,咱们将看到PyTorch构建的CNN模型如何优于内置Keras和Caffe的同行。

本文波及的主题

  • 如何抉择深度学习框架。
  • Keras的优缺点
  • PyTorch的优缺点
  • Caffe的优缺点
  • 在Keras、PyTorch和Caffe实现CNN模型。

抉择深度学习框架

在抉择深度学习框架时,有一些指标能够找到最好的框架,它应该提供并行计算、良好的运行模型的接口、大量内置的包,它应该优化性能,同时也要思考咱们的业务问题和灵活性,这些是咱们在抉择深度学习框架之前要思考的根本问题。让咱们比拟三个最罕用的深度学习框架Keras、Pytorch和Caffe。

Keras

Keras是一个开源框架,由Google工程师Francois Chollet开发,它是一个深度学习框架,咱们只需编写几行代码,就能够轻松地应用和评估咱们的模型。

如果你不相熟深度学习,Keras是初学者最好的入门框架,Keras对初学者非常敌对,并且易于与python一起工作,并且它有许多预训练模型(VGG、Inception等)。不仅易于学习,而且它反对Tensorflow作为后端。

应用Keras的局限性

  • Keras须要改良一些个性
  • 咱们须要就义速度来换取它的用户敌对性
  • 有时甚至应用gpu也须要很长时间。

应用Keras框架的理论实现

在上面的代码片段中,咱们将导入所需的库。

import kerasfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras import backend as K

超参数:

batch_size = 128num_classes = 10epochs = 12img_rows, img_cols = 28, 28(x_train, y_train), (x_test, y_test) = mnist.load_data()

在上面的代码片段中,咱们将构建一个深度学习模型,其中蕴含几个层,并调配优化器、激活函数和损失函数。

model = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),                 activation='relu',                 input_shape=input_shape))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(num_classes, activation='softmax'))model.compile(loss=keras.losses.categorical_crossentropy,              optimizer=keras.optimizers.Adam(),              metrics=['accuracy'])

在上面的代码片段中,咱们将训练和评估模型。

model.fit(x_train, y_train,          batch_size=batch_size,          epochs=epochs,          verbose=1,          validation_data=(x_test, y_test))score = model.evaluate(x_test, y_test, verbose=0)print('Test loss:', score[0])print('Test accuracy:', score[1])

PyTorch

PyTorch是一个由Facebook钻研团队开发的开源框架,它是深度学习模型的一种实现,它提供了python环境提供的所有服务和性能,它容许主动微分,有助于减速反向流传过程,PyTorch提供了各种模块,如torchvision,torchaudio,torchtext,能够灵便地在NLP中工作,计算机视觉。PyTorch对于钻研人员比开发人员更灵便。

PyTorch的局限性

  • PyTorch在钻研人员中比在开发人员中更受欢迎。
  • 它不足生产力。

应用PyTorch框架实现

装置所需的库

import numpy as npimport torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.utils.data.dataloader as dataloaderimport torch.optim as optimfrom torch.utils.data import TensorDatasetfrom torchvision import transformsfrom torchvision.datasets import MNIST

在上面的代码片段中,咱们将加载数据集并将其拆分为训练集和测试集。

train = MNIST('./data', train=True, download=True, transform=transforms.Compose([    transforms.ToTensor(), ]), )test = MNIST('./data', train=False, download=True, transform=transforms.Compose([    transforms.ToTensor(),]), )dataloader_args = dict(shuffle=True, batch_size=64,num_workers=1, pin_memory=True)train_loader = dataloader.DataLoader(train, **dataloader_args)test_loader = dataloader.DataLoader(test, **dataloader_args)train_data = train.train_datatrain_data = train.transform(train_data.numpy())

在上面的代码片段中,咱们将构建咱们的模型,并设置激活函数和优化器。

class Model(nn.Module):    def __init__(self):        super(Model, self).__init__()        self.fc1 = nn.Linear(784, 548)        self.bc1 = nn.BatchNorm1d(548)         self.fc2 = nn.Linear(548, 252)        self.bc2 = nn.BatchNorm1d(252)        self.fc3 = nn.Linear(252, 10)                  def forward(self, x):        a = x.view((-1, 784))        b = self.fc1(a)        b = self.bc1(b)        b = F.relu(b)        b = F.dropout(b, p=0.5)         b = self.fc2(b)        b = self.bc2(b)        b = F.relu(b)        b = F.dropout(b, p=0.2)        b = self.fc3(b)        out = F.log_softmax(b)        return outmodel = Model()model.cuda()optimizer = optim.SGD(model.parameters(), lr=0.001)

在上面的代码片段中,咱们将训练咱们的模型,在训练时,咱们将指定损失函数,即穿插熵。

model.train()losses = []for epoch in range(12):    for batch_idx, (data,data_1) in enumerate(train_loader):        data,data_1 = Variable(data.cuda()), Variable(target.cuda())        optimizer.zero_grad()        y_pred = model(data)         loss = F.cross_entropy(y_pred, target)        losses.append(loss.data[0])        loss.backward()        optimizer.step()        if batch_idx % 100 == 1:            print('\r Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(                epoch,                 batch_idx * len(data),                 len(train_loader.dataset), 100. * batch_idx / len(train_loader),                                loss.data[0]),                 end='')             print()

#评估模型evaluate=Variable(test_loader.dataset.test_data.type_as(torch.FloatTensor())).cuda()output = model(evaluate)predict = output.data.max(1)[1]pred = pred.eq(evaluate.data)accuracy = pred.sum()/pred.size()[0]print('Accuracy:', accuracy)

Caffe

Caffe(Convolutional Architecture for Fast Feature Embedding)是Yangqing Jia开发的开源深度学习框架。该框架反对人工智能畛域的钻研人员和工业利用。

大部分开发者应用Caffe是因为它的速度,它应用一个NVIDIA K40 GPU每天能够解决6000万张图像。Caffe有很多贡献者来更新和保护框架,而且与深度学习的其余畛域相比,Caffe在计算机视觉模型方面工作得很好。

Caffe的局限性

Caffe没有更高级别的API,所以很难做试验。

在Caffe中,为了部署咱们的模型,咱们须要编译源代码。

装置Caffe

!apt install -y caffe-tools-cpu

导入所需的库

import osimport numpy as npimport mathimport caffeimport lmdb

在上面的代码片段中,咱们将指定硬件环境。

os.environ["GLOG_minloglevel"] = '2'CAFFE_ROOT="/caffe"os.chdir(CAFFE_ROOT) USE_GPU = Trueif USE_GPU:    caffe.set_device(0)    caffe.set_mode_gpu()else:    caffe.set_mode_cpu()caffe.set_random_seed(1) np.random.seed(24)

在上面的代码片段中,咱们将定义有助于数据转换的image_generator和batch_generator 。

def image_generator(db_path):    db_handle = lmdb.open(db_path, readonly=True)     with db_handle.begin() as db:        cur = db.cursor()         for _, value in cur:             datum = caffe.proto.caffe_pb2.Datum()            datum.ParseFromString(value)             int_x = caffe.io.datum_to_array(datum)             x = np.asfarray(int_x, dtype=np.float32) t            yield x - 128 def batch_generator(shape, db_path):    gen = image_generator(db_path)    res = np.zeros(shape)     while True:         for i in range(shape[0]):            res[i] = next(gen)         yield res

在上面的代码片段中,咱们将给出MNIST数据集的门路。

num_epochs = 0 iter_num = 0 db_path = "content/mnist/mnist_train_lmdb"db_path_test = "content/mnist/mnist_test_lmdb"base_lr = 0.01gamma = 1e-4power = 0.75for epoch in range(num_epochs):    print("Starting epoch {}".format(epoch))    input_shape = net.blobs["data"].data.shape    for batch in batch_generator(input_shape, db_path):        iter_num += 1        net.blobs["data"].data[...] = batch        net.forward()        for name, l in zip(net._layer_names, net.layers):            for b in l.blobs:                b.diff[...] = net.blob_loss_weights[name]        net.backward()        learning_rate = base_lr * math.pow(1 + gamma * iter_num, - power)        for l in net.layers:            for b in l.blobs:                b.data[...] -= learning_rate * b.diff        if iter_num % 50 == 0:            print("Iter {}: loss={}".format(iter_num, net.blobs["loss"].data))        if iter_num % 200 == 0:            print("Testing network: accuracy={}, loss={}".format(*test_network(test_net, db_path_test)))

应用上面的代码片段,咱们将取得最终的准确性。

print("Training finished after {} iterations".format(iter_num))print("Final performance: accuracy={}, loss={}".format(*test_network(test_net, db_path_test)))

论断

在本文中,咱们演示了应用三个驰名框架:Keras、PyTorch和Caffe实现CNN图像分类模型的。咱们能够看到,PyTorch开发的CNN模型在精确度和速度方面都优于在Keras和Caffe开发的CNN模型。

作为一个初学者,我一开始应用Keras,这对于初学者是一个非常简单的框架,但它的利用是无限的。然而PyTorch和Caffe在速度、优化和并行计算方面是十分弱小的框架。

原文链接:https://analyticsindiamag.com...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/