MindArmour 使用

      網友投稿 876 2025-03-31

      文章首發于筆者華為云,歡迎關注MindArmour 使用(萬字詳解,gitee同步發表)_MindSpore_昇騰論壇_華為云論壇

      配置環境:CPU環境

      首先下載mindspore,參考官網[MindSpore官網]

      安裝MindArmour

      確認系統環境信息

      硬件平臺為Ascend、GPU或CPU。

      參考MindSpore安裝指南,完成MindSpore的安裝。 MindArmour與MindSpore的版本需保持一致。

      其余依賴請參見setup.py。

      安裝方式

      可以采用pip安裝或者源碼編譯安裝兩種方式。

      pip安裝

      pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindArmour/any/mindarmour-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

      在聯網狀態下,安裝whl包時會自動下載MindArmour安裝包的依賴項(依賴項詳情參見setup.py),其余情況需自行安裝。

      {version}表示MindArmour版本號,例如下載1.3.0版本MindArmour時,{version}應寫為1.3.0。

      源碼安裝

      從Gitee下載源碼。

      git clone https://gitee.com/mindspore/mindarmour.git

      MindArmour 使用

      在源碼根目錄下,執行如下命令編譯并安裝MindArmour。

      cd mindarmour python setup.py install

      驗證是否成功安裝

      執行如下命令,如果沒有報錯No module named 'mindarmour',則說明安裝成功。

      python -c 'import mindarmour'

      具體操作如下:

      如圖,最開始沒有安裝,顯示沒有mindarmour庫

      pip命令直接安裝。

      輸入enter之后,沒有錯誤報告,安裝正確。

      進入python環境,安裝正確。

      那我們跑一下測試玩玩。

      使用NAD算法提升模型安全性

      開始

      剛一開始就報錯啦。沒事,我們看看信息。

      貌似這,暫時CPU還跑不了。

      “got device target GPU”。但是仔細分析,我們發現前面這句“support type cpu”。

      我們再結合報錯信息,只用修改代碼中的target即可。

      MindSpore的兼容性還是很強的,

      稍微調試就好。

      果不其然,搞成了target="CPU"就可以了

      這就真不錯。

      經過三輪訓練,精確度已經達到97%了

      GPU上演示

      還沒玩夠,那我們在gpu上再玩一遍

      (差點都忘了自己創建的環境叫什么了,原來叫mindspore1.5-gpu)

      遇見的一些問題

      GPU運行armour

      運行的時候,莫名奇妙出了些小故障,難道python命令出問題了?

      原來是c盤滿了,我把cuda卸了??磥砗俚弥匦录右粔K存儲卡...那寒假再跟大家寫gpu版本的吧。

      完整演示

      pycharm加裝jupyter

      1、安裝Jupyter pip install jupyter

      2、安裝pycharm專業版,然后開始

      建立被攻擊模型

      以MNIST為示范數據集,自定義的簡單模型作為被攻擊模型。

      引入相關包

      import os import numpy as np from scipy.special import softmax from mindspore import dataset as ds from mindspore import dtype as mstype import mindspore.dataset.vision.c_transforms as CV import mindspore.dataset.transforms.c_transforms as C from mindspore.dataset.vision import Inter import mindspore.nn as nn from mindspore.nn import SoftmaxCrossEntropyWithLogits from mindspore.common.initializer import TruncatedNormal from mindspore import Model, Tensor, context from mindspore.train.callback import LossMonitor from mindarmour.adv_robustness.attacks import FastGradientSignMethod from mindarmour.utils import LogUtil from mindarmour.adv_robustness.evaluations import AttackEvaluate context.set_context(mode=context.GRAPH_MODE, device_target="Ascend") LOGGER = LogUtil.get_instance() LOGGER.set_level("INFO") TAG = 'demo'

      下載文件的時候,會報不信任http,沒關系,不用管。

      注意,在CPU上運行,設置為target="CPU"

      加載數據集

      利用MindSpore的dataset提供的MnistDataset接口加載MNIST數據集。

      # generate dataset for train of test def generate_mnist_dataset(data_path, batch_size=32, repeat_size=1, ? ? ? ? ? ? ? ? ? ? ? ? ? num_parallel_workers=1, sparse=True): ? """ ? create dataset for training or testing ? """ ? # define dataset ? ds1 = ds.MnistDataset(data_path) ? # define operation parameters ? resize_height, resize_width = 32, 32 ? rescale = 1.0 / 255.0 ? shift = 0.0 ? # define map operations ? resize_op = CV.Resize((resize_height, resize_width), ? ? ? ? ? ? ? ? ? ? ? ? interpolation=Inter.LINEAR) ? rescale_op = CV.Rescale(rescale, shift) ? hwc2chw_op = CV.HWC2CHW() ? type_cast_op = C.TypeCast(mstype.int32) ? # apply map operations on images ? if not sparse: ? ? ? one_hot_enco = C.OneHot(10) ? ? ? ds1 = ds1.map(operations=one_hot_enco, input_columns="label", ? ? ? ? ? ? ? ? ? ? num_parallel_workers=num_parallel_workers) ? ? ? type_cast_op = C.TypeCast(mstype.float32) ? ds1 = ds1.map(operations=type_cast_op, input_columns="label", ? ? ? ? ? ? ? ? num_parallel_workers=num_parallel_workers) ? ds1 = ds1.map(operations=resize_op, input_columns="image", ? ? ? ? ? ? ? ? num_parallel_workers=num_parallel_workers) ? ds1 = ds1.map(operations=rescale_op, input_columns="image", ? ? ? ? ? ? ? ? num_parallel_workers=num_parallel_workers) ? ds1 = ds1.map(operations=hwc2chw_op, input_columns="image", ? ? ? ? ? ? ? ? num_parallel_workers=num_parallel_workers) ? # apply DatasetOps ? buffer_size = 10000 ? ds1 = ds1.shuffle(buffer_size=buffer_size) ? ds1 = ds1.batch(batch_size, drop_remainder=True) ? ds1 = ds1.repeat(repeat_size) ? return ds1

      建立模型

      這里以LeNet模型為例,您也可以建立訓練自己的模型。

      定義LeNet模型網絡。

      def conv(in_channels, out_channels, kernel_size, stride=1, padding=0): ? weight = weight_variable() ? return nn.Conv2d(in_channels, out_channels, ? ? ? ? ? ? ? ? ? ? kernel_size=kernel_size, stride=stride, padding=padding, ? ? ? ? ? ? ? ? ? ? weight_init=weight, has_bias=False, pad_mode="valid") def fc_with_initialize(input_channels, out_channels): ? weight = weight_variable() ? bias = weight_variable() ? return nn.Dense(input_channels, out_channels, weight, bias) def weight_variable(): ? return TruncatedNormal(0.02) class LeNet5(nn.Cell): ? """ ? Lenet network ? """ ? def __init__(self): ? ? ? super(LeNet5, self).__init__() ? ? ? self.conv1 = conv(1, 6, 5) ? ? ? self.conv2 = conv(6, 16, 5) ? ? ? self.fc1 = fc_with_initialize(16*5*5, 120) ? ? ? self.fc2 = fc_with_initialize(120, 84) ? ? ? self.fc3 = fc_with_initialize(84, 10) ? ? ? self.relu = nn.ReLU() ? ? ? self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2) ? ? ? self.flatten = nn.Flatten() ? def construct(self, x): ? ? ? x = self.conv1(x) ? ? ? x = self.relu(x) ? ? ? x = self.max_pool2d(x) ? ? ? x = self.conv2(x) ? ? ? x = self.relu(x) ? ? ? x = self.max_pool2d(x) ? ? ? x = self.flatten(x) ? ? ? x = self.fc1(x) ? ? ? x = self.relu(x) ? ? ? x = self.fc2(x) ? ? ? x = self.relu(x) ? ? ? x = self.fc3(x) ? ? ? return x

      訓練LeNet模型。利用上面定義的數據加載函數generate_mnist_dataset載入數據。

      mnist_path = "../common/dataset/MNIST/" batch_size = 32 # train original model ds_train = generate_mnist_dataset(os.path.join(mnist_path, "train"), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? batch_size=batch_size, repeat_size=1, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sparse=False) net = LeNet5() loss = SoftmaxCrossEntropyWithLogits(sparse=False) opt = nn.Momentum(net.trainable_params(), 0.01, 0.09) model = Model(net, loss, opt, metrics=None) model.train(10, ds_train, callbacks=[LossMonitor()], ? ? ? ? ? dataset_sink_mode=False)

      以下是訓練模型的結果

      # 2. get test data ds_test = generate_mnist_dataset(os.path.join(mnist_path, "test"), batch_size=batch_size, repeat_size=1, sparse=False) inputs = [] labels = [] for data in ds_test.create_tuple_iterator(): inputs.append(data[0].asnumpy().astype(np.float32)) labels.append(data[1].asnumpy()) test_inputs = np.concatenate(inputs) test_labels = np.concatenate(labels)

      測試模型。

      # prediction accuracy before attack net.set_train(False) test_logits = net(Tensor(test_inputs)).asnumpy() tmp = np.argmax(test_logits, axis=1) == np.argmax(test_labels, axis=1) accuracy = np.mean(tmp) LOGGER.info(TAG, 'prediction accuracy before attacking is : %s', accuracy)

      測試結果中分類精度達到了97%。

      對抗性攻擊

      調用MindArmour提供的FGSM接口(FastGradientSignMethod)。

      # attacking # get adv data attack = FastGradientSignMethod(net, eps=0.3, loss_fn=loss) adv_data = attack.batch_generate(test_inputs, test_labels) # get accuracy of adv data on original model adv_logits = net(Tensor(adv_data)).asnumpy() adv_proba = softmax(adv_logits, axis=1) tmp = np.argmax(adv_proba, axis=1) == np.argmax(test_labels, axis=1) accuracy_adv = np.mean(tmp) LOGGER.info(TAG, 'prediction accuracy after attacking is : %s', accuracy_adv) attack_evaluate = AttackEvaluate(test_inputs.transpose(0, 2, 3, 1), test_labels, adv_data.transpose(0, 2, 3, 1), adv_proba) LOGGER.info(TAG, 'mis-classification rate of adversaries is : %s', attack_evaluate.mis_classification_rate()) LOGGER.info(TAG, 'The average confidence of adversarial class is : %s', attack_evaluate.avg_conf_adv_class()) LOGGER.info(TAG, 'The average confidence of true class is : %s', attack_evaluate.avg_conf_true_class()) LOGGER.info(TAG, 'The average distance (l0, l2, linf) between original ' 'samples and adversarial samples are: %s', attack_evaluate.avg_lp_distance()) LOGGER.info(TAG, 'The average structural similarity between original ' 'samples and adversarial samples are: %s', attack_evaluate.avg_ssim())

      攻擊結果如下:

      prediction accuracy after attacking is : 0.052083 mis-classification rate of adversaries is : 0.947917 The average confidence of adversarial class is : 0.803375 The average confidence of true class is : 0.042139 The average distance (l0, l2, linf) between original samples and adversarial samples are: (1.698870, 0.465888, 0.300000) The average structural similarity between original samples and adversarial samples are: 0.332538

      結果如下。

      對模型進行FGSM無目標攻擊后,模型精度有11%,誤分類率高達89%,成功攻擊的對抗樣本的預測類別的平均置信度(ACAC)為 0.721933,成功攻擊的對抗樣本的真實類別的平均置信度(ACTC)為 0.05756182,同時給出了生成的對抗樣本與原始樣本的零范數距離、二范數距離和無窮范數距離,平均每個對抗樣本與原始樣本間的結構相似性為0.5708779。

      對抗性防御

      NaturalAdversarialDefense(NAD)是一種簡單有效的對抗樣本防御方法,使用對抗訓練的方式,在模型訓練的過程中構建對抗樣本,并將對抗樣本與原始樣本混合,一起訓練模型。隨著訓練次數的增加,模型在訓練的過程中提升對于對抗樣本的魯棒性。NAD算法使用FGSM作為攻擊算法,構建對抗樣本。

      防御實現

      調用MindArmour提供的NAD防御接口(NaturalAdversarialDefense)。

      from mindarmour.adv_robustness.defenses import NaturalAdversarialDefense # defense net.set_train() nad = NaturalAdversarialDefense(net, loss_fn=loss, optimizer=opt, bounds=(0.0, 1.0), eps=0.3) nad.batch_defense(test_inputs, test_labels, batch_size=32, epochs=10) # get accuracy of test data on defensed model net.set_train(False) test_logits = net(Tensor(test_inputs)).asnumpy() tmp = np.argmax(test_logits, axis=1) == np.argmax(test_labels, axis=1) accuracy = np.mean(tmp) LOGGER.info(TAG, 'accuracy of TEST data on defensed model is : %s', accuracy) # get accuracy of adv data on defensed model adv_logits = net(Tensor(adv_data)).asnumpy() adv_proba = softmax(adv_logits, axis=1) tmp = np.argmax(adv_proba, axis=1) == np.argmax(test_labels, axis=1) accuracy_adv = np.mean(tmp) attack_evaluate = AttackEvaluate(test_inputs.transpose(0, 2, 3, 1), test_labels, adv_data.transpose(0, 2, 3, 1), adv_proba) LOGGER.info(TAG, 'accuracy of adv data on defensed model is : %s', np.mean(accuracy_adv)) LOGGER.info(TAG, 'defense mis-classification rate of adversaries is : %s', attack_evaluate.mis_classification_rate()) LOGGER.info(TAG, 'The average confidence of adversarial class is : %s', attack_evaluate.avg_conf_adv_class()) LOGGER.info(TAG, 'The average confidence of true class is : %s', attack_evaluate.avg_conf_true_class())

      在CPU上跑起來了,我已經聽到了風扇的聲音!

      每次跑深度學習模型,都能夠聽見散熱扇呼嘯~

      數秒后,風扇聲音降低,準備查看結果。

      防御效果

      accuracy of TEST data on defensed model is : 0.981270 accuracy of adv data on defensed model is : 0.813602 defense mis-classification rate of adversaries is : 0.186398 The average confidence of adversarial class is : 0.653031 The average confidence of true class is : 0.184980

      使用NAD進行對抗樣本防御后,模型對于對抗樣本的誤分類率降至18%,模型有效地防御了對抗樣本。同時,模型對于原來測試數據集的分類精度達98%。

      與官網數據對比:

      accuracy of TEST data on defensed model is : 0.974259 accuracy of adv data on defensed model is : 0.856370 defense mis-classification rate of adversaries is : 0.143629 The average confidence of adversarial class is : 0.616670 The average confidence of true class is : 0.177374

      使用NAD進行對抗樣本防御后,模型對于對抗樣本的誤分類率從95%降至14%,模型有效地防御了對抗樣本。同時,模型對于原來測試數據集的分類精度達97%。

      開源代碼

      親愛的朋友,我已將本文中MindArmour的實操代碼開源到gitee,代碼已經在CPU上調試通過,歡迎大家下載使用,親手調試后會有更加深入的理解。

      鏈接:MindSporeArmour: Show details of how to use MindSpore Armour.

      MindSpore 機器學習

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel怎么使用VBA代碼自動生成三維餅圖?
      下一篇:進銷存軟件
      相關文章
      亚洲国产精品网站在线播放 | 亚洲AV无码乱码在线观看牲色| 亚洲AV无码专区在线电影成人| 国产亚洲视频在线播放大全| 亚洲黄网站wwwwww| 亚洲伦理一二三四| 亚洲一区视频在线播放| 亚洲伦理中文字幕| 久久亚洲AV无码精品色午夜麻| 在线观看亚洲免费视频| 亚洲国产精品无码久久98| 久久精品国产亚洲AV天海翼| 亚洲免费电影网站| 亚洲一区二区三区高清不卡| 亚洲av无码一区二区乱子伦as| 国产精品亚洲一区二区三区 | 久久亚洲一区二区| 精品亚洲麻豆1区2区3区| 亚洲高清日韩精品第一区| 亚洲国产成a人v在线| 国产成人精品日本亚洲专| 亚洲日韩国产二区无码| 亚洲精品福利在线观看| 亚洲av无码国产精品色午夜字幕| 午夜影视日本亚洲欧洲精品一区 | 久久久久亚洲精品日久生情| 亚洲女人初试黑人巨高清| 亚洲成a人片在线观看中文动漫| 国产成人亚洲午夜电影| 亚洲伊人成无码综合网 | 久久亚洲国产视频| 亚洲成人免费在线观看| 亚洲色偷偷综合亚洲AV伊人蜜桃| 久久亚洲精品无码网站| 亚洲精品综合久久| vvvv99日韩精品亚洲| 亚洲av无码一区二区三区四区| 亚洲精品成人久久久| 亚洲国产精品VA在线观看麻豆| 亚洲日韩一页精品发布| 亚洲一级特黄大片无码毛片|