作者| Lai
來源| Data
編輯|代碼醫(yī)生團隊
上邊是服裝的圖片。你能告訴我他們是什么嗎?
如果猜到運動鞋,連衣裙和靴子,你說得對!這不是太難卷積神經(jīng)網(wǎng)絡(luò)有沒有正則化,是嗎?那是因為人類非常善于檢測模式和分類對象。然而情況并非總是如此,特別是對于機器而言。計算機看不到,它看到了這個:
圖像作為數(shù)字矩陣存儲在計算機中,其中每個數(shù)字代表像素的顏色。對于黑白圖像,每個像素只有一個數(shù)字代表其黑暗,而對于彩色圖像,RGB通道將有3個數(shù)字(一個用于紅色,一個用于藍色,一個用于綠色)。每個數(shù)字代表該顏色的強度,范圍在0到255之間。
那么,如果一個圖像是鞋子或T恤,如果它能“看到”的只是數(shù)字,怎么教電腦呢?計算機分析和理解圖像的過程稱為計算機視覺,機器學(xué)習(xí)的子集,卷積神經(jīng)網(wǎng)絡(luò)是任務(wù)的最佳算法。
創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)
展示如何在中構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)。使用MNIST - 數(shù)據(jù)集訓(xùn)練了它,其中有60,000個28x28分辨率的黑白圖像的衣服。
在這里查看的完整代碼。
%20CNN.py
第1部分:導(dǎo)入,初始化和數(shù)據(jù)集
首先,導(dǎo)入,將使用的深度學(xué)習(xí)庫,以及,它提供數(shù)據(jù)集和圖像轉(zhuǎn)換。然后明確導(dǎo)入torch.和torch.以方便使用。還導(dǎo)入了torch.nn(的神經(jīng)網(wǎng)絡(luò)庫)卷積神經(jīng)網(wǎng)絡(luò)有沒有正則化,torch.nn.(包括非線性函數(shù),如ReLu和)和torch.(反向傳播的計算圖)。
#Importing?libraries
import?torch
import?torchvision
import?torchvision.transforms?as?transforms
import?torchvision.datasets?as?datasets
import?torch.nn?as?nn
import?torch.nn.functional?as?F
from?torch.autograd?import?Variable
然后初始化超參數(shù),其中包括時期數(shù)(訓(xùn)練輪次),種類數(shù)量(有10種:T恤,褲子,套頭衫,連衣裙,外套,涼鞋,襯衫,運動鞋,包和靴子),小批量梯度下降的批量大小,以及梯度下降的學(xué)習(xí)率。
#Initializing?hyperparameters
num_epochs?=?8
num_classes?=?10
batch_size?=?100
learning_rate?=?0.001
是時候檢索數(shù)據(jù)集了!加載MNIST-的訓(xùn)練集和測試集,并設(shè)置參數(shù)以將數(shù)據(jù)集轉(zhuǎn)換為張量(.())。還通過設(shè)置平均值和標(biāo)準(zhǔn)差來對它們進行標(biāo)準(zhǔn)化(.((0.5,0.5,0.5),(0.5,0.5,0.5)))。
#Loading?dataset
transform?=?transforms.Compose([transforms.ToTensor(),
????????????????????????????????transforms.Normalize((0.5,0.5,0.5),?(0.5,0.5,0.5))])
train_dataset?=?datasets.FashionMNIST(root='./data',
????????????????????????????train=True,
????????????????????????????download=True,
????????????????????????????transform=transform)
test_dataset?=?datasets.FashionMNIST(root='./data',
???????????????????????????train=False,
???????????????????????????download=True,
???????????????????????????transform=transform)
在加載數(shù)據(jù)集時,應(yīng)該看到以下消息:
此階段的最后一步是將數(shù)據(jù)放入對象(數(shù)據(jù)加載器)以使其更易于訪問。改組訓(xùn)練數(shù)據(jù)集,以便訓(xùn)練中不會有任何偏差。
#Loading?dataset?into?dataloader
train_loader?=?torch.utils.data.DataLoader(dataset=train_dataset,
???????????????????????????????????????????batch_size=batch_size,
???????????????????????????????????????????shuffle=True)
test_loader?=?torch.utils.data.DataLoader(dataset=test_dataset,
??????????????????????????????????????????batch_size=batch_size,
??????????????????????????????????????????shuffle=False)
以下將用于訓(xùn)練網(wǎng)絡(luò)的數(shù)據(jù)集中的一些圖像:
第2部分:構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)
使用nn.類初始化神經(jīng)網(wǎng)絡(luò),nn.類是所有分層神經(jīng)網(wǎng)絡(luò)模塊的基類:
#Defining?the?network??????????
class?CNNModel(nn.Module):
卷積網(wǎng)絡(luò)將是兩個卷積層,每個卷積層后面跟著一個非線性函數(shù)(ReLu)和一個最大池化層,最后是一個完全連接的層和用于線性回歸。
卷積神經(jīng)網(wǎng)絡(luò)的層次
還在完全連接層之前使用壓差進行正則化,以防止過度擬合。因此可以按如下方式初始化網(wǎng)絡(luò)中的層:
def?__init__(self):
????????super(CNNModel,?self).__init__()
????????#Convolution?1
????????self.cnn1?=?nn.Conv2d(in_channels=1,?out_channels=16,?kernel_size=5,?stride=1,?padding=2)
????????self.relu1?=?nn.ReLU()
????????#Max?pool?1
????????self.maxpool1?=?nn.MaxPool2d(kernel_size=2)
????????#Convolution?2
????????self.cnn2?=?nn.Conv2d(in_channels=16,?out_channels=32,?kernel_size=5,?stride=1,?padding=2)
????????self.relu2?=?nn.ReLU()
????????#Max?pool?2
????????self.maxpool2?=?nn.MaxPool2d(kernel_size=2)
????????#Dropout?for?regularization
????????self.dropout?=?nn.Dropout(p=0.5)
????????#Fully?Connected?1
????????self.fc1?=?nn.Linear(32*7*7,?10)
在用于前向傳播的前向功能中,將每個層應(yīng)用于輸入數(shù)據(jù)以及丟失。此外,在正則化之前,將數(shù)據(jù)展平為線性回歸的一維(第一維是批量大小)。
def?forward(self,?x):
????????#Convolution?1
????????out?=?self.cnn1(x)
????????out?=?self.relu1(out)
????????#Max?pool?1
????????out?=?self.maxpool1(out)
????????#Convolution?2
????????out?=?self.cnn2(out)
????????out?=?self.relu2(out)
????????#Max?pool?2
????????out?=?self.maxpool2(out)
????????#Resize
????????out?=?out.view(out.size(0),?-1)
????????#Dropout
????????out?=?self.dropout(out)
????????#Fully?connected?1
????????out?=?self.fc1(out)
????????return?out
第3部分:創(chuàng)建實例
現(xiàn)在已經(jīng)為卷積神經(jīng)網(wǎng)絡(luò)創(chuàng)建了一個類,需要創(chuàng)建一個它的實例(創(chuàng)建了一個類來確定它的層和前向傳播,但還沒有實際創(chuàng)建一個真正的神經(jīng)網(wǎng)絡(luò)) 。
#Create?instance?of?model
model?=?CNNModel()
還使用交叉熵損失來確定神經(jīng)網(wǎng)絡(luò)輸出的標(biāo)簽。
#Create?instance?of?loss
criterion?=?nn.CrossEntropyLoss()
最后初始化線性回歸/ 函數(shù)。
#Create?instance?of?optimizer?(Adam)
optimizer?=?torch.optim.Adam(model.parameters(),?lr=learning_rate)
第4部分:培訓(xùn)模型
創(chuàng)建網(wǎng)絡(luò)和實例后,準(zhǔn)備使用數(shù)據(jù)集進行訓(xùn)練!遍歷數(shù)據(jù)集,對于每個小批量,執(zhí)行前向傳播,計算交叉熵損失,執(zhí)行后向傳播并使用漸變來更新參數(shù)。
#Train?the?model
iter?=?0
for?epoch?in?range(num_epochs):
????for?i,?(images,?labels)?in?enumerate(train_loader):
????????images?=?Variable(images)
????????labels?=?Variable(labels)
????????#Clear?the?gradients
????????optimizer.zero_grad()
????????#Forward?propagation
????????outputs?=?model(images)??????
????????#Calculating?loss?with?softmax?to?obtain?cross?entropy?loss
????????loss?=?criterion(outputs,?labels)
????????#Backward?propation
????????loss.backward()
????????#Updating?gradients
????????optimizer.step()
????????iter?+=?1
????????#Total?number?of?labels
????????total?=?labels.size(0)
????????#Obtaining?predictions?from?max?value
????????_,?predicted?=?torch.max(outputs.data,?1)
????????#Calculate?the?number?of?correct?answers
????????correct?=?(predicted?==?labels).sum().item()
????????#Print?loss?and?accuracy
????????if?(i?+?1)?%?100?==?0:
????????????print('Epoch?[{}/{}],?Step?[{}/{}],?Loss:?{:.4f},?Accuracy:?{:.2f}%'
??????????????????.format(epoch?+?1,?num_epochs,?i?+?1,?len(train_loader),?loss.item(),
??????????????????????????(correct?/?total)?*?100))
此外,每100個小批量,神經(jīng)網(wǎng)絡(luò)的損失和準(zhǔn)確性。最終輸出應(yīng)如下所示:
第5部分:測試模型
模型經(jīng)過訓(xùn)練,剩下要做的就是測試它!在測試數(shù)據(jù)集上運行神經(jīng)網(wǎng)絡(luò),將輸出與正確的標(biāo)簽進行比較,并確定整體準(zhǔn)確性。
#Testing?the?model
with?torch.no_grad():
????correct?=?0
????total?=?0
????for?images,?labels?in?test_loader:
????????images?=?Variable(images)
????????labels?=?Variable(labels)
????????outputs?=?model(images)
????????_,?predicted?=?torch.max(outputs.data,?1)
????????total?+=?labels.size(0)
????????correct?+=?(predicted?==?labels).sum().item()
????print('Test?Accuracy?of?the?model?on?the?10000?test?images:?{}?%'.format(100?*?correct?/?total))
結(jié)果
結(jié)果如下!
神經(jīng)網(wǎng)絡(luò)應(yīng)該達到88%-90%的準(zhǔn)確度,與MNIST-數(shù)據(jù)集上的2層CNN的91.6%基準(zhǔn)相比,這是非常好的。請注意,MNIST-數(shù)據(jù)集比原始的MNIST數(shù)字?jǐn)?shù)據(jù)集更難訓(xùn)練。如果想要獲得更高的準(zhǔn)確度,將不得不添加更多層,更多地預(yù)處理數(shù)據(jù)以更好地標(biāo)準(zhǔn)化它,并增加時期數(shù)。
以下是神經(jīng)網(wǎng)絡(luò)的一些預(yù)測:
由卷積神經(jīng)網(wǎng)絡(luò)做出的預(yù)測
如您所見,模型可以正確分類這些衣服!然而,它仍然不完美,因為它錯誤地將最后一個圖像(運動鞋)分類為套頭衫。盡管如此,該模型仍然非常準(zhǔn)確,將努力改進它。
卷積神經(jīng)網(wǎng)絡(luò)圖形
關(guān)于圖書
《深度學(xué)習(xí)之:入門、原理與進階實戰(zhàn)》和《帶我起飛——入門、進階、商業(yè)實戰(zhàn)》兩本圖書是代碼醫(yī)生團隊精心編著的 AI入門與提高的精品圖書。配套資源豐富:配套視頻、QQ讀者群、實例源碼、 配套論壇: 。更多請見: