日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

pytorch 对抗样本_《AI安全之对抗样本入门》—3.4 PyTorch

發布時間:2024/7/23 ChatGpt 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。