多層全連線神經網路實現minist手寫數字分類

2022-02-19 10:22:22 字數 3863 閱讀 4662

import

torch

import

numpy as np

import

torch.nn as nn

from torch.autograd import

variable

import

torch.optim as optim

from torch.utils.data import

dataloader

from torchvision import datasets, transforms

batch_size = 64learning_rate = 1e-2num_epoches = 20

data_tf = transforms.compose([transforms.totensor(), transforms.normalize([0.5],[0.5])])

#transform.compose() 將各種預處理操作組合在一起

#transform.totensor() 將資料轉化為tensor型別,並自動標準化,tensor的取值是(0,1)

#transform.normalize()是標準化操作,類似正太分布的標準化,第乙個值是均值,第二個值是方差

#如果影象是三個通道,則transform.normalize([a,b,c],[d,e,f])

train_dataset = datasets.mnist(root = '

./mnist_data

', train = true, transform = data_tf, download =true) #用datasets載入資料集,傳入預處理

test_dataset = datasets.mnist(root = '

./mnist_data

', train = false,transform =data_tf)

train_loader = dataloader(train_dataset, batch_size = batch_size, shuffle =true) #利用dataloader建立乙個資料迭代器

定義損失函式和優化器 

criterion =nn.crossentropyloss()

optimizer = optim.sgd(model.parameters(), lr = learning_rate)

訓練模型

for epoch in range(num_epoches):

train_loss = 0

train_acc = 0

model.train() #這句話會自動調整batch_normalize和dropout值,很關鍵!

for img, label in train_loader:

img = img.view(img.size(0), -1) #將資料扁平化為一維

img = variable(img)

label = variable(label)

# 前向傳播

out = model(img)

loss = criterion(out, label)

# 反向傳播

optimizer.zero_grad()

loss.backward()

optimizer.step()

# 記錄誤差

train_loss += loss.item()

# 計算分類的準確率

_, pred = out.max(1)

num_correct = (pred == label).sum().item()

acc = num_correct / img.shape[0]

train_acc += acc

print('epoch:{},train_loss:,acc:'.format(epoch+1, train_loss/len(train_loader), train_acc/len(train_loader)))

epoch:1,train_loss:0.002079,acc:0.999767

......  

epoch:19,train_loss:0.001532,acc:0.999917

epoch:20,train_loss:0.001670,acc:0.999850

測試集

model.eval()  #

在評估模型時使用,固定bn 和 dropout

eval_loss =0

val_acc =0

for img , label in

test_loader:

img = img.view(img.size(0), -1)

img = variable(img, volatile = true) #

volatile=true表示前向傳播是不會保留快取,因為測試集不需要反向傳播

label = variable(label, volatile =true)

out =model(img)

loss =criterion(out, label)

eval_loss +=loss.item()

_,pred = torch.max(out, 1)

num_correct = (pred ==label).sum().item()

print

(num_correct)

eval_acc = num_correct /label.shape[0]

val_acc +=eval_acc

print('

test loss:, acc:

'.format(eval_loss/len(test_loader), val_acc/len(test_loader)))

test loss:0.062413, acc:0.981091

神經網路 全連線神經網路

全連線神經網路 也稱作多層感知機 mlp 1.1 神經元 神經元接收輸入向量x xx神經元節點有權重向量w和偏置項b 輸出值為f w tx b f w tx b f wtx b 在經過類似線性回歸之後 使用啟用函式對得到值進行操作 1.2 網路結構 個人對於每一層的理解就是 使用 這層維度,上層維度...

什麼是全連線神經網路

對n 1層和n層而言 n 1層的任意乙個節點,都和第n層所有節點有連線。即第n層的每個節點在進行計算的時候,啟用函式的輸入是n 1層所有節點的加權。全連線是一種不錯的模式,但是網路很大的時候,訓練速度回很慢。部分連線就是認為的切斷某兩個節點直接的連線,這樣訓練時計算量大大減小 最簡單的全連線神經網路...

mlp神經網路 MLP(全連線神經網路)的反向傳播

3 梯度消失與 mlp可以說是最簡單的一種ann結構了,輸入通過若干個隱藏層後,進入輸出層得到輸出。下圖展示了只有乙個單隱層的mlp。圖1 單隱層mlp 如果使用交叉熵損失函式 cross entropy error function 需要在輸出層的狀態值 如果使用mse損失函式 mean squa...