作者| Lai
來源| Data
編輯|代碼醫生團隊
上邊是服裝的圖片。你能告訴我他們是什么嗎?
如果猜到運動鞋,連衣裙和靴子,你說得對!這不是太難卷積神經網絡有沒有正則化,是嗎?那是因為人類非常善于檢測模式和分類對象。然而情況并非總是如此,特別是對于機器而言。計算機看不到,它看到了這個:
圖像作為數字矩陣存儲在計算機中,其中每個數字代表像素的顏色。對于黑白圖像,每個像素只有一個數字代表其黑暗,而對于彩色圖像,RGB通道將有3個數字(一個用于紅色,一個用于藍色,一個用于綠色)。每個數字代表該顏色的強度,范圍在0到255之間。
那么,如果一個圖像是鞋子或T恤,如果它能“看到”的只是數字,怎么教電腦呢?計算機分析和理解圖像的過程稱為計算機視覺,機器學習的子集,卷積神經網絡是任務的最佳算法。
創建卷積神經網絡
展示如何在中構建卷積神經網絡。使用MNIST - 數據集訓練了它,其中有60,000個28x28分辨率的黑白圖像的衣服。
在這里查看的完整代碼。
%20CNN.py
第1部分:導入,初始化和數據集
首先,導入,將使用的深度學習庫,以及,它提供數據集和圖像轉換。然后明確導入torch.和torch.以方便使用。還導入了torch.nn(的神經網絡庫)卷積神經網絡有沒有正則化,torch.nn.(包括非線性函數,如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
然后初始化超參數,其中包括時期數(訓練輪次),種類數量(有10種:T恤,褲子,套頭衫,連衣裙,外套,涼鞋,襯衫,運動鞋,包和靴子),小批量梯度下降的批量大小,以及梯度下降的學習率。
#Initializing?hyperparameters
num_epochs?=?8
num_classes?=?10
batch_size?=?100
learning_rate?=?0.001
是時候檢索數據集了!加載MNIST-的訓練集和測試集,并設置參數以將數據集轉換為張量(.())。還通過設置平均值和標準差來對它們進行標準化(.((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)
在加載數據集時,應該看到以下消息:
此階段的最后一步是將數據放入對象(數據加載器)以使其更易于訪問。改組訓練數據集,以便訓練中不會有任何偏差。
#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)
以下將用于訓練網絡的數據集中的一些圖像:
第2部分:構建卷積神經網絡
使用nn.類初始化神經網絡,nn.類是所有分層神經網絡模塊的基類:
#Defining?the?network??????????
class?CNNModel(nn.Module):
卷積網絡將是兩個卷積層,每個卷積層后面跟著一個非線性函數(ReLu)和一個最大池化層,最后是一個完全連接的層和用于線性回歸。
卷積神經網絡的層次
還在完全連接層之前使用壓差進行正則化,以防止過度擬合。因此可以按如下方式初始化網絡中的層:
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)
在用于前向傳播的前向功能中,將每個層應用于輸入數據以及丟失。此外,在正則化之前,將數據展平為線性回歸的一維(第一維是批量大小)。
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部分:創建實例
現在已經為卷積神經網絡創建了一個類,需要創建一個它的實例(創建了一個類來確定它的層和前向傳播,但還沒有實際創建一個真正的神經網絡) 。
#Create?instance?of?model
model?=?CNNModel()
還使用交叉熵損失來確定神經網絡輸出的標簽。
#Create?instance?of?loss
criterion?=?nn.CrossEntropyLoss()
最后初始化線性回歸/ 函數。
#Create?instance?of?optimizer?(Adam)
optimizer?=?torch.optim.Adam(model.parameters(),?lr=learning_rate)
第4部分:培訓模型
創建網絡和實例后,準備使用數據集進行訓練!遍歷數據集,對于每個小批量,執行前向傳播,計算交叉熵損失,執行后向傳播并使用漸變來更新參數。
#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個小批量,神經網絡的損失和準確性。最終輸出應如下所示:
第5部分:測試模型
模型經過訓練,剩下要做的就是測試它!在測試數據集上運行神經網絡,將輸出與正確的標簽進行比較,并確定整體準確性。
#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))
結果
結果如下!
神經網絡應該達到88%-90%的準確度,與MNIST-數據集上的2層CNN的91.6%基準相比,這是非常好的。請注意,MNIST-數據集比原始的MNIST數字數據集更難訓練。如果想要獲得更高的準確度,將不得不添加更多層,更多地預處理數據以更好地標準化它,并增加時期數。
以下是神經網絡的一些預測:
由卷積神經網絡做出的預測
如您所見,模型可以正確分類這些衣服!然而,它仍然不完美,因為它錯誤地將最后一個圖像(運動鞋)分類為套頭衫。盡管如此,該模型仍然非常準確,將努力改進它。
卷積神經網絡圖形
關于圖書
《深度學習之:入門、原理與進階實戰》和《帶我起飛——入門、進階、商業實戰》兩本圖書是代碼醫生團隊精心編著的 AI入門與提高的精品圖書。配套資源豐富:配套視頻、QQ讀者群、實例源碼、 配套論壇: 。更多請見: