pytorch 对抗样本_《AI安全之对抗样本入门》—3.4 PyTorch
3.4 PyTorch
PyTorch是torch的Python版本,是由Facebook開源的神經網絡框架。PyTorch雖然是深度學習框架中的后起之秀,但是發展極其迅猛。PyTorch提供了NumPy風格的Tensor操作,熟悉NumPy操作的用戶非常容易上手。我們以解決經典的手寫數字識別的問題為例,介紹PyTorch的基本使用方法,代碼路徑為:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/2-pytorch.ipynb
1. 加載相關庫
加載處理經典的手寫數字識別問題相關的Python庫:
import os
import torch
import torchvision
from torch.autograd import Variable
import torch.utils.data.dataloader as Data
2. 加載數據集
PyTorch中針對常見的數據集進行了封裝,免去了用戶手工下載的過程并簡化了預處理的過程。這里需要特別指出的是,PyTorch中每個Tensor包括輸入節點,并且都可以有自己的梯度值,因此訓練數據集要設置為train=True,測試數據集要設置為train=False:
train_data = torchvision.datasets.MNIST(
'dataset/mnist-pytorch', train=True,
transform=torchvision.transforms.ToTensor(), download=True
)
test_data = torchvision.datasets.MNIST(
'dataset/mnist-pytorch', train=False,
transform=torchvision.transforms.ToTensor()
)
如果需要對數據進行歸一化,可以進一步使用transforms.Normalize方法:
transform=transforms.Compose([torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize([0.5], [0.5])])
第一次運行該程序時,PyTorch會從互聯網直接下載數據集并處理:
Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
Processing... Done!
3. 定義網絡結構
使用與Keras類似的網絡結構,即兩層隱藏層結構,不過使用BatchNorm層替換了Dropout層,在抵御過擬合的同時加快了訓練的收斂速度。在PyTorch中定義網絡結構,通常需要繼承torch.nn.Module類,重點是在forward中完成前向傳播的定義,在init中完成主要網絡層的定義:
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.dense = torch.nn.Sequential(
#全連接層
torch.nn.Linear(784, 512),
#BatchNorm層
torch.nn.BatchNorm1d(512),
torch.nn.ReLU(),
torch.nn.Linear(512, 10),
torch.nn.ReLU()
)??? def forward(self, x):
#把輸出轉換成大小為784的一維向量
x = x.view(-1, 784)
x=self.dense(x)
return torch.nn.functional.log_softmax(x, dim=1)
最后可視化網絡結構,細節如圖3-7所示。
圖3-7 PyTorch處理MNIST的網絡結構圖
4. 定義損失函數和優化器
損失函數使用交叉熵CrossEntropyLoss,優化器使用Adam,優化的對象是全部網絡參數:
optimizer = torch.optim.Adam(model.parameters())
loss_func = torch.nn.CrossEntropyLoss()
5. 訓練與驗證
PyTorch的訓練和驗證過程是分開的,在訓練階段需要把訓練數據進行前向傳播后,使用損失函數計算訓練數據的真實標簽與預測標簽之間損失值,然后顯示調用反向傳遞backward(),使用優化器來調整參數,這一操作需要調用optimizer.step():
for i, data in enumerate(train_loader):
inputs, labels = data
inputs, labels = inputs.to(device), labels.to(device)
# 梯度清零
optimizer.zero_grad()
# 前向傳播
outputs = model(inputs)
loss = loss_func(outputs, labels)
#反向傳遞
loss.backward()
optimizer.step()
每輪訓練需要花費較長的時間,為了讓訓練過程可視化,可以打印訓練的中間結果,比如每100個批次打印下平均損失值:
# 每訓練100個批次打印一次平均損失值
sum_loss += loss.item()
if (i+1) % 100 == 0:
print('epoch=%d, batch=%d loss: %.04f'% (epoch + 1, i+1, sum_loss / 100))
sum_loss = 0.0
驗證階段要手工關閉反向傳遞,需要通過torch.no_grad()實現:
# 每跑完一次epoch,測試一下準確率進入測試模式,禁止梯度傳遞
with torch.no_grad():
correct = 0
total = 0
for data in test_loader:
images, labels = data
images, labels = images.to(device), labels.to(device)
outputs = model(images)
# 取得分最高的那個類
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum()
print('epoch=%d accuracy=%.02f%%' % (epoch + 1, (100 * correct /
total)))
經過20輪訓練,在測試集上準確度達到了97.00%:
epoch=20, batch=100 loss: 0.0035
epoch=20, batch=200 loss: 0.0049
epoch=20, batch=300 loss: 0.0040
epoch=20, batch=400 loss: 0.0042
epoch=20 accuracy=97.00%
PyTorch保存的模型文件后綴為pth:
torch.save(model.state_dict(), 'models/pytorch-mnist.pth')
總結
以上是生活随笔為你收集整理的pytorch 对抗样本_《AI安全之对抗样本入门》—3.4 PyTorch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch 指定卡1_在pytorc
- 下一篇: 高大上的集团名字_那些刚改了“高大上”名