【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比
作者 | PRUDHVI VARMA?
編譯 | VK?
來(lái)源 | Analytics Indiamag
在當(dāng)今世界,人工智能已被大多數(shù)商業(yè)運(yùn)作所應(yīng)用,而且由于先進(jìn)的深度學(xué)習(xí)框架,它非常容易部署。這些深度學(xué)習(xí)框架提供了高級(jí)編程接口,幫助我們?cè)O(shè)計(jì)深度學(xué)習(xí)模型。使用深度學(xué)習(xí)框架,它通過提供內(nèi)置的庫(kù)函數(shù)來(lái)減少開發(fā)人員的工作,從而使我們能夠更快更容易地構(gòu)建模型。
在本文中,我們將構(gòu)建相同的深度學(xué)習(xí)框架,即在Keras、PyTorch和Caffe中對(duì)同一數(shù)據(jù)集進(jìn)行卷積神經(jīng)網(wǎng)絡(luò)圖像分類,并對(duì)所有這些方法的實(shí)現(xiàn)進(jìn)行比較。最后,我們將看到PyTorch構(gòu)建的CNN模型如何優(yōu)于內(nèi)置Keras和Caffe的同行。
本文涉及的主題
如何選擇深度學(xué)習(xí)框架。
Keras的優(yōu)缺點(diǎn)
PyTorch的優(yōu)缺點(diǎn)
Caffe的優(yōu)缺點(diǎn)
在Keras、PyTorch和Caffe實(shí)現(xiàn)CNN模型。
選擇深度學(xué)習(xí)框架
在選擇深度學(xué)習(xí)框架時(shí),有一些指標(biāo)可以找到最好的框架,它應(yīng)該提供并行計(jì)算、良好的運(yùn)行模型的接口、大量?jī)?nèi)置的包,它應(yīng)該優(yōu)化性能,同時(shí)也要考慮我們的業(yè)務(wù)問題和靈活性,這些是我們?cè)谶x擇深度學(xué)習(xí)框架之前要考慮的基本問題。讓我們比較三個(gè)最常用的深度學(xué)習(xí)框架Keras、Pytorch和Caffe。
Keras
Keras是一個(gè)開源框架,由Google工程師Francois Chollet開發(fā),它是一個(gè)深度學(xué)習(xí)框架,我們只需編寫幾行代碼,就可以輕松地使用和評(píng)估我們的模型。
如果你不熟悉深度學(xué)習(xí),Keras是初學(xué)者最好的入門框架,Keras對(duì)初學(xué)者十分友好,并且易于與python一起工作,并且它有許多預(yù)訓(xùn)練模型(VGG、Inception等)。不僅易于學(xué)習(xí),而且它支持Tensorflow作為后端。
使用Keras的局限性
Keras需要改進(jìn)一些特性
我們需要犧牲速度來(lái)?yè)Q取它的用戶友好性
有時(shí)甚至使用gpu也需要很長(zhǎng)時(shí)間。
使用Keras框架的實(shí)際實(shí)現(xiàn)
在下面的代碼片段中,我們將導(dǎo)入所需的庫(kù)。
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超參數(shù):
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()在下面的代碼片段中,我們將構(gòu)建一個(gè)深度學(xué)習(xí)模型,其中包含幾個(gè)層,并分配優(yōu)化器、激活函數(shù)和損失函數(shù)。
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'])在下面的代碼片段中,我們將訓(xùn)練和評(píng)估模型。
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是一個(gè)由Facebook研究團(tuán)隊(duì)開發(fā)的開源框架,它是深度學(xué)習(xí)模型的一種實(shí)現(xiàn),它提供了python環(huán)境提供的所有服務(wù)和功能,它允許自動(dòng)微分,有助于加速反向傳播過程,PyTorch提供了各種模塊,如torchvision,torchaudio,torchtext,可以靈活地在NLP中工作,計(jì)算機(jī)視覺。PyTorch對(duì)于研究人員比開發(fā)人員更靈活。
PyTorch的局限性
PyTorch在研究人員中比在開發(fā)人員中更受歡迎。
它缺乏生產(chǎn)力。
使用PyTorch框架實(shí)現(xiàn)
安裝所需的庫(kù)
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在下面的代碼片段中,我們將加載數(shù)據(jù)集并將其拆分為訓(xùn)練集和測(cè)試集。
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())在下面的代碼片段中,我們將構(gòu)建我們的模型,并設(shè)置激活函數(shù)和優(yōu)化器。
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)在下面的代碼片段中,我們將訓(xùn)練我們的模型,在訓(xùn)練時(shí),我們將指定損失函數(shù),即交叉熵。
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() #評(píng)估模型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開發(fā)的開源深度學(xué)習(xí)框架。該框架支持人工智能領(lǐng)域的研究人員和工業(yè)應(yīng)用。
大部分開發(fā)者使用Caffe是因?yàn)樗乃俣?#xff0c;它使用一個(gè)NVIDIA K40 GPU每天可以處理6000萬(wàn)張圖像。Caffe有很多貢獻(xiàn)者來(lái)更新和維護(hù)框架,而且與深度學(xué)習(xí)的其他領(lǐng)域相比,Caffe在計(jì)算機(jī)視覺模型方面工作得很好。
Caffe的局限性
Caffe沒有更高級(jí)別的API,所以很難做實(shí)驗(yàn)。
在Caffe中,為了部署我們的模型,我們需要編譯源代碼。
安裝Caffe
!apt?install?-y?caffe-tools-cpu導(dǎo)入所需的庫(kù)
import?os import?numpy?as?np import?math import?caffe import?lmdb在下面的代碼片段中,我們將指定硬件環(huán)境。
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)在下面的代碼片段中,我們將定義有助于數(shù)據(jù)轉(zhuǎn)換的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)?tyield?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數(shù)據(jù)集的路徑。
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.75for?epoch?in?range(num_epochs):print("Starting?epoch?{}".format(epoch))input_shape?=?net.blobs["data"].data.shapefor?batch?in?batch_generator(input_shape,?db_path):iter_num?+=?1net.blobs["data"].data[...]?=?batchnet.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.diffif?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)))使用下面的代碼片段,我們將獲得最終的準(zhǔn)確性。
print("Training?finished?after?{}?iterations".format(iter_num)) print("Final?performance:?accuracy={},?loss={}".format(*test_network(test_net,?db_path_test)))結(jié)論
在本文中,我們演示了使用三個(gè)著名框架:Keras、PyTorch和Caffe實(shí)現(xiàn)CNN圖像分類模型的。我們可以看到,PyTorch開發(fā)的CNN模型在精確度和速度方面都優(yōu)于在Keras和Caffe開發(fā)的CNN模型。
作為一個(gè)初學(xué)者,我一開始使用Keras,這對(duì)于初學(xué)者是一個(gè)非常簡(jiǎn)單的框架,但它的應(yīng)用是有限的。但是PyTorch和Caffe在速度、優(yōu)化和并行計(jì)算方面是非常強(qiáng)大的框架。
原文鏈接:https://analyticsindiamag.com/keras-vs-pytorch-vs-caffe-comparing-the-implementation-of-cnn/
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請(qǐng)說(shuō)明):總結(jié)
以上是生活随笔為你收集整理的【深度学习】Keras vs PyTorch vs Caffe:CNN实现对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盘点2020国内本科开设人工智能专业高校
- 下一篇: 本地缓存Caffeine