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')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

包包的结构制图_15种常见领型的结构制图

原标题:15种常见领型的结构制图更多独家素材分享欢迎添加博主微信 Wlb109701来源 | 服装云教育整理编辑V领注意1、V形领的前开深,除夜礼服外,一般最深开到胸围线附近(胸围线以上3cm处),如果继续开深,需添加挡胸。2、贴…

android+内存清理+代码,最新版本:Android一键式清理,内存清理功能的实现

Android一键式清理,内存清理功能的实山清理大师等均提供一键式清理和一键加速等功能。实际上,它们杀死了一些后台进程以达到释放内存的目的。基本思想是列出所有正在运行的进程,检查它们的重要值(RunningAppProcessInfo.importance&#xff0…

android xml通知栏权限配置,Android开发中 AndroidManifest.xml配置之service,receiver标签配置详解...

本文主要来分享service,receiver标签配置。如有错误,欢迎指正。android:directBootAware["true" | "false"]android:enabled["true" | "false"]android:exported["true" | "false"]android:foreground…

cups共享linux打印机_linux入门-映射网络驱动器

linux入门-映射网络驱动器在日常中,我们不会时时刻刻远程着linux服务器,那么有没有办法可以让我们在window电脑上映射linux的磁盘呢?这是可以实现的,这里我们就要介绍samba了。sambaSamba是在Linux和UNIX系统上实现SMB协议的一个免…

c++ idea 插件_idea快速开发插件

插件:1、Background Image Plus这款插件并不能直接提高你的开发效率,但是可以让你面对的IDE不再单调,当把背景设置成你自己心仪的的图片,是不是会感觉很赏心悦目,编码效率会不会因此间接的提高?&#xff01…

android 删除模拟器,android – 如何从avd设备中删除脱机模拟器?

我在Android Studio中创建了几个AVD-s.他们在模拟器端口5554上启动.然后我通过android avd应用程序创建了另一个AVD,他们从端口5556开始.现在运行一个模拟器,我从adb devices -l获得以下输出:List of devices attachedemulator-5556 deviceemulator-5554 offline我正…

mongodb 搜索速度_MongoDB数据库查询性能提高40倍的经历分享

前言数据库性能对软件整体性能有着至关重要的影响,本文给大家分享了一次MongoDB数据库查询性能提高40倍的经历,感兴趣的朋友们可以参考学习。背景说明1、数据库:MongoDB2、数据集:A:字段数不定,这里主要用到…

signature=8405d26e250ad07c44560263cb1d4fc0,Systems for analyzing microtissue arrays

摘要:A tissue microarray imaging system autonomously images, analyzes, and stores data for samples in a tissue microarray. The system may include a tissue microarray, a robotic microscope, and an imaging workstation that executes software to aut…

ios支付宝支付失败不回调_为什么 iOS 支付成功后能回到 APP ,但是没有回调?...

接入客户端从服务器端拿到 charge 对象后,调用下面的方法[Pingpp createPayment:chargeviewController:viewControllerappURLScheme:kUrlSchemewithCompletion:^(NSString *result, PingppError *error) {if ([result isEqualToString:"success"]) { …

html如何将设置文本效果,css如何对文本进行修饰

color属性:设置文本文字颜色。用法如下:color:颜色值;color属性可以设置的合法颜色值包括:16进制颜色值(例:#ffffff),rgb颜色值【例:rgb(0,0,0)】,rgba颜色值【例:rgb(0,…

HTML与cgi post传递与接收,CGI实例--表单GET与POST示例

CGI概述CGI(Common Gateway Interface: 公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序通过读标准输入,接受Web浏览器发送给Web服务器的信息, 进行处理, 将响应结果再通过…

vue横向树结构_vue树形结构的实现

1. 主要代码使用单文件组件的方式, 需要一个父组件treeMenu, 和子组件treeItem1.1 父组件treeMenu.vue:nodes"treeData">export default {name: treeMenu,data: () > {return {treeData: {label: china,nodes: [{label: hubei,nodes: [{label: wuhan},{label: …

cesium js 路径_vue2.0项目集成Cesium的实现方法

安装cesium在已有项目中执行,npm i cesium修改配置build/webpack.base.conf.js1、定义 Cesium 源码路径const cesiumSource ../node_modules/cesium/Sourceuse strictconst path require(path)const utils require(./utils)const config require(../config)const vueLoader…

pytorch模型加载测试_pytorch模型加载方法汇总

Pytorch有很多方便易用的包,今天要谈的是torchvision包,它包括3个子包,分别是: torchvison.datasets ,torchvision.models ,torchvision.transforms ,分别是预定义好的数据集(比如MNIST、CIFAR1…

android studio聊天跳转_Android 第三方应用跳转到QQ进行聊天

跳转QQ聊天代码十分简单&#xff1a;//获取包信息public static booleanisQQClientAvailable(Context context) {finalPackageManager packageManager context.getPackageManager();List pinfo packageManager.getInstalledPackages(0);if(pinfo !null) {for(inti 0;i < p…

html字体闪烁模板,CSS+JS阴影闪烁文字

阴影闪烁文字.F1 {filter: glow(Color#FF8000,Strength10);width150px;height200px;}.F2 {filter: glow(Color#00FF00,Strength9);width110px;height200px;}.F3 {filter: glow(Color#0080FF,Strength12);width90px;height200px;}var rate 500var i 0var F F1function doThin…

html 规定换行,HTML 换行

css3整理--clipclip语法: .selector { clip: rect | auto | inherit } 注意:clip属性只能在元素设置了“position:absolute”或者“position:fi ...Android 边框圆角RelativeLayout 圆角实现: drawable目录下面定义shape的xml文件: mall_header_rel_bg.xml <?xml version&…

qt执行命令行失败_QT缺少 qtcore4.dll,debug下运行不成功

刚装QT的时候&#xff0c;好像我的环境变量没有设置好&#xff0c;哎&#xff0c;。隐患终于爆发了。在VS下运行成功的QT程序&#xff0c;然后点击Debug下的.exe&#xff0c;老提示缺少Qtcore4.dll&#xff0c;当时正郁闷之极&#xff0c;忘了怎样在网页上查找&#xff0c;只是…

伪类如何动态在html设置样式,用js实现before和after伪类的样式修改的示例代码

本文介绍了使用javascript,jQuery实现修改before,after伪类的样式&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;最近遇到一个需要改变:before,:after 伪类的样式&#xff0c;发现css中并不能直接选择某一个元素的:before和:after伪类元素&#xff0c;所以特总结了使…

html 图片平移动画,CSS3 圆圈内图片的自动平移/旋转动画

CSS语言&#xff1a;CSSSCSS确定body {background: #fbfbfb;}.spinner {width: 155px;height: 155px;border-radius: 100%;background-color: #d8d8d8;border: 10px solid #575757;position: absolute;top: 50%;left: 50%;transform: translateX(-50%) translateY(-50%) transl…