引言
深度學(xué)習(xí)發(fā)展歷程
1.感知機(jī)網(wǎng)絡(luò)(解決線性可分問題,20世紀(jì)40年代)
2.BP神經(jīng)網(wǎng)絡(luò)(解決線性不可分問題,20世紀(jì)80年代)
3.深度神經(jīng)網(wǎng)絡(luò)(海量圖片分類,2010年左右)
常用的深度神經(jīng)網(wǎng)絡(luò):CNN、RNN、LSTM、GRU、GAN、DBN、RBM…
深度應(yīng)用領(lǐng)域
1.計算機(jī)視覺
2.語音識別
3.自然語言處理
4.人機(jī)博弈
深度學(xué)習(xí)vs傳統(tǒng)機(jī)器學(xué)習(xí)
傳統(tǒng)機(jī)器學(xué)習(xí)算法流程:
輸入——>人工特征提取——>權(quán)重學(xué)習(xí)——>預(yù)測結(jié)果
深度學(xué)習(xí)算法流程:
輸入—>基礎(chǔ)特征提取—>多層復(fù)雜特征提取—>權(quán)重學(xué)習(xí)—>預(yù)測結(jié)果
深度神經(jīng)網(wǎng)絡(luò)vs淺層神經(jīng)網(wǎng)絡(luò)
深度神經(jīng)網(wǎng)絡(luò)
普通網(wǎng)絡(luò)
深度學(xué)習(xí)概述
- 深度學(xué)習(xí)是一種利用復(fù)雜結(jié)構(gòu)的多個處理層來實現(xiàn)對數(shù)據(jù)進(jìn)行高層次抽象的算法,是機(jī)器學(xué)習(xí)的一個重要分支。
- 傳統(tǒng)的BP算法僅有幾層網(wǎng)絡(luò),需要手工指定特征且易出現(xiàn)局部最優(yōu)問題,而深度學(xué)習(xí)引入了概率生成模型,可自動地從訓(xùn)練集提取特征,解決了手工特征考慮不周的問題,而且初始化了神經(jīng)網(wǎng)絡(luò)權(quán)重,采用反向傳播算法進(jìn)行訓(xùn)練,與BP算法相比取得了很好的效果。
- 卷積神經(jīng)網(wǎng)絡(luò)目前是深度學(xué)習(xí)領(lǐng)域的熱點(diǎn),尤其是圖像識別和模式分類方面,優(yōu)勢在于具有**共享權(quán)值的網(wǎng)絡(luò)結(jié)構(gòu)和局部感知(也稱為稀疏連接)**的特點(diǎn),能夠降低神經(jīng)網(wǎng)絡(luò)的運(yùn)算復(fù)雜度,因為減少了權(quán)值的數(shù)量,并可以直接將圖像作為輸入進(jìn)行特征提取,避免了對圖像的預(yù)處理和顯式的特征處理。
卷積神經(jīng)網(wǎng)絡(luò)CNN
BP神經(jīng)網(wǎng)絡(luò)
缺陷:
- 不能移動
- 不能變形
- 運(yùn)算量大
解決方法:
- 大量物體位于不同位置的數(shù)據(jù)訓(xùn)練
- 增加網(wǎng)絡(luò)的隱藏層個數(shù)。
- 權(quán)值共享(不同位置擁有相同權(quán)值)
CNN概述
生物神經(jīng)元所能處理信息的復(fù)雜程度被稱為神經(jīng)元的感受野,而神經(jīng)元對于信息位置與方向變化不敏感的特性被稱為平移不變性,卷積神經(jīng)網(wǎng)絡(luò)正是根據(jù)生物神經(jīng)網(wǎng)絡(luò)的這些特性而提出的神經(jīng)網(wǎng)絡(luò)模型。
卷積神經(jīng)網(wǎng)絡(luò)大致結(jié)構(gòu)
此類網(wǎng)絡(luò)主要對輸入數(shù)據(jù)進(jìn)行逐層交替的卷積和池化操作:
卷積神經(jīng)網(wǎng)絡(luò)大致過程
covolutional layer(卷積)、ReLu layer(非線性映射)、pooling layer(池化)、fully connected layer(全連接)、output(輸出)的組合。
局部連接
在CNN中,先選擇一個局部區(qū)域(filter),用這個局部區(qū)域去掃描整張圖片。
局部區(qū)域圈起來的所有節(jié)點(diǎn)會被連接到下一層的一個節(jié)點(diǎn)上。
權(quán)值共享
卷積層 - CNN權(quán)值共享
非線性映射ReLU(Rectified Linear Units)
經(jīng)過線性組合和偏移后,會加入非線性增強(qiáng)的擬合能力,將卷積所得的Feature Map經(jīng)過ReLU變換。
ReLU是一個非線性激活函數(shù),在卷積神經(jīng)網(wǎng)絡(luò)中,ReLU的作用主要體現(xiàn)在兩個方面:
- 加速訓(xùn)練過程:使用ReLU激活函數(shù)可以加速模型的訓(xùn)練過程。相比于傳統(tǒng)的sigmoid等激活函數(shù),ReLU的導(dǎo)數(shù)計算更簡單,并且不會出現(xiàn)梯度消失問題,因此可以更快地收斂。
-
提高模型性能:ReLU激活函數(shù)具有非線性變換的特點(diǎn),可以使模型具有更強(qiáng)的表達(dá)能力,從而提高模型的性能。實踐證明,在深層卷積神經(jīng)網(wǎng)絡(luò)中,使用ReLU激活函數(shù)可以顯著提高模型的準(zhǔn)確率和泛化能力。
注:卷積操作本身是一種線性變換,它只會將輸入數(shù)據(jù)進(jìn)行加權(quán)求和,而無法處理復(fù)雜的非線性關(guān)系。通過連接激活函數(shù),卷積層輸出的結(jié)果可以被映射到一個非線性空間中,這個空間中的每一個點(diǎn)都代表著網(wǎng)絡(luò)對某些特征的不同程度的響應(yīng),從而使得網(wǎng)絡(luò)可以更好地識別輸入圖像中的模式和特征。
池化(pooling)
池化層亦稱Pooling層,其操作是池化,即下采樣。
主要作用是通過去除輸入的特征圖中不重要的信息,使特征圖變小,進(jìn)行特征壓縮,進(jìn)一步減少參數(shù)量,且同時提取其中的有效信息。
池化的結(jié)果是特征減少、參數(shù)減少,一定程度上可以避免過擬合。
池化的具體操作是定義池化窗口的大小。
通常情況下,從某個池化窗口內(nèi)進(jìn)行采樣的規(guī)則主要有取最大值、取最小值和取平均值三種,所對應(yīng)的池化操作分別稱之為最大池化、最小池化和均值池化。文章來源:http://www.zghlxwxcb.cn/news/detail-491135.html
全連接層
- 當(dāng)抓取到足以用來識別圖片的特征后,接下來的就是如何進(jìn)行分類。
- 全連接層(也叫前饋層)就可以用來將最后的輸出映射到線性可分的空間。
- 卷積網(wǎng)絡(luò)的最后會在末端得到一個長長的向量,并送入全連接層配合輸出層進(jìn)行分類。
一個完整的CNN
卷積神經(jīng)網(wǎng)絡(luò)主要執(zhí)行了四個操作:文章來源地址http://www.zghlxwxcb.cn/news/detail-491135.html
- 卷積
- 非線性(ReLU)
- 池化或下采樣
- 分類(全連接層)
基于CNN網(wǎng)絡(luò)的手寫字體識別
#cnn卷積神經(jīng)網(wǎng)絡(luò)
#廣泛應(yīng)用在圖片識別上
%matplotlib inline
import torch
import torch.nn as nn
import torchvision
import torch.utils.data as Data
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
EPOCH=1
BATCH_SIZE=50
LR=0.005
DOWNLOAD_MNIST=False
#1.生成數(shù)據(jù)集
train_data=torchvision.datasets.MNIST(
root='./mnist',
train=True,
transform=torchvision.transforms.ToTensor(),#將像素值從(0,255)區(qū)間壓縮到(0,1)
download=DOWNLOAD_MNIST
)#數(shù)字0-9的圖像
#plot one example
'''
print(train_data.data.size())#(60000,28,28)
print(train_data.targets.size())#(60000)
plt.imshow(train_data.data[0].numpy(),cmap='gray')
plt.title('%i' % train_data.targets[0])
'''
#2.讀取數(shù)據(jù),批處理
train_loader=Data.DataLoader(
dataset=train_data,
batch_size=BATCH_SIZE,
shuffle=True,
#num_workers=2
)
test_data=torchvision.datasets.MNIST(root='./mnist/',train=False)#train等于False說明提取出的是測試數(shù)據(jù),而不是訓(xùn)練數(shù)據(jù)
test_x=torch.unsqueeze(test_data.data,dim=1).type(torch.FloatTensor)[:2000]/255.#手動壓縮
test_y=test_data.targets[:2000]
#3.定義cnn神經(jīng)模型
class CNN(nn.Module):
def __init__(self):
super(CNN,self).__init__()
self.conv1=nn.Sequential(#建立卷積層1,所謂卷積層就是一個過濾器
nn.Conv2d(#(1,28,28) 二維卷積
in_channels=1,#有多少層,例如rgb圖片有三個通道也就是三個層,灰度圖片只有一個層
out_channels=16,#16個卷積核同時對圖片的同一個區(qū)域進(jìn)行卷積
kernel_size=5,#filter的寬高都是5個像素
stride=1,#步長,filter在掃描時的跳步 每隔多少步跳一下
padding=2,#如果filter跳步之后超出圖片范圍,那么這個padding會給圖片加一圈0,0對應(yīng)的顏色就是黑色,padding如果非零會改變原始圖片
#if stride=1 padding=(kernel_size-1)/2=(5-1)/2
),#->(16,28,28)
nn.ReLU(),#->(16,28,28)
nn.MaxPool2d(kernel_size=2),#池化層 往下篩選重要的部分 ->(16,14,14)
)
self.conv2=nn.Sequential(#(16,14,14)
nn.Conv2d(16,32,5,1,2),#->(32,14,14)
nn.ReLU(),#->(32,14,14)
nn.MaxPool2d(2),#->(32,7,7)
)
self.out=nn.Linear(32*7*7,10)#0-9一共10個分類
def forward(self,x):
x=self.conv1(x)
x=self.conv2(x) #(batch,32,7,7)
x=x.view(x.size(0),-1)#(batch,32*7*7)
output=self.out(x)
return output
cnn=CNN()
#4.優(yōu)化器和損失函數(shù)
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) # optimize all cnn parameters
loss_func = nn.CrossEntropyLoss() # the target label is not one-hotted
#5.訓(xùn)練模型
# training and testing
for epoch in range(EPOCH):
for step, (b_x, b_y) in enumerate(train_loader): # 分配 batch data, normalize x when iterate train_loader
output = cnn(b_x) # cnn output
loss = loss_func(output, b_y) # cross entropy loss
optimizer.zero_grad() # clear gradients for this training step
loss.backward() # backpropagation, compute gradients
optimizer.step() # apply gradients
if step%50==0:
test_output=cnn(test_x)
pred_y=torch.max(test_output,1)[1].data.squeeze()
accuracy=sum(pred_y==test_y)/test_y.size(0)
print('Epoch: ',epoch,'| train loss: %.4f'%loss.data,'| test accuracy: %.4f'%accuracy)
#print 10 predictions from test data
test_output=cnn(test_x[:10])
pred_y=torch.max(test_output,1)[1].data.numpy().squeeze()
print(pred_y,'prediction number')
print(test_y[:10].numpy(),'real number')
到了這里,關(guān)于機(jī)器學(xué)習(xí)-12 卷積神經(jīng)網(wǎng)絡(luò)簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!