日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

如何入手卷积神经网络

發(fā)布時(shí)間:2024/9/15 卷积神经网络 85 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何入手卷积神经网络 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

選自medium

作者:Tirmidzi Faizal Aflahi

參與:韓放、王淑婷

卷積神經(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ò)~


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


圖源: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í)別種類(lèi)達(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è)分支,處理圖像的效果格外好。


圖源:ImageNet


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


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


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


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



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


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


來(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è)栗子,比如你在火車(chē)調(diào)度公司工作,你們想在不增加勞動(dòng)力的情況下,預(yù)測(cè)火車(chē)是否晚點(diǎn)。


你完全可以利用 ImageNet 上的卷積神經(jīng)網(wǎng)絡(luò)模型,比如說(shuō) 2015 年的冠軍 ResNet。用火車(chē)圖片重新訓(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í)間。


圖像分類(lèi)到圖像生成


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


因吹斯汀!


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


朱俊彥等人提出的 CycleGAN


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


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


超分辨率生成對(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)始。


圖源: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ì)得滿(mǎn)分 1 或者 100%。


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


仙人掌


這張圖像與上面的類(lèi)似。它大小為 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ù):



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


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


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


    pip?install?torchvision?
    pip?install?fastai


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



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


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


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


    import?numpy?as?np
    import?pandas?as?pd?
    from?pathlib?import?Path?
    from?fastai?import?*?
    from?fastai.vision?import?*?
    import?torch?
    %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)。


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


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


    data_folder?=?Path(".")?
    train_images?=?ImageList.from_df(train_df,?path=data_folder,?folder='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ù)量比較少,可以嘗試這種方法。


    transformations?=?get_transforms(do_flip=True,?flip_vert=True,?max_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ù)處理。


    train_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ù)上得到比較好的效果。


    test_df?=?pd.read_csv("sample_submission.csv")?
    test_img?=?ImageList.from_df(test_df,?path=data_folder,?folder='test')
    train_img?=?train_img?
    ??????????.split_by_rand_pct(0.01)?
    ??????????.label_from_df()?
    ??????????.add_test(test_img)?
    ??????????.databunch(path='.',?bs=64,?device=torch.device('cuda:0'))?????????????
    ??????????.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ù)處理方式。


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


    現(xiàn)在數(shù)據(jù)準(zhǔn)備工作已經(jīng)做完了。現(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ù)減小誤差的幅度。


    如上圖所示,大一些的學(xué)習(xí)率使訓(xùn)練過(guò)程更快,但更容易錯(cuò)過(guò)誤差邊界,甚至?xí)隹煽胤秶?#xff0c;無(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)步空間的。代碼如下:


    learn.lr_find()?
    learn.recorder.plot()


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



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


    lr?=?3e-02?
    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é)果吧。


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


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


    test_df.to_csv('submission.csv',?index=False)


    上面這行代碼會(huì)創(chuàng)建一個(gè) CSV 文件,其中包含 4000 張測(cè)試圖像的名稱(chēng)以及每張圖像是否包含仙人掌的 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)有很多人得滿(mǎn)分了,我覺(jué)得主辦方應(yīng)該另外創(chuàng)建一個(gè)用于提交的測(cè)試集,難度最好更高一點(diǎn)。


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


    圖源:Mario Mrad on Unsplash


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


    所以,選擇一個(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

    總結(jié)

    以上是生活随笔為你收集整理的如何入手卷积神经网络的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。