自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

新手必讀!如何入手卷積神經(jīng)網(wǎng)絡(luò)

開(kāi)發(fā) 開(kāi)發(fā)工具 深度學(xué)習(xí)
卷積神經(jīng)網(wǎng)絡(luò)可以算是深度神經(jīng)網(wǎng)絡(luò)中很流行的網(wǎng)絡(luò)了。本文從基礎(chǔ)入手,介紹了卷積網(wǎng)絡(luò)的基本原理以及相關(guān)的其它技術(shù),并利用卷積網(wǎng)絡(luò)做了一個(gè)簡(jiǎn)單項(xiàng)目作為示例參考。

卷積神經(jīng)網(wǎng)絡(luò)可以算是深度神經(jīng)網(wǎng)絡(luò)中很流行的網(wǎng)絡(luò)了。本文從基礎(chǔ)入手,介紹了卷積網(wǎng)絡(luò)的基本原理以及相關(guān)的其它技術(shù),并利用卷積網(wǎng)絡(luò)做了一個(gè)簡(jiǎn)單項(xiàng)目作為示例參考。想入手 CNN 的朋友不可錯(cuò)過(guò)~

[[267333]]

首先,我們先看看下面這張照片:

[[267334]]

圖源:Pix2PixHD

這不是一張真實(shí)的照片,你可以新建一個(gè)窗口來(lái)打開(kāi)它,放大看看,可以看到馬賽克。

實(shí)際上,這張照片是由 AI 生成的,是不是看起來(lái)很真實(shí)?

從 Alex Krizhevsky 及其朋友通過(guò) ImageNet 公布這項(xiàng)技術(shù)至今,不過(guò)才七年。ImageNet 是一個(gè)大規(guī)模圖像識(shí)別競(jìng)賽,每年都會(huì)舉辦,識(shí)別種類達(dá) 1000 多種,從阿拉斯加雪橇犬到廁紙應(yīng)用盡有。之后,他們又創(chuàng)建了 AlexNet,獲得了 ImageNet 競(jìng)賽冠軍,遠(yuǎn)超第二名。

這項(xiàng)技術(shù)就是卷積神經(jīng)網(wǎng)絡(luò)。它是深度神經(jīng)網(wǎng)絡(luò)的一個(gè)分支,處理圖像的效果格外好。

卷積神經(jīng)網(wǎng)絡(luò)

圖源:ImageNet

上圖是幾年來(lái)贏得 ImageNet 挑戰(zhàn)賽的軟件產(chǎn)生的誤差率??梢园l(fā)現(xiàn),2016 年誤差率降到了 5%,已經(jīng)超越人類水平。

深度學(xué)習(xí)的引入與其說(shuō)是改變規(guī)則,不如說(shuō)是在打破規(guī)則。

卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)

那么問(wèn)題來(lái)了,卷積神經(jīng)網(wǎng)絡(luò)到底是怎么運(yùn)作的呢?

[[267335]]

卷積神經(jīng)網(wǎng)絡(luò)之所以優(yōu)于其它深度神經(jīng)網(wǎng)絡(luò)是由于它特殊的操作。相比一次只計(jì)算圖像中的單個(gè)像素,CNN 將多個(gè)像素的信息組合在一起(比如上圖中計(jì)算了 3*3 的像素),因此能夠理解時(shí)間模式。

另外,CNN 可以「看到」一組像素組合成一條直線或者曲線。由于深度神經(jīng)網(wǎng)絡(luò)通常都是多層卷積的堆疊,通過(guò)上一層得到了直線或者曲線后,下一層不再組合像素,而是將線組合成形狀,一層一層進(jìn)行下去,直到形成完整的圖片。

卷積神經(jīng)網(wǎng)絡(luò)

來(lái)自 Mynepalli 的深度卷積神經(jīng)網(wǎng)絡(luò)圖

要想深入理解 CNN,你需要學(xué)習(xí)很多基礎(chǔ)知識(shí),比如什么是核,什么是池化層。但是現(xiàn)在有很多優(yōu)秀的開(kāi)源項(xiàng)目,你可以直接在他們的基礎(chǔ)上進(jìn)行研究并加以利用。

這就引入了另一門(mén)技術(shù)——遷移學(xué)習(xí)。

遷移學(xué)習(xí)

遷移學(xué)習(xí)使用訓(xùn)練好的深度學(xué)習(xí)模型來(lái)學(xué)習(xí)特定的任務(wù)。

舉個(gè)栗子,比如你在火車調(diào)度公司工作,你們想在不增加勞動(dòng)力的情況下,預(yù)測(cè)火車是否晚點(diǎn)。

你完全可以利用 ImageNet 上的卷積神經(jīng)網(wǎng)絡(luò)模型,比如說(shuō) 2015 年的冠軍 ResNet。用火車圖片重新訓(xùn)練網(wǎng)絡(luò),相信我,結(jié)果不會(huì)讓你失望的。

遷移學(xué)習(xí)主要有兩大優(yōu)勢(shì):

  • 相比于從頭開(kāi)始訓(xùn)練,只需要少量圖片就可以得到很好的效果。ImageNet 競(jìng)賽提供了一百萬(wàn)張圖片用于訓(xùn)練。使用遷移學(xué)習(xí),你只需要 1000 甚至 100 張圖片就可以訓(xùn)練出一個(gè)很好的模型,因?yàn)槟愕念A(yù)訓(xùn)練模型已經(jīng)在一百萬(wàn)張圖片上訓(xùn)練過(guò)了。
  • 較少的訓(xùn)練時(shí)間就能實(shí)現(xiàn)良好的性能。為了得到和 ImageNet 模型同樣好的效果,你可能需要訓(xùn)練數(shù)天,這還不包括模型效果不好時(shí)對(duì)其進(jìn)行調(diào)整所需的時(shí)間。然而使用遷移學(xué)習(xí),你可能只需要幾個(gè)小時(shí)甚至幾分鐘就可以完成特定任務(wù)的訓(xùn)練,大大節(jié)省了時(shí)間。

圖像分類到圖像生成

有了遷移學(xué)習(xí)之后大家產(chǎn)生了許多有趣的想法。既然我們可以處理圖像、識(shí)別圖像中的信息,那我們?yōu)槭裁床蛔约荷蓤D像呢?

因吹斯汀!

生成對(duì)抗網(wǎng)絡(luò)由此應(yīng)運(yùn)而生。

[[267336]]

朱俊彥等人提出的 CycleGAN

給定某些輸入,這項(xiàng)技術(shù)可以生成對(duì)應(yīng)的圖片。

如上圖所示,CycleGAN 可以根據(jù)一幅畫(huà)生成對(duì)應(yīng)的真實(shí)照片,也可以根據(jù)草圖生成背包的照片,甚至可以進(jìn)行超分辨率重建。

[[267337]]

超分辨率生成對(duì)抗網(wǎng)絡(luò)

很神奇,對(duì)嗎?

當(dāng)然,你可以學(xué)習(xí)構(gòu)建這些網(wǎng)絡(luò)。但如何開(kāi)始呢?

卷積神經(jīng)網(wǎng)絡(luò)教程

首先你要知道,入門(mén)很簡(jiǎn)單,但掌握就不是那么容易了。

我們先從最基礎(chǔ)的開(kāi)始。

[[267338]]

圖源:Thomas Verbruggen on Unsplash

航拍仙人掌識(shí)別

這是 Kaggle 上的學(xué)習(xí)項(xiàng)目,你的任務(wù)是識(shí)別航拍圖像中是否有柱狀仙人掌。

是不是看起來(lái)非常簡(jiǎn)單?

Kaggle 提供了 17500 張圖片,其中 4000 張未標(biāo)注的作為測(cè)試集。如果你的模型能夠正確標(biāo)注 4000 張圖片,就會(huì)得滿分 1 或者 100%。

我找了好久,終于找到下面這個(gè)非常適合新手入門(mén)的項(xiàng)目。

仙人掌

這張圖像與上面的類似。它大小為 32*32,其中包含或者不包含柱狀仙人掌。因?yàn)槭呛脚膱D片所以包含各種不同角度。

所以你需要什么呢?

用 python 構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)

是的,Python——深度學(xué)習(xí)領(lǐng)域最受歡迎的語(yǔ)言。至于深度學(xué)習(xí)框架,你有很多種選擇,可以自己逐一嘗試:

  • Tensorflow,最受歡迎的深度學(xué)習(xí)框架,由谷歌工程師構(gòu)建,并且擁有最多的貢獻(xiàn)者和粉絲。由于社群比較龐大,當(dāng)你有問(wèn)題時(shí)可以很容易找到解決方案。它們的高階 API keras,在入門(mén)者中很受歡迎。
  • Pytorch,我最喜歡的深度學(xué)習(xí)框架。純 Python 實(shí)現(xiàn),因此繼承了 Python 的各種優(yōu)缺點(diǎn)。Python 開(kāi)發(fā)者會(huì)很容易上手。它還有 FastAI 庫(kù)提供抽象,就像 Keras 之于 Tensorflow。
  • MXNet,Apache 開(kāi)發(fā)的深度學(xué)習(xí)框架。
  • Theano,Tensorflow 的前身。
  • CNTK,微軟開(kāi)發(fā)的深度學(xué)習(xí)框架。

這篇教程中使用的就是我最喜歡的 Pytorch,并且使用 FastAI。

開(kāi)始之前,你需要安裝 Python。瀏覽 Python 的官網(wǎng),下載你需要的版本。需要確保的是一定要用 3.6+的版本,否則將不支持你需要用到的一些庫(kù)。

現(xiàn)在,打開(kāi)你的命令行或者終端,安裝下面這些庫(kù):

  1. pip install numpy  
  2. pip install pandas  
  3. pip install jupyter 

Numpy 用于存儲(chǔ)輸入圖像,pandas 用于處理 CSV 文件,Jupyter notebook 用于編碼。

然后,去 Pytorch 官網(wǎng)下載需要的版本,并且如果你想加速訓(xùn)練的話,要安裝 CUDA 版本的 Pytorch,并且版本至少是 1.0 以上。

上面這些搞定之后,安裝 torchvision 和 FastAI:

  1. pip install torchvision  
  2. pip install fastai 

運(yùn)行 Jupyter notebook 命令,打開(kāi) Jupyter,它將打開(kāi)一個(gè)瀏覽器窗口。

這樣所需環(huán)境就配置好了,我們開(kāi)始吧。

準(zhǔn)備數(shù)據(jù)

導(dǎo)入需要的代碼:

  1. import numpy as np 
  2. import pandas as pd  
  3. from pathlib import Path  
  4. from fastai import *  
  5. from fastai.vision import *  
  6. import torch  
  7. %matplotlib inline 

Numpy 和 Pandas 基本是做什么任務(wù)都會(huì)需要的。FastAI 和 Torch 是你的深度學(xué)習(xí)庫(kù)。Matplotlib Inline 用于顯示圖表。

下面就可以從 Kaggle 競(jìng)賽官網(wǎng)上下載數(shù)據(jù)了。

解壓 zip 文件,并放置于 Jupyter notebook 文件夾中。

假設(shè)你的 notebook 被命名為 Cacti。你的文件夾結(jié)構(gòu)會(huì)是下面這樣:

Train 文件夾里包含所有的訓(xùn)練圖片。

Test 文件夾是用于提交的測(cè)試圖片。

Train CSV 文檔里包含訓(xùn)練數(shù)據(jù)的信息,將圖片名與列 has_cactus 映射,如果該列有 cactus,則值為 1,否則為 0。

Sample Submission CSV 中是提交所需的格式。文件名和 Test 文件夾中的圖片相對(duì)應(yīng)。

  1. train_df = pd.read_csv("train.csv") 

將 Train CSV 文檔加載到數(shù)據(jù)幀中。

  1. data_folder = Path(".")  
  2. train_images = ImageList.from_df(train_df, path=data_folderfolder='train'

利用 ImageList from_df 方法創(chuàng)建加載生成器,以便將 train_df 數(shù)據(jù)幀和 train 文件夾中的圖像進(jìn)行映射。

數(shù)據(jù)增強(qiáng)

這是一種根據(jù)現(xiàn)有數(shù)據(jù)創(chuàng)建更多數(shù)據(jù)的技術(shù)。一張貓的圖片水平翻轉(zhuǎn)之后仍然是貓的圖片。但通過(guò)這樣做,你可以把你的數(shù)據(jù)擴(kuò)增至兩倍、四倍甚至 16 倍。

如果你數(shù)據(jù)量比較少,可以嘗試這種方法。

  1. transformations = get_transforms(do_flip=Trueflip_vert=Truemax_rotate=10.0, max_zoom=1.1, max_lighting=0.2, max_warp=0.2, p_affine=0.75, p_lighting=0.75) 

FastAI 提供了 get_transform 函數(shù)來(lái)做這些事情。你可以水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、旋轉(zhuǎn)、放大、提高光度/亮度或者加仿射變換來(lái)增強(qiáng)數(shù)據(jù)。

你可以用我上邊提供的參數(shù)試一下圖片會(huì)變成什么樣?;蛘吣憧梢栽敿?xì)閱讀官方文檔。

然后,對(duì)你的圖像序列做上述預(yù)處理。

  1. train_imgtrain_img = train_img.transform(transformations, size=128

參數(shù)大小將用于放大或縮小輸入,以匹配你將使用的神經(jīng)網(wǎng)絡(luò)。我所用的網(wǎng)絡(luò)是 DenseNet——ImageNet 2017 最佳論文獎(jiǎng)的成果,它要輸入的圖像大小為 128*128。

準(zhǔn)備訓(xùn)練

讀取數(shù)據(jù)之后,就到了深度學(xué)習(xí)最關(guān)鍵的一步——訓(xùn)練。這個(gè)過(guò)程也是深度學(xué)習(xí)中學(xué)習(xí)的由來(lái)。網(wǎng)絡(luò)從你的數(shù)據(jù)中學(xué)習(xí)并且依據(jù)學(xué)習(xí)到的結(jié)果調(diào)整自身參數(shù),直到在數(shù)據(jù)上得到比較好的效果。

  1. test_df = pd.read_csv("sample_submission.csv")  
  2. test_img = ImageList.from_df(test_df, path=data_folderfolder='test'
  3. train_imgtrain_img = train_img  
  4.           .split_by_rand_pct(0.01)  
  5.           .label_from_df()  
  6.           .add_test(test_img)  
  7.           .databunch(path='.'bs=64device=torch.device('cuda:0'))              
  8.           .normalize(imagenet_stats) 

在訓(xùn)練這一步,你需要把訓(xùn)練數(shù)據(jù)分出一小部分做驗(yàn)證集。你不可以用這部分?jǐn)?shù)據(jù)來(lái)訓(xùn)練,因?yàn)樗鼈冎皇怯脕?lái)做驗(yàn)證的。當(dāng)你的卷積神經(jīng)網(wǎng)絡(luò)在驗(yàn)證集上效果較好時(shí),很有可能在測(cè)試集上也可以提交一個(gè)比較好的結(jié)果。

FastAI 提供了 split_by_rand_pct 函數(shù),可以很方便地進(jìn)行以上操作。

databunch 函數(shù)可以進(jìn)行批處理。由于 GPU 內(nèi)存限制,我的批大小為 64。如果你沒(méi)有 GPU,忽略 device 參數(shù)這一項(xiàng)。

之后,由于你使用的是預(yù)訓(xùn)練網(wǎng)絡(luò),用 normalize 函數(shù)來(lái)進(jìn)行圖像歸一化。imagenet_stats 函數(shù)會(huì)根據(jù) ImageNet 預(yù)訓(xùn)練模型的訓(xùn)練方式歸一化輸入圖像。

把測(cè)試數(shù)據(jù)也加入訓(xùn)練數(shù)據(jù)列表里,可以使稍后預(yù)測(cè)更容易,免得再進(jìn)行一次預(yù)處理。記住,這些圖像不能用于訓(xùn)練,也不可以用來(lái)做驗(yàn)證。這樣做只是為了確保訓(xùn)練圖片和測(cè)試圖片采用了完全相同的預(yù)處理方式。

  1. learn = cnn_learner(train_img, models.densenet161, metrics=[error_rate, accuracy]) 

現(xiàn)在數(shù)據(jù)準(zhǔn)備工作已經(jīng)做完了?,F(xiàn)在,用 cnn_leaner 創(chuàng)建一個(gè)訓(xùn)練器。如上所述,我是采用 DenseNet 作為預(yù)訓(xùn)練網(wǎng)絡(luò)的,當(dāng)然你也可以選擇 TorchVision 提供的其他網(wǎng)絡(luò)。

單周期技術(shù)

現(xiàn)在你可以開(kāi)始訓(xùn)練了。但是,包括卷積神經(jīng)網(wǎng)絡(luò)在內(nèi),深度學(xué)習(xí)訓(xùn)練的一大難題就是,如何選擇正確的學(xué)習(xí)率。學(xué)習(xí)率決定了進(jìn)行梯度下降時(shí)更新參數(shù)減小誤差的幅度。

[[267339]]

如上圖所示,大一些的學(xué)習(xí)率使訓(xùn)練過(guò)程更快,但更容易錯(cuò)過(guò)誤差邊界,甚至?xí)隹煽胤秶瑹o(wú)法收斂。然而,當(dāng)使用稍微小一點(diǎn)的學(xué)習(xí)率時(shí),訓(xùn)練過(guò)程會(huì)更慢,但不會(huì)發(fā)散。

所以,選擇合適的學(xué)習(xí)率非常重要。我們要找到的是足夠大卻又不會(huì)使訓(xùn)練發(fā)散的恰當(dāng)學(xué)習(xí)率。

但說(shuō)起來(lái)容易做起來(lái)難。

所以,一個(gè)叫 Leslie Smith 的人提出了單周期策略。

簡(jiǎn)單來(lái)說(shuō),就是先暴力查找?guī)讉€(gè)不同的學(xué)習(xí)率,然后選擇一個(gè)最接近最小誤差但還有進(jìn)步空間的。代碼如下:

  1. learn.lr_find()  
  2. learn.recorder.plot() 

你會(huì)得到如下輸出:

誤差最小值在 10^-1 位置,所以我們可以使用略小于這個(gè)值的學(xué)習(xí)率,比如 3*10^-2。

  1. lr = 3e-02  
  2. learn.fit_one_cycle(5, slice(lr)) 

訓(xùn)練幾個(gè) epoch(這里我選擇 5,不太大也不太小),然后看看結(jié)果。

等等,怎么回事?!

驗(yàn)證集準(zhǔn)確率達(dá)到了 100%!訓(xùn)練過(guò)程實(shí)際上是非常高效的,只用了六分鐘時(shí)間。多么幸運(yùn)!實(shí)際上,你可能需要數(shù)次迭代才能找到合適的算法。

我等不及要提交了!哈哈。下面讓我們預(yù)測(cè)并提交測(cè)試集結(jié)果吧。

  1. preds,_ = learn.get_preds(ds_type=DatasetType.Test) test_df.has_cactus = preds.numpy()[:, 0] 

由于之前已經(jīng)把測(cè)試圖片放入訓(xùn)練圖片列表中了,因此不需要再對(duì)測(cè)試圖片做預(yù)處理。

  1. test_df.to_csv('submission.csv', index=False

上面這行代碼會(huì)創(chuàng)建一個(gè) CSV 文件,其中包含 4000 張測(cè)試圖像的名稱以及每張圖像是否包含仙人掌的 label。

當(dāng)我嘗試提交時(shí),我發(fā)現(xiàn)需要通過(guò) Kaggle 核來(lái)提交 CSV,這是我之前沒(méi)有注意到的。

圖源:Kaggle

幸運(yùn)的是,核的操作和 Jupyter notebook 非常相似。你完全可以把 notebook 里創(chuàng)建的東西復(fù)制粘貼過(guò)來(lái),然后提交。

然后,Duang~完成了!

天吶!得分竟然為 0.9999,這已經(jīng)非常好了。當(dāng)然如果第一次嘗試就得到這么好的分?jǐn)?shù),應(yīng)該還有進(jìn)步的空間。

所以,我調(diào)整了網(wǎng)絡(luò)結(jié)構(gòu),又嘗試了一次。

得分為 1!我做到了!!所以你也可以,實(shí)際上并不是那么困難。

(另外,這個(gè)排名是 4 月 13 號(hào)的,我的排名現(xiàn)在很有可能已經(jīng)下降了…)

我學(xué)到了什么

這個(gè)項(xiàng)目很簡(jiǎn)單,你在解決任務(wù)的過(guò)程中也不會(huì)遇到什么奇怪的挑戰(zhàn),所以這個(gè)項(xiàng)目非常適合入門(mén)。

并且由于已經(jīng)有很多人得滿分了,我覺(jué)得主辦方應(yīng)該另外創(chuàng)建一個(gè)用于提交的測(cè)試集,難度最好更高一點(diǎn)。

不管怎么樣,從這個(gè)項(xiàng)目開(kāi)始基本沒(méi)有什么困難。你可以馬上嘗試并且獲得高分。

[[267340]]

圖源:Mario Mrad on Unsplash

卷積神經(jīng)網(wǎng)絡(luò)對(duì)各種不同的任務(wù)都很有效,不論是圖像識(shí)別還是圖像生成。現(xiàn)在分析圖像并不像以前那么難。當(dāng)然,如果你嘗試的話也可以做到。

所以,選擇一個(gè)好的卷積神經(jīng)網(wǎng)絡(luò)項(xiàng)目,準(zhǔn)備好高質(zhì)量的數(shù)據(jù),開(kāi)始吧!

原文鏈接:

https://medium.freecodecamp.org/everything-you-need-to-know-to-master-convolutional-neural-networks-ef98ca3c7655

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】 

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-05-04 18:30:34

大數(shù)據(jù)卷積神經(jīng)網(wǎng)絡(luò)

2022-04-07 09:01:52

神經(jīng)網(wǎng)絡(luò)人工智能

2022-10-11 23:35:28

神經(jīng)網(wǎng)絡(luò)VGGNetAlexNet

2019-01-05 08:40:17

VGG神經(jīng)網(wǎng)絡(luò)

2018-04-08 11:20:43

深度學(xué)習(xí)

2017-09-08 13:30:32

深度學(xué)習(xí)圖像識(shí)別卷積神經(jīng)網(wǎng)絡(luò)

2020-03-25 09:48:10

AI芯片神經(jīng)網(wǎng)絡(luò)

2017-11-24 11:10:39

神經(jīng)網(wǎng)絡(luò)卷積神經(jīng)網(wǎng)絡(luò)全連接神經(jīng)網(wǎng)絡(luò)

2021-06-29 09:53:06

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)圖形

2022-06-16 10:29:33

神經(jīng)網(wǎng)絡(luò)圖像分類算法

2024-10-05 23:00:35

2024-09-20 07:36:12

2024-10-28 00:38:10

2024-11-15 13:20:02

2017-04-26 09:30:53

卷積神經(jīng)網(wǎng)絡(luò)實(shí)戰(zhàn)

2025-02-21 08:29:07

2024-09-24 07:28:10

2017-07-07 16:15:21

圖像識(shí)別卷積神經(jīng)網(wǎng)絡(luò)人工智能

2017-05-05 08:57:06

卷積神經(jīng)網(wǎng)絡(luò)機(jī)制

2017-05-03 08:52:13

卷積神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)非線性激活函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)