importtorch
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()
(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...