女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

圖像分類問題為例,帶你領略fastai這一高層抽象框架驚人的簡潔性

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-11-05 15:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大半個月前,fast.ai在博客上宣布fastai 1.0版發(fā)布,之后很快在GitHub上發(fā)布了1.0.5測試版,半個月前發(fā)布1.0.6正式版。由于剛發(fā)布不久,網(wǎng)上關(guān)于fastai 1.0的教程極少,因此,我們編寫了這篇入門教程,以一個簡單的圖像分類問題(異形與鐵血戰(zhàn)士)為例,帶你領略fastai這一高層抽象框架驚人的簡潔性。

注意,fastai最近的更新節(jié)奏很瘋狂:

好在按照語義化版本的規(guī)矩,動的都是修訂號,所以這篇教程在這些版本上應該都適用。不過,以防萬一,給出我們使用的版本號供參考:

fastai 1.0.15

pytorch-nightly-cpu 1.0.0.dev20181014

安裝

建議通過conda安裝。如果用的是最近的Nvidia顯卡,可以安裝GPU版本:

conda install -c pytorch pytorch-nightly cuda92

conda install -c fastai torchvision-nightly

conda install -c fastai fastai

顯卡不給力的話,可以安裝CPU版本:

conda install -c pytorch pytorch-nightly-cpu

conda install -c fastai torchvision-nightly-cpu

conda install -c fastai fastai

不用擔心,在遷移學習的加持下,本教程中的模型,即使是性能較低的機器,不到一小時也可訓練完畢。當然,如果使用GPU版,就更快了,幾分鐘搞定。

當然也可以通過pip安裝,甚至直接從源代碼編譯,詳見官方倉庫的README。

注意,不管是GPU版本,還是CPU版本,都需要python 3.6以上,如果是GPU版本,還需要正確配置顯卡驅(qū)動。

安裝好之后,我們可以通過以下語句引入fastai:

import fastai

from fastai import *

from fastai.vision import *

嚴格來說最后兩行并不必要,不過,加載模塊中的所有定義,可以使代碼看起來更簡潔,所以我們這里就加上了。

圖像分類示例

MNIST

深度學習入門的經(jīng)典例子是MNIST手寫數(shù)字分類,實際上fastai的官方文檔開篇就是MNIST的例子:

path = untar_data(URLs.MNIST_SAMPLE)

data = ImageDataBunch.from_folder(path)

learn = create_cnn(data, models.resnet18, metrics=accuracy)

learn.fit(1)

只有四行!事實上,其中還有兩行是加載數(shù)據(jù),然后最后一行是訓練,真正搭建模型只用一行!如果你接觸過其他深度學習框架,也許立刻就會意識到fastai恐怖的簡潔性。反正我第一次看到的反應就是:“我靠!這也行!?”

不過MNIST分類實在是太過經(jīng)典,幾乎每篇入門教程都用,說不定有些人已經(jīng)看吐了。而且,黑白手寫數(shù)字分類,在當前背景下,太過古老,體現(xiàn)不了近年來深度學習在計算機視覺領域的突飛猛進。所以,我們還是換一個酷炫一點的例子吧。

異形大戰(zhàn)鐵血戰(zhàn)士

換個什么例子呢?最近上映了一部新的《鐵血戰(zhàn)士》,我們不如做個鐵血戰(zhàn)士和異形的分類器吧(以前還有部《異形大戰(zhàn)鐵血戰(zhàn)士》,不妨假想一下,鐵血戰(zhàn)士的HUD依靠神經(jīng)網(wǎng)絡區(qū)分敵我)。

圖片來源: frolic.media

數(shù)據(jù)集

要做這樣一個分類器,首先需要數(shù)據(jù)集。這很簡單,網(wǎng)絡上鐵血戰(zhàn)士和異形的圖片太多了。不過,在自己動手搜集圖片之前,我們先檢查下有沒有人做過類似的工作。

這里安利下Google的數(shù)據(jù)集搜索,找數(shù)據(jù)集很方便:https://toolbox.google.com/datasetsearch/

用“alien predator”一搜,還真有,第一個結(jié)果就是Kaggle上的Alien vs. Predator images:

這些圖像是通過Google圖像搜索搜集的JPEG縮略圖(約250×250像素),訓練集、驗證集的每個分類各有347、100張圖像樣本。

從Kaggle下載數(shù)據(jù)后,我們將validation文件夾改名為valid,得到以下的目錄結(jié)構(gòu):

|-- train

|-- alien

|-- predator

|-- valid

|-- alien

|-- predator

這一目錄結(jié)構(gòu)符合fastai組織數(shù)據(jù)的慣例。

數(shù)據(jù)預處理

之前MNIST的例子中,我們是這樣加載數(shù)據(jù)的:

path = untar_data(URLs.MNIST_SAMPLE)

data = ImageDataBunch.from_folder(path)

我們直接使用URLs.MNIST_SAMPLE,fastai會自動下載數(shù)據(jù)集并解壓,這是因為MNIST是fastai的自帶數(shù)據(jù)集。fastai自帶了MNIST、CIFAR10、Wikitext-103等常見數(shù)據(jù)集,詳見fastai官網(wǎng):https://course.fast.ai/datasets

而我們要使用的是非自帶數(shù)據(jù)集,所以只需像之前提到的那樣,在相關(guān)路徑準備好數(shù)據(jù),然后直接調(diào)用ImageDataBunch.from_folder加載即可。

不過,上面的MNIST例子中,出于簡單性考慮,沒有進行預處理。這是因為MNIST圖像本身比較齊整,而且MNIST非常簡單,所以不做預處理也行。我們的異形和鐵血戰(zhàn)士圖片則需要做一些預處理。

首先,大多數(shù)卷積神經(jīng)網(wǎng)絡的輸入層形狀都是28、32、64、96、224、384、512之類的數(shù)字。而數(shù)據(jù)集中的圖片邊長約為250像素,這就需要縮放或者裁切一下。

其次,絕大多數(shù)圖像分類任務,都需要做下數(shù)據(jù)增強。一方面增加些樣本,以充分利用數(shù)量有限的樣本;另一方面,也是更重要的一方面,通過平移、旋轉(zhuǎn)、縮放、翻轉(zhuǎn)等手段,迫使模型學習圖像更具概括性的特征,緩解過擬合問題。

如果你平時積累了一些不依賴框架的圖像增強函數(shù)(比如,基于numpy和scipy定義),那圖像增強不算太麻煩。不過,你也許好奇,fastai有沒有內(nèi)置圖像增強的功能?

有的。實際上,上面說了一大堆,體現(xiàn)到代碼就是一句話:

data = ImageDataBunch.from_folder('data', ds_tfms=get_transforms(), size=224)

前面MNIST的例子中,我們看到,fastai只需一個語句就可以完成加載數(shù)據(jù)集的任務,這已經(jīng)足夠簡潔了。現(xiàn)在我們加上預處理,還是一個語句,只不過多了兩個參數(shù)!

現(xiàn)在我們回過頭來,再看看from_folder這個方法,它根據(jù)路徑參數(shù)獲取數(shù)據(jù)集目錄,然后根據(jù)目錄結(jié)構(gòu)區(qū)分訓練集、驗證集、分類集,根據(jù)目錄名稱獲取樣本的分類標簽。這種API的設計極為簡潔,避免了很多冗余的“模板代碼”。類似地,fastai的ImageDataBunch類還有from_csv、from_df等方法,從CSV文件或DataFrame加載數(shù)據(jù)。

size參數(shù)指定了形狀,ds_tfms指定了預處理邏輯,兩個參數(shù)完成預處理工作。get_transforms()則是fastai的內(nèi)置方法,提供了適用于大多數(shù)計算機視覺任務的默認數(shù)據(jù)增強方案:

以0.5的概率隨機水平翻轉(zhuǎn)

以0.75的概率在-10與10度之間旋轉(zhuǎn)

以0.75的概率在1與1.1倍之間隨機放大

以0.75的概率隨機改變亮度和對比度

以0.75的概率進行隨機對稱扭曲

get_transforms()充分體現(xiàn)了fastai的高層抽象程度。fastai的使用者考慮的是我需要應用常見的數(shù)據(jù)增強方案,而不是具體要對圖像進行哪些處理。

在設計模型之前,我們先簡單地檢查下數(shù)據(jù)加載是否成功:

data.show_batch(rows=3, figsize=(6,6))

看起來沒問題。

順便提下,如果使用GPU版本,建議再傳入一個bs參數(shù),指定下batch大小,比如bs=32,以便充分利用GPU的并行特性,加速之后的訓練。

化神經(jīng)網(wǎng)絡為平常

之前提到,MNIST例子中的核心語句(指定網(wǎng)絡架構(gòu))其實只有一行:

learn = create_cnn(data, models.resnet18, metrics=accuracy)

其實我們這個異形、鐵血戰(zhàn)士的模型架構(gòu)也只需一行:

learn = create_cnn(data, models.resnet50, metrics=accuracy)

幾乎和MNIST一模一樣,只是把模型換成了表達力更強、更復雜的ResNet-50網(wǎng)絡,畢竟,異形和鐵血戰(zhàn)士圖像要比黑白手寫數(shù)字復雜不少。

正好,提供異形、鐵血戰(zhàn)士數(shù)據(jù)集的Kaggle頁面還提供了分類器的Keras實現(xiàn)和PyTorch實現(xiàn)。我們不妨把網(wǎng)絡架構(gòu)部分的代碼抽出來對比一下。

首先,是以API簡潔著稱的Keras:

conv_base = ResNet50(

include_top=False,

weights='imagenet')

for layer in conv_base.layers:

layer.trainable = False

x = conv_base.output

x = layers.GlobalAveragePooling2D()(x)

x = layers.Dense(128, activation='relu')(x)

predictions = layers.Dense(2, activation='softmax')(x)

model = Model(conv_base.input, predictions)

optimizer = keras.optimizers.Adam()

model.compile(loss='sparse_categorical_crossentropy',

optimizer=optimizer,

metrics=['accuracy'])

然后,是以易用性著稱的PyTorch:

device = torch.device("cuda:0"if torch.cuda.is_available() else"cpu")

model = models.resnet50(pretrained=True).to(device)

for param in model.parameters():

param.requires_grad = False

model.fc = nn.Sequential(

nn.Linear(2048, 128),

nn.ReLU(inplace=True),

nn.Linear(128, 2)).to(device)

criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.fc.parameters())

對比一下,很明顯,論簡潔程度,PyTorch并不比一直打廣告說自己簡潔的Keras差。然后,雖然寫法有點不一樣,但這兩個框架的基本思路都是差不多的。首先指定模型的凍結(jié)部分,然后指定后續(xù)層,最后指定損失函數(shù)、優(yōu)化算法、指標。

然后我們再看一遍fastai:

learn = create_cnn(data, models.resnet50, metrics=accuracy)

你大概能體會文章開頭提到的驚呼“這樣也行!?”的心情了吧。看起來我們只是指定了模型種類和指標,很多東西都沒有呀。

實際上,如果你運行過開頭提到的MNIST的代碼,就會發(fā)現(xiàn)一個epoch就達到了98%以上的精確度。很明顯,用了遷移學習,否則不會學得這么快。和Keras、PyTorch需要明確指出繼承權(quán)重、預訓練不同,fastai里遷移學習是默認配置。同理,后續(xù)層的層數(shù)、形狀、激活函數(shù),損失函數(shù),優(yōu)化算法,都不需要明確指定,fastai可以根據(jù)數(shù)據(jù)的形狀、模型種類、指標,自動搞定這些。

fastai的口號是“makeing neural nets uncool again”(化神經(jīng)網(wǎng)絡為平常),真是名不虛傳。

訓練和解讀

定下模型后,只需調(diào)用fit就可以開始訓練了,就像MNIST例子中寫的那樣。

不過,這次我們打算轉(zhuǎn)用fit_one_cycle方法。fit_one_cycle使用的是一種周期性學習率,從較小的學習率開始學習,緩慢提高至較高的學習率,然后再慢慢下降,周而復始,每個周期的長度略微縮短,在訓練的最后部分,允許學習率比之前的最小值降得更低。這不僅可以加速訓練,還有助于防止模型落入損失平面的陡峭區(qū)域,使模型更傾向于尋找更平坦的極小值,從而緩解過擬合現(xiàn)象。

圖片來源:sgugger.github.io

這種學習率規(guī)劃方案是Lesile Smith等最近一年剛提出的。fit_one_cycle體現(xiàn)了fastai的一個知名的特性:讓最新的研究成果易于使用。

先跑個epoch看看效果:

learn.fit_one_cycle(1)

結(jié)果:

epoch train_loss valid_loss accuracy

1 0.400788 0.520693 0.835106

嗯,看起來相當不錯。一般而言,先跑一個epoch是個好習慣,可以快速檢查是否在編碼時犯了一些低級錯誤(比如形狀弄反之類的)。但是fastai這么簡潔,這么自動化,犯低級錯誤的幾率相應也低了不少,也讓先跑一個epoch體現(xiàn)價值的機會少了很多。;-)

再多跑幾個epoch看看:

learn.fit_one_cycle(3)

結(jié)果:

epoch train_loss valid_loss accuracy

1 0.221689 0.364424 0.888298

2 0.164495 0.209541 0.909574

3 0.132979 0.181689 0.930851

有興趣的讀者可以試著多跑幾個epoch,表現(xiàn)應該還能提升一點。不過,我對這個精確度已經(jīng)很滿意了。我們可以對比下Kaggle上的PyTorch實現(xiàn)跑3個epoch的表現(xiàn):

Epoch1/3

----------

train loss: 0.5227, acc: 0.7205

validation loss: 0.3510, acc: 0.8400

Epoch2/3

----------

train loss: 0.3042, acc: 0.8818

validation loss: 0.2759, acc: 0.8800

Epoch3/3

----------

train loss: 0.2181, acc: 0.9135

validation loss: 0.2405, acc: 0.8950

fastai的表現(xiàn)與之相當,但是,相比PyTorch實現(xiàn)需要進行的編碼(已經(jīng)很簡潔了),我們的fastai實現(xiàn)可以說是毫不費力。

當然,也不能光看精確度——有的時候這會形成偏差。讓我們看下混淆矩陣吧。

interp = ClassificationInterpretation.from_learner(learn)

interp.plot_confusion_matrix()

看起來很不錯嘛!

再查看下最讓模型頭疼的樣本:

interp.plot_top_losses(9, figsize=(10,10))

我們看到,這個模型還是有一定的可解釋性的。我們可以猜想,人臉、亮度過暗、畫風獨特、頭部在畫幅外或較小,都可能干擾分類器的判斷。如果我們想進一步提升模型的表現(xiàn)和概括能力,可以根據(jù)我們的猜想再收集一些樣本,然后做一些針對性的試驗加以驗證。查明問題后,再采取相應措施加以改進。

靈活性

本文的目的是展示fastai API的簡潔性和高層抽象性。不過,我們最后需要指出的一點是,fastai并沒有因此放棄靈活性和可定制性。

比如,之前為了符合fastai數(shù)據(jù)集目錄結(jié)構(gòu)的慣例,我們在下載數(shù)據(jù)集后將validation重命名為valid。實際上,不進行重命名也完全可以,只需在調(diào)用ImageDataBunch的from_folder方法時,額外將validation傳入對應的參數(shù)即可。

再比如,如果我們的數(shù)據(jù)集目錄中,子目錄名作為標簽,但沒有按訓練集、驗證集、測試集分開,需要隨機按比例劃分。另外,我們還想手動指定數(shù)據(jù)增強操作列表。那么可以這樣加載數(shù)據(jù)集:

# 手動指定數(shù)據(jù)增強操作

tfms = [rotate(degrees=(-20,20)), symmetric_warp(magnitude=(-0.3,0.3))]

data = (ImageFileList.from_folder(path)

.label_from_folder() # 根據(jù)子目錄決定標簽

.random_split_by_pct(0.1) # 隨機分割10%為驗證集

.datasets(ImageClassificationDataset) # 轉(zhuǎn)換為圖像分類數(shù)據(jù)集

.transform(tfms, size=224) # 數(shù)據(jù)增強

.databunch()) # 最終轉(zhuǎn)換

我們上面明確羅列了數(shù)據(jù)增強操作。如果我們只是需要對默認方案進行微調(diào)的話,那么get_transforms方法其實有一大堆參數(shù)可供調(diào)整,比如get_transforms(flip_vert=True, max_rotate=20)意味著我們同時進行上下翻轉(zhuǎn)(默認只進行水平翻轉(zhuǎn)),并且增加了旋轉(zhuǎn)的角度范圍(默認為-10到10)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像分類
    +關(guān)注

    關(guān)注

    0

    文章

    96

    瀏覽量

    12166
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1224

    瀏覽量

    25444

原文標題:fastai 1.0入門教程:如何訓練簡單圖像分類器

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    基于多通道分類合成的SAR圖像分類研究

    ,證明了該算法的可行和有效。【關(guān)鍵詞】:多通道;;SAR;;圖像分類;;SVM;;粒度合成【DOI】:CNKI:SUN:JYXH.0.2010-03-003【正文快照】:0引言合成
    發(fā)表于 04-23 11:52

    使用MXNetFashionMNIST數(shù)據(jù)集分類簡潔實現(xiàn)

    [MXNet逐夢之旅]練習四·使用MXNetFashionMNIST數(shù)據(jù)集分類簡潔實現(xiàn)
    發(fā)表于 05-11 15:21

    種基于圖像平移的目標檢測框架

    的研究方向。目前,在照明條件良好的白天場景等標準場景中,目標檢測顯示出了顯著的效率和可靠。然而,在夜間等不利條件下,目標檢測的準確明顯下降。造成這一問題的主要原因之是缺乏足夠的夜
    發(fā)表于 08-31 07:43

    課程預告丨12月15日官方直播帶你領略ArkUI的聲明式開發(fā)范式之美

    HarmonyOS系列課程的第五期“Hello Codelabs:分布式新聞客戶端實戰(zhàn)(eTS)”線上直播來啦!華為軟件開發(fā)工程師Jacky將帶你領略ArkUI的聲明式開發(fā)范式之美,講解如何使用eTS語言
    發(fā)表于 12-10 17:52

    旋轉(zhuǎn)圖像的合成與識別仿真

    通過對兩種算法模擬數(shù)據(jù)的比較,得出了聯(lián)合相關(guān)算法對待識別圖像方面的優(yōu)越,以及計算機模擬識別相對于光學器件的簡潔性和顯著
    發(fā)表于 10-19 14:36 ?49次下載
    旋轉(zhuǎn)<b class='flag-5'>圖像</b>的合成與識別仿真

    PowerVR框架:PVRApi Vulkan和OpenGL ES抽象

    色器 ? PowerVR框架:了解圖像渲染紋理效果的障礙 讓我們先從第部分開始。 第部分的重點是已清除的屏幕,如下所示: 雖然不是最高級的示例,但
    發(fā)表于 02-09 18:52 ?897次閱讀
     PowerVR<b class='flag-5'>框架</b>:PVRApi Vulkan和OpenGL ES<b class='flag-5'>抽象</b>層

    基于雙稀疏正則的圖像集距離學習框架DSRID

    隨著視頻采集和網(wǎng)絡傳輸技術(shù)的快速發(fā)展以及個人移動終端設備的廣泛使用,大量圖像數(shù)據(jù)以集合形式存在,集合內(nèi)在結(jié)構(gòu)的復雜使得如何度量集合間距離成為圖像分類
    發(fā)表于 12-26 19:06 ?3次下載

    基于顯著檢測的圖像分類算法

    針對傳統(tǒng)的圖像分類方法對整個圖像不分等級處理以及缺乏高層認知的問題,提出了種基于顯著檢測的
    發(fā)表于 01-04 13:47 ?0次下載

    電機控制硬件抽象層(HAL)

    硬件抽象層( Hardware Abstraction Layer,HAL)為更高層(例如:應用程序框架和客戶應用程序等等)提供基于API函數(shù)的服務,允許更高層獨立于實際的硬件細節(jié)執(zhí)行
    發(fā)表于 03-21 16:38 ?3次下載

    簡單好上手的圖像分類教程!

    簡單好上手的圖像分類教程!構(gòu)建圖像分類模型的個突破是發(fā)現(xiàn)卷積神經(jīng)網(wǎng)絡(CNN)可以用來逐步地提取圖像
    的頭像 發(fā)表于 05-31 16:36 ?8511次閱讀
    簡單好上手的<b class='flag-5'>圖像</b><b class='flag-5'>分類</b>教程!

    人工智能引發(fā)的圖像分類算法

    作者:Quenton Hall,賽靈思公司工業(yè)、視覺、醫(yī)療及科學市場的 AI 系統(tǒng)架構(gòu)師 在上篇文章中,我們簡要介紹了更高層次的問題,這些問題為優(yōu)化加速器的需求奠定了基礎。作為個尖
    的頭像 發(fā)表于 11-16 16:40 ?4193次閱讀
    人工智能引發(fā)的<b class='flag-5'>圖像</b><b class='flag-5'>分類</b>算法

    線路簡潔性能極優(yōu)越的準甲類電路

    線路簡潔性能極優(yōu)越的準甲類電路說明。
    發(fā)表于 04-12 09:38 ?6次下載

    fastai深度學習實踐庫

    fastai.zip
    發(fā)表于 04-19 14:26 ?0次下載
    <b class='flag-5'>fastai</b>深度學習實踐庫

    OpenHarmony工作委員會PMC委員萬承臻帶你領略OpenHarmony3.1從內(nèi)核到框架

    OpenHarmony工作委員會PMC委員萬承臻帶你領略OpenHarmony3.1從內(nèi)核到框架 OpenHarmony各版本不斷迭代不斷完善;今天以“共建新技術(shù)、開拓新領域”作為
    的頭像 發(fā)表于 04-25 17:12 ?2655次閱讀
    OpenHarmony工作委員會PMC委員萬承臻<b class='flag-5'>帶你</b><b class='flag-5'>領略</b>OpenHarmony3.1從內(nèi)核到<b class='flag-5'>框架</b>

    電機控制硬件抽象層(HAL)用戶指南

    硬件抽象層(Hardware Abstraction Layer,HAL)為更高層(例如:應用程序框架和客戶應用程序等等)提供基于API函數(shù)的服務,允許更高層獨立于實際的硬件細節(jié)執(zhí)行面
    發(fā)表于 09-22 08:31 ?1次下載
    電機控制硬件<b class='flag-5'>抽象</b>層(HAL)用戶指南