Keras vs PyTorch vs Caffe: сравнение реализации CNN

машинное обучение глубокое обучение компьютерное зрение NLP

Автор | ПРУДХВИ ВАРМА Компилировать|ВКонтакте Источник | Аналитика Indiamag

В современном мире искусственный интеллект используется в большинстве бизнес-операций, и его очень легко развернуть благодаря передовым средам глубокого обучения. Эти фреймворки глубокого обучения предоставляют интерфейсы программирования высокого уровня, которые помогают нам разрабатывать модели глубокого обучения. Используя фреймворки глубокого обучения, он сокращает усилия разработчиков, предоставляя встроенные библиотечные функции, которые позволяют нам быстрее и проще создавать модели.

В этой статье мы построим один и тот же фреймворк глубокого обучения, т. е. классификацию изображений сверточной нейронной сети на одном и том же наборе данных в Keras, PyTorch и Caffe, и сравним реализации всех этих методов. Наконец, мы увидим, как модели CNN, созданные с помощью PyTorch, превосходят свои аналоги, созданные в Keras и Caffe.

Темы, затронутые в этой статье

  • Как выбрать фреймворк для глубокого обучения.

  • Плюсы и минусы Кераса

  • Плюсы и минусы PyTorch

  • Преимущества и недостатки Caffe

  • Реализуйте модели CNN в Keras, PyTorch и Caffe.

Выбор фреймворка для глубокого обучения

При выборе фреймворка глубокого обучения есть несколько показателей, чтобы найти лучший фреймворк, он должен обеспечивать параллельные вычисления, хороший интерфейс для запуска моделей, множество встроенных пакетов, он должен оптимизировать производительность, но также учитывать наши бизнес-задачи и свойства гибкости, это фундаментальные вопросы, которые мы должны рассмотреть, прежде чем выбрать фреймворк для глубокого обучения. Давайте сравним три наиболее часто используемых фреймворка глубокого обучения Keras, Pytorch и Caffe.

Keras

Keras — это фреймворк с открытым исходным кодом, разработанный инженером Google Франсуа Шоле, это фреймворк для глубокого обучения, мы можем легко использовать и оценивать наши модели, написав всего несколько строк кода.

Если вы новичок в глубоком обучении, Keras — лучший стартовый фреймворк для начинающих, Keras очень удобен для начинающих и прост в работе с python, а также имеет множество предварительно обученных моделей (VGG, Inception и т. д.). Он не только прост в освоении, но и поддерживает Tensorflow в качестве серверной части.

Ограничения использования Keras

  • Keras необходимо улучшить некоторые функции

  • Нам нужно пожертвовать скоростью ради удобства использования

  • Иногда даже использование графического процессора занимает много времени.

Практическая реализация с использованием фреймворка Keras

В приведенном ниже фрагменте кода мы импортируем необходимые библиотеки.

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

Гиперпараметры:

batch_size = 128
num_classes = 10
epochs = 12
img_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, могут гибко работать в НЛП, компьютерном зрении. PyTorch более гибок для исследователей, чем для разработчиков.

Ограничения PyTorch

  • PyTorch более популярен среди исследователей, чем среди разработчиков.

  • Ему не хватает продуктивности.

Реализовано с использованием фреймворка PyTorch.

Установите необходимые библиотеки

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data.dataloader as dataloader
import torch.optim as optim
from torch.utils.data import TensorDataset
from torchvision import transforms
from 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_data
train_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 out
model = 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 из-за его скорости, которая может обрабатывать 60 миллионов изображений в день с использованием одного графического процессора NVIDIA K40. У Caffe есть много участников, которые обновляют и поддерживают структуру, и по сравнению с другими областями глубокого обучения, Caffe очень хорошо работает с моделями компьютерного зрения.

Ограничения кафе

У Caffe нет высокоуровневого API, поэтому экспериментировать сложно.

В Caffe, чтобы развернуть нашу модель, нам нужно скомпилировать исходный код.

Установить кафе

!apt install -y caffe-tools-cpu

Импортируйте необходимые библиотеки

import os
import numpy as np
import math
import caffe
import lmdb

В следующем фрагменте кода мы укажем аппаратную среду.

os.environ["GLOG_minloglevel"] = '2'
CAFFE_ROOT="/caffe"
os.chdir(CAFFE_ROOT) 
USE_GPU = True
if 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.01
gamma = 1e-4
power = 0.75

for 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)))

в заключении

В этой статье мы демонстрируем реализацию модели классификации изображений CNN с использованием трех известных фреймворков: Keras, PyTorch и Caffe. Мы видим, что модели CNN, разработанные в PyTorch, превосходят модели CNN, разработанные в Keras и Caffe, как по точности, так и по скорости.

Как новичок, я начал с Keras, очень простого фреймворка для начинающих, но его применение ограничено. Но PyTorch и Caffe — очень мощные фреймворки с точки зрения скорости, оптимизации и параллельных вычислений.

Оригинальная ссылка:аналитика Индия mag.com/can ras-vs-friends…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/