欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:人工智能 深度學習之計算機視覺

柚子快報邀請碼778899分享:人工智能 深度學習之計算機視覺

http://yzkb.51969.com/

神經(jīng)網(wǎng)絡簡介

全連接層和卷積層的根本區(qū)別在于權重在中間層中彼此連接的方式。圖5.1描述了全連接層或線性層是如何工作的。

?????????在計算機視覺中使用線性層或全連接層的最大挑戰(zhàn)之一是它們丟失了所有空間信息,并且就全連接層使用的權重數(shù)量而言復雜度太高。例如,當將224像素的圖像表示為平面陣列時,我們最終得到的數(shù)組長度是150,528(224x224x3通道)。當圖像扁平化后,我們失去了所有的空間信息。讓我們來看看CNN的化版本是什么樣子的,如圖5.2 所示。

所有卷積層所做的是在圖像上施加一個稱為濾波器的權重窗口。在詳細理解卷積和其他構建模塊之前,先為 MNIST 數(shù)據(jù)集構建一個簡單但功能強大的圖像分類器。一旦構建了這個分類器,我們將遍歷網(wǎng)絡的每個組件。構建圖像分類器可分為以下步驟。

獲取數(shù)據(jù)創(chuàng)建驗證數(shù)據(jù)集從零開始構建CNN模型訓練和驗證模型

MNIST——獲取數(shù)據(jù)

MNIST數(shù)據(jù)集包含60,000個用于訓練的0~9的手寫數(shù)字圖片,以及用于測試集的10,000張圖片。PyTorch的torchvision庫提供了一個MNIST數(shù)據(jù)集,它下載并以易于使用的格式提供數(shù)據(jù)。讓我們用MNIST函數(shù)把數(shù)據(jù)集下載到本機,并封裝成DataLoader。我們將使用torchvision變換將數(shù)據(jù)轉換成PyTorch張量并進行歸一化。下面的代碼負責下載數(shù)據(jù)、把數(shù)據(jù)封裝成 DataLoader以及數(shù)據(jù)的歸一化處理(歸一化處理的原因:加快模型的收斂速度、提高模型的精度、增強模型泛化能力):

# transforms.Normalize((0.1307,), (0.3081)),其中均值(mean)為0.1307,標準差(std)為0.3081。

# 這些參數(shù)是在MNIST數(shù)據(jù)集上的統(tǒng)計結果,用于將圖像數(shù)據(jù)歸一化到[0, 1]范圍內(nèi)。

transformation =

transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081))])

train_dataset =

datasets.MNIST ('data/', train=True, transform=transformation, download=True)

test_dataset =

datasets.MNIST('data/', train=False, transform=transformation, download=True)

train_loader =

torch.utils.data.Dataloader(train_dataset, batch_size=32, shuffle=True)

test_loader =

torch.utils.data.Dataloader(test_dataset, batch_size=32, shuffle=True)

從零開始構建CNN模型

Conv2d

????????Conv2d負責在MNIST圖像上應用卷積濾波器。讓我們試著理解如何在一維數(shù)組上應用卷積,然后轉向如何將二維卷積應用于圖像。我們查看圖5.5,將大小為3的濾波器(或內(nèi)核)conv1d應用于長度為7的張量:

????????底部框表示7個值的輸入張量,連接框表示應用3個卷積濾波器后的輸出。在圖像的右上角,3個框表示Conv1d 層的權重和參數(shù)。卷積濾波器像窗口一樣應用,并通過跳過一個值移動到下一個值。要跳過的值稱為步幅,并默認設置為1。下面通過寫下第一個和最后一個輸出的計算來理解如何計算輸出值:

Output1->(-0.5209x0.2286)+(-0.0147x2.4488)+(-0.4281x-0.9498)

Output5->(-0.5209x-0.6791)+(-0.0147x-0.6535)+(-0.4281x0.6437)

????????所以,到目前為止,對卷積的作用應該比較清楚了。卷積基于移動步幅值在輸入上應用濾波器,即一組權重。在前面的例子中,濾波器每次移動一格。如果步幅值是2,濾波器將每次移動2格。下面看看PyTorch的實現(xiàn),來理解它是如何工作的:

conv = nn.Convld(l,l,3,bias=False)

sample = torch.randn(l,l,7)

conv(Variable(sample))

#檢查卷積濾波器的權重

conv.weight

????????還有另一個重要的參數(shù),稱為填充,它通常與卷積一起使用。如果仔細地觀察前面的例子,大家可能會意識到,如果直到數(shù)據(jù)的最后才能應用濾波器,那么當數(shù)據(jù)沒有足夠的元素可以跨越時,它就會停止。填充則是通過在張量的兩端添加0來防止這種情況。下面看一個關于如何填充一維數(shù)組的例子。

????????在圖5.6中,我們應用了填充為2步幅為1的Convld層。

????????讓我們看看Conv2d如何在圖像上工作。

????????在了解Conv2d的工作原理之前,強烈建議大家查看一個非常好的博客(http://setosa.io/ev/image-kernels/),其中包含一個關于卷積如何工作的現(xiàn)場演示?;◣追昼娍赐暄菔局螅堥喿x下文。 ????????我們來理解一下演示中發(fā)生的事情。在圖像的中心框中,有兩組不同的數(shù)字:一個在方框中表示;另一個在方框下方。在框中表示的那些是像素值,如左邊照片上的白色框所突出顯示的那樣。在框下面表示的數(shù)字是用于對圖像進行銳化的濾波器(或內(nèi)核)值。這些數(shù)字是精心挑選的,以完成一項特定的工作。在本例中,它用于銳化圖像。如前面的例子中一樣,我們進行元素級的乘法運算并將所有值相加,生成右側圖像中像素的值。生成的值在圖像右側的白色框中高亮顯示。 ????????雖然在這個例子中內(nèi)核中的值是精心選擇的,但是在CNN中我們不會去精選值而是隨機地初始化它們,并讓梯度下降和反向傳播調(diào)整內(nèi)核的值。學習的內(nèi)核將負責識別不同的特征,如線條、曲線和眼睛。下面來看圖5.7,我們把它看成是一個數(shù)字矩陣,看看卷積是如何工作的。

????????在圖5.7中,假設用6x6矩陣表示圖像,并且應用大小為3x3的卷積濾波器,然后展示如何生成輸出。簡單起見,我們只計算矩陣的高亮部分。通過執(zhí)行以下計算生成輸出:

Output->0.86x0+-0.92x0+-0.61x1+-0.32x-1+-1.69x-1+……

????????Conv2d函數(shù)中使用的另一個重要參數(shù)是kernel_size,它決定了內(nèi)核的大小。常用的內(nèi)核大小有為1、3、5和7。內(nèi)核越大,濾波器可以覆蓋的面積就越大,因此通常會觀察到大小為7或9的濾波器應用于早期層中的輸入數(shù)據(jù)。

池化

????????通用的實踐是在卷積層之后添加池化(pooling)層,因為它們會降低特征平面和卷積層輸出的大小。 ????????池化提供兩種不同的功能:一個是減小要處理的數(shù)據(jù)大?。涣硪粋€是強制算法不關注圖像位置的微小變化。例如,面部檢測算法應該能夠檢測圖片中的面部,而不管照片中面部的位置。 ????????我們來看看 MaxPool2d的工作原理。它也同樣具有內(nèi)核大小和步幅的概念。它與卷積不同,因為它沒有任何權重,只是對前一層中每個濾波器生成的數(shù)據(jù)起作用。如果內(nèi)核大小為2x2,則它會考慮圖像中2x2的區(qū)域并選擇該區(qū)域的最大值。讓我們看看圖5.8,它清楚地說明了 MaxPool2d的工作原理。

????????左側的框包含特征平面的值。在應用最大池化之后,輸出存儲在框的右側。我們寫出輸出第一行中值的計算代碼,看看輸出是如何計算的:

Output1 -> Maximum(3,7,2,8) -> 8 Output2 -> Maximum(-1,-8,9,2) -> 9

????????另一種常用的池化技術是平均池化,需要把average函數(shù)替換成maxinum函數(shù)。圖5.9說明了平均池化的工作原理。

????????在這個例子中,我們?nèi)〉氖?個值的平均值,而不是4個值的最大值。讓我們寫出計算代碼,以便更容易理解:

Output1 -> Average(3,7,2,8) -> 5 Output2 -> Average(-1,-8,9,2) -> 0.5

非線性激活——ReLU

????????在最大池化之后或者在應用卷積之后使用非線性層是通用的最佳實踐。大多數(shù)網(wǎng)絡架構傾向于使用ReLu或不同風格的ReLu。無論選擇什么非線性函數(shù),它都作用于特征平面的每個元素。為了使其更直觀,來看一個示例(見圖5.10),其中把 ReLU 應用到應用過最大池化和平均池化的相同特征平面上:

視圖

????????對于圖像分類問題,通用實踐是在大多數(shù)網(wǎng)絡的末端使用全連接層或線性層。我們使用一個以數(shù)字矩陣作為輸入并輸出另一個數(shù)字矩陣的二維卷積。為了應用線性層,需要將矩陣扁平化,將二維張量轉變?yōu)橐痪S的向量。圖5.11所示為 view 方法的工作原理。

????????讓我們看看在網(wǎng)絡中實現(xiàn)該功能的代碼:

x.view(-1,320)

????????可以看到,view方法將使n維張量扁平化為一維張量。在我們的網(wǎng)絡中,第一個維度是每個圖像。批處理后的輸入數(shù)據(jù)維度是32x1x28x28,其中第一個數(shù)字32表示將有32個高度為28、寬度為28和通道為1的圖像,因為圖像是黑白的。當進行扁平化處理時,我們不想把不同圖像的數(shù)據(jù)扁平化到一起或者混合數(shù)據(jù),因此,傳給view函數(shù)的第一個參數(shù)將指示PyTorch 避免在第一維上扁平化數(shù)據(jù)。來看看圖5.12中的工作原理。

????????在上面的例子中,我們有大小為2x1x2x2的數(shù)據(jù);在應用view函數(shù)之后,它會轉換成大小為2x1x4的張量。讓我們再看一下沒有使用參數(shù)-1的另一個例子(見圖5.13)。

????????如果忘了指明要扁平化哪一個維度的參數(shù),可能會得到意想不到的結果。所以在這一步要格外小心。

????????線性層

????????在將數(shù)據(jù)從二維張量轉換為一維張量之后,把數(shù)據(jù)傳入非線性層,然后傳入非線性的激活層。在我們的架構中,共有兩個線性層,一個后面跟著ReLU,另一個后面跟著log_softmax,用于預測給定圖片中包含的數(shù)字。

訓練模型

????????訓練模型的過程與之前的狗貓圖像分類問題相同。下面的代碼片段在提供的數(shù)據(jù)集上對我們的模型進行訓練:

def fit(epoch,model,data_loader,phase='training',volatile=False):

if phase == 'training':

model.train()

if phase == 'validation':

model.eval()

volatile=True

running_loss = 0.0

running_correct = 0

for batch_idx,(data,target) in enumerate(data loader):

if is cuda:

data,target =data.cuda(),target.cuda()

data, target = Variable(data,volatile),Variable(target)

if phase =='training':

optimizer.zero grad()

output = model(data)loss =F.nll loss(output,target)

running loss +=

F.nll loss(output,target,size average=False).data[0]

preds = output.data.max(dim=l,keepdim=True)[1]

running_correct += preds.eq(target.data.view_as(preds)).cpu().sum()

if phase == 'training':

loss.backward()

optimizer.step()

loss =running_loss/len(data_loader.dataset)

accuracy =100. * running_correct/len(data_loader.dataset)

print(f'{phase} loss is {loss:{5}.{2}} and {phase} accuracy is

{running_correct}/{len(data_loader.dataset)}{accuracy:{10}.{4}}')

return loss,accuracy

????????該方法針對 training 和 validation 具有不同的邏輯。使用不同模式主要有兩個原因:

在 training 模式中,dropout 會刪除一定百分比的值,這在驗證或測試階段不應發(fā)生。對于training 模式,計算梯度并改變模型的參數(shù)值,但是在測試或驗證階段不需要反向傳播。

????????上一個函數(shù)中的大多數(shù)代碼都是不言自明的,就如前幾章所述。在函數(shù)的末尾,我們返回特定輪數(shù)中模型的loss和accuracy。 ????????讓我們通過前面的函數(shù)將模型運行20次迭代,并繪制出training和validation上的loss和 accuracy,以了解網(wǎng)絡表現(xiàn)的好壞。以下代碼將fit方法在training和validation數(shù)據(jù)集上運行20次迭代:

model = Net()

if is cuda:

model.cuda()

optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)

train_losses , train_accuracy = [],[]

val_losses , val_accuracy = [],[]

for epoch in range(1,20):

epoch_loss,epoch_accuracy = fit(epoch,model,train_loader,phase='training')

val_epoch_loss,val_epoch_accuracy = fit(epoch,model,test_loader,phase='validation')

train_losses.append(epoch_loss)

train_accuracy.append(epoch_accuracy)

val_losses.append(val_epoch_loss)

val_accuracy.append(val_epoch_accuracy)

以下代碼繪制出了訓練和測試的損失值:

plt.plot(range(1,len(train losses)+1),train_losses,'bo',label='training loss')

plt.plot(range(1,len(val losses)+1),val_losses,'r',label='validation loss')

plt.legend()

上述代碼生成的圖片如圖5.14所示。

下面的代碼繪制出了訓練和測試的準確率:

plt.plot(range(1,len(train accuracy)+1),train accuracy,'bo',label = 'train accuracy')

plt.plot(range(1,len(val accuracy)+1),val accuracy,'r',label = 'val accuracy')

plt.legend()

????????上述代碼生成的圖片如圖5.15 所示。 ????????在 20輪訓練后,我們達到了98.9%的測試準確率。我們使用簡單的卷積模型,幾乎達到了最先進的結果。讓我們看看在之前使用的Dogs vs.Cats數(shù)據(jù)集上嘗試相同的網(wǎng)絡架構時會發(fā)生什么。我們將使用之前第2章中的數(shù)據(jù)和MNIST示例中的架構并略微修改。一旦訓練好了模型,我們將評估模型,以了解架構表現(xiàn)的優(yōu)異程度。

柚子快報邀請碼778899分享:人工智能 深度學習之計算機視覺

http://yzkb.51969.com/

參考文章

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19246991.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄