训练图像分类网络健壮的敌对的例子
这个例子展示了如何训练一个神经网络强大的敌对的例子使用快速梯度信号法(FGSM)对抗训练。
神经网络可以容易的现象称为敌对的例子[1],很小的更改输入会导致被误诊。这些变化通常是人类察觉不到的。
技术用于创建敌对的例子包括FGSM[2]和基本迭代法(BIM)[3],也称为投影梯度下降[4]。这些技术可以显著降低网络的准确性。
您可以使用对抗训练[5]训练网络强大的敌对的例子。这个例子展示了如何:
火车一个图像分类网络。
调查网络健壮性,产生敌对的例子。
训练一个健壮的图像分类网络对抗的例子。
负荷训练数据
的digitTrain4DArrayData
函数加载手写数字图像和数字标签。创建一个arrayDatastore
图片和标签对象,然后使用结合
函数来做一个包含的所有训练数据的数据存储。
rng默认的[XTrain, TTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore (XTrain IterationDimension = 4);dsTTrain = arrayDatastore (TTrain);dsTrain =结合(dsXTrain dsTTrain);
提取类名。
类=类别(TTrain);
构建网络体系结构
定义一个图像分类网络。
层= [imageInputLayer([28 28 1],正常化=“没有”)convolution2dLayer(3、32、填充= 1)reluLayer convolution2dLayer(64,填充= 1)reluLayer maxPooling2dLayer(2步= 2)fullyConnectedLayer (10) softmaxLayer];lgraph = layerGraph(层);
创建一个dlnetwork
对象的层图。
网= dlnetwork (lgraph);
定义模型损失函数
创建函数modelLoss
上市的例子,作为输入dlnetwork
输入数据与相应的标签的对象和一个mini-batch并返回损失和损失的梯度对网络中可学的参数。
列车网络的
列车网络使用自定义训练循环。
指定培训选项。火车30时代mini-batch大小为100和学习速率为0.01。
numEpochs = 30;miniBatchSize = 100;learnRate = 0.01;executionEnvironment =“汽车”;
创建一个minibatchqueue
对象流程和管理mini-batches图像在训练。为每个mini-batch:
使用自定义mini-batch预处理功能
preprocessMiniBatch
(在这个例子中定义)转换编码的标签在一个炎热的变量。格式的图像数据维度标签
“SSCB”
(空间、空间、通道、批)。火车在GPU如果一个是可用的。默认情况下,
minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)。
兆贝可= minibatchqueue (dsTrain,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat = [“SSCB”,”“]);
初始化培训进展阴谋。
图lineLossTrain = animatedline(颜色= [0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)在
个解算器初始化速度参数。
速度= [];
列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:
损失评估模型,使用渐变和状态
dlfeval
和modelLoss
功能和更新网络状态。更新网络参数使用
sgdmupdate
函数。显示培训进展。
迭代= 0;开始=抽搐;%循环时期。为时代= 1:numEpochs%洗牌数据。洗牌(兆贝可)%在mini-batches循环。而hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[X, T] =下一个(兆贝可);%如果训练在GPU,然后将数据转换成gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”X = gpuArray (X);T = gpuArray (T);结束%损失评估模型,渐变和状态。(损失、渐变、状态)= dlfeval (@modelLoss,净,X, T);网。=状态;%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate);%显示培训进展。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束
测试网络
测试网络的分类精度评价网络预测一组测试数据。
创建一个minibatchqueue
包含测试数据的对象。
(XTest, tt) = digitTest4DArrayData;dsXTest = arrayDatastore (XTest IterationDimension = 4);dst = arrayDatastore (tt);dst =结合(dsXTest dsTTest);mbqTest = minibatchqueue (dst,…MiniBatchSize = MiniBatchSize,…MiniBatchFcn = @preprocessMiniBatch,…MiniBatchFormat =“SSCB”);
预测的类使用网络训练和测试数据modelPredictions
函数定义的这个例子。
YPred = modelPredictions(净、mbqTest、类);acc =意味着(YPred = = tt)
acc = 0.9868
网络的精度非常高。
测试网络对抗的输入
应用敌对的扰动输入图像,看看这样做影响网络精度。
您可以生成对抗的例子使用技术,如FGSM和荡妇。FGSM是一个简单的技术,它需要一个单步的方向梯度 的损失函数 关于图像 你想找一个敌对的例子,和类标签 。敌对的例子是计算
。
参数 控制不同的敌对的例子从原始图像。在这个例子中,像素的值在0和1之间,所以一个 值为0.1时改变每个像素值范围的10%。的价值 取决于图像比例尺。例如,如果你的形象是0到255之间,你需要把这个值到255年。
BIM是一个简单的改进FGSM FGSM适用于在多个迭代和应用一个阈值。每一次迭代后,女子剪辑的扰动,以确保大小不超过 。这种方法可以产生敌对的例子不如FGSM失真。产生敌对的例子的更多信息,请参阅为图像分类生成没有针对性和有针对性的对抗的例子。
创建使用BIM敌对的例子。集ε
到0.1。
ε= 0.1;
荡妇,扰动的大小由参数控制 代表每个迭代的步长。这是随着BIM通常需要很多,小,FGSM步骤的方向梯度。
定义了步长α
和迭代次数。
α= 0.01;numAdvIter = 20;
使用adversarialExamples
函数(在本例中定义)来计算对抗的例子使用BIM的测试数据集。这个函数也返回的新预测对手的图像。
重置(mbqTest) [XAdv YPredAdv] = adversarialExamples(净、mbqTestε,α,numAdvIter类);
计算网络对抗的示例数据的准确性。
accAdversarial =意味着(YPredAdv = = tt)
accAdversarial = 0.0114
策划的结果。
visualizePredictions (XAdv YPredAdv、tt);
你可以看到女子的准确性严重退化,即使图像扰动是几乎不可见。
火车健壮的网络
你可以训练一个网络是强大的敌对的例子。一个流行的方法是对抗训练。对抗训练涉及应用敌对的扰动在训练过程中训练数据[4][5]。
FGSM敌对的培训是一个快速和有效的技术培训是健壮的网络对抗的例子。FGSM类似于女子,但这需要一个更大一步的方向梯度产生敌对的形象。
对抗训练包括FGSM技术应用到每个mini-batch训练数据。然而,对于训练是有效的,这些标准必须申请:
FGSM训练方法必须使用一个随机扰动的扰动而不是初始化初始化为零。
网络的鲁棒扰动的大小 ,执行FGSM比训练一个值 。对于这个示例,在对抗训练,你扰乱图像使用步长 。
火车与FGSM新的网络对抗训练。首先使用相同的原始网络训练的网络架构。
netRobust = dlnetwork (lgraph);
定义对抗训练参数。设置迭代次数为1,FGSM相当于BIM使用一个迭代。随机初始化摄动和扰乱图像使用α
。
numIter = 1;初始化=“随机”;α= 1.25 *ε;
初始化培训进展阴谋。
图lineLossRobustTrain = animatedline(颜色= [0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)在
培养健壮的网络使用自定义训练循环和同样的训练之前定义的选项。这个循环是一样的在前面的定制培训,但添加了敌对的扰动。
速度= [];迭代= 0;开始=抽搐;%循环时期。为时代= 1:numEpochs%洗牌数据。洗牌(兆贝可)%在mini-batches循环。而hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[X, T] =下一个(兆贝可);%如果训练在GPU,然后将数据转换成gpuArray。如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”X = gpuArray (X);T = gpuArray (T);结束%敌对的扰动适用于数据。X = basicIterativeMethod (netRobust X, T,α,ε,…numIter,初始化);%损失评估模型,渐变和状态。(损失、渐变、状态)= dlfeval (@modelLoss netRobust X T);网。=状态;%更新使用个优化网络参数。[netRobust、速度]= sgdmupdate (netRobust、渐变速度,learnRate);%显示培训进展。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);addpoints (lineLossRobustTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束
测试的网络
计算的准确性上的健壮的网络数字测试数据。健壮的网络的准确性可以略低于nonrobust网络标准的数据。
重置(mbqTest) YPred = modelPredictions (netRobust、mbqTest、类);accRobust =意味着(YPred = = tt)
accRobust = 0.9970
计算出敌对的准确性。
重置(mbqTest) [XAdv YPredAdv] = adversarialExamples (netRobust mbqTest,ε,α,numAdvIter类);accRobustAdv =意味着(YPredAdv = = tt)
accRobustAdv = 0.7366
健壮的网络的对抗性的精度比原来的网络。
金宝app支持功能
损失函数模型
的modelLoss
函数作为输入dlnetwork
对象净
和mini-batch输入数据X
与相应的标签T
并返回损失,损失的梯度参数对可学的净
,和网络状态。自动计算梯度,使用dlgradient
函数。
函数(损失、渐变、状态)= modelLoss(净,X, T) [YPred、州]=前进(净,X);损失= crossentropy (YPred T);梯度= dlgradient(损失、net.Learnables);=双重损失(损失);结束
输入梯度函数
的modelGradientsInput
函数作为输入dlnetwork
对象净
和mini-batch输入数据X
相应的标签T并返回梯度的损失对输入数据X
。
函数梯度= modelGradientsInput(净,X, T) T =紧缩(T);T = dlarray (T)“CB”);[YPred] =前进(净,X);损失= crossentropy (YPred T);梯度= dlgradient(损失,X);结束
Mini-Batch预处理功能
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用以下步骤:
提取图像数据从传入单元阵列和连接到一个四维数组。
从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数[X, T] = preprocessMiniBatch(伊势亚TCell)%连接。猫(X = 4,伊势亚{1:结束});X =单(X);%从细胞中提取标签数据和连接。猫(T = 2, TCell{1:结束});%一个炎热的编码标签。T = onehotencode (T, 1);结束
模型的预测函数
的modelPredictions
函数作为输入dlnetwork
对象净
,一个minibatchqueue
的输入数据兆贝可
网络类,计算模型遍历所有数据的预测minibatchqueue
对象。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数预测= modelPredictions(净、兆贝可类)预测= [];而hasdata(兆贝可)XTest =下一个(兆贝可);YPred =预测(净,XTest);YPred = onehotdecode (YPred、类1)';预测=[预测;YPred];结束结束
敌对的例子函数
产生敌对的一个例子minibatchqueue
对象使用基本迭代法(BIM)和预测的阶级对抗的例子使用训练网络净
。
函数[XAdv,预测]= adversarialExamples(净、兆贝可ε,α,numIter类)XAdv = {};预测= [];迭代= 0;%为每个mini-batch产生敌对的图像。而hasdata(兆贝可)迭代=迭代+ 1;[X, T] =下一个(兆贝可);初始化=“零”;%产生敌对的图像。XAdvMBQ = basicIterativeMethod(净,X, T,α,ε,…numIter,初始化);%预测的类敌对的图像。YPred =预测(净,XAdvMBQ);YPred = onehotdecode (YPred、类1)';XAdv{迭代}= XAdvMBQ;预测=[预测;YPred];结束%连接。XAdv =猫(4,XAdv {:});结束
基本迭代法功能
产生敌对的例子使用基本迭代法(BIM)。这个方法运行多个迭代阈值在每个迭代结束时,以确保不超过的条目ε
。当numIter
设置为1,这相当于使用快速梯度方法(FGSM)标志。
函数XAdv = basicIterativeMethod(净,X, T,α,ε,numIter,初始化)%初始化摄动。如果初始化= =“零”δ= 0(大小(X) = X);其他的δ=ε*(2 *兰德(大小(X) = X) - 1);结束为我= 1:numIter%敌对的扰动适用于数据。梯度= dlfeval (@modelGradientsInput,净、X +δT);δ=δ+α*标志(梯度);三角洲(三角洲>ε)=ε;三角洲(三角洲< -ε)= -ε;结束XAdv = X +δ;结束
可视化预测结果函数
可视化图像及其预测类。正确的预测使用绿色文本。不正确的预测使用红色文本。
函数visualizePredictions (XTest YPred tt)图身高= 4;宽度= 4;numImages =高*宽;%选择随机图像数据。指数= randperm(大小(XTest 4) numImages);XTest = extractdata (XTest);XTest = XTest(::,:,指标);YPred = YPred(指标);tt = tt(指标);%绘制图像的预测标签。为i = 1:(numImages)次要情节(高度、宽度、i) imshow (XTest(::,:,我))%如果预测是正确的,使用绿色。如果预测是错误的,%使用红色。如果YPred (i) = = tt (i)颜色=“{绿}\颜色”;其他的颜色={红}\颜色”;结束标题(预测:“+颜色+字符串(YPred(我)))结束结束
引用
[1]Szegedy,基督徒,Wojciech伦巴,Ilya Sutskever,琼·布鲁纳Dumitru Erhan,伊恩·格拉汉姆·古德费勒和罗伯·费格斯。“有趣的神经网络的性质。“预印本,提交2014年2月19日。https://arxiv.org/abs/1312.6199。
[2]格拉汉姆·古德费勒,伊恩·J。,Jonathon Shlens, and Christian Szegedy. “Explaining and Harnessing Adversarial Examples.” Preprint, submitted March 20, 2015. https://arxiv.org/abs/1412.6572.
[3]Kurakin阿列克谢,伊恩·格拉汉姆·古德费勒和萨米Bengio。“敌对的例子在现实世界。“预印本,提交2017年2月10日。https://arxiv.org/abs/1607.02533。
[4]Madry,亚历山大,亚历山大Makelov,路德维希·施密特,Dimitris齐和Adrian Vladu。“向深度学习模型对对手的攻击。“预印本,提交2019年9月4日。https://arxiv.org/abs/1706.06083。
[5],埃里克,莱斯利大米和j·济科科特勒。“快速比免费更好:回顾对抗训练。“预印本,提交2020年1月12日。https://arxiv.org/abs/2001.03994。
另请参阅
dlfeval
|dlnetwork
|dlgradient
|arrayDatastore
|minibatchqueue