zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Kaggle首席技术官发布——(Kaggle)NIPS 2017对抗学习挑战赛起步指南

技术学习 指南 发布 2017 对抗 挑战赛 首席
2023-09-11 14:20:07 时间

首发地址:https://yq.aliyun.com/articles/126898


更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud

NIPS全称为神经信息处理系统大会,是关于机器学习领域的顶级会议,也是令众多学者振奋的学术盛会。该会议固定在每年的12月举行,由NIPS基金会主办。 但今年年底举办的NIPS将新增一个议程,NIPS 2017Competition Track,从23个候选提案中选择了五个数据驱动的比赛项目。近日谷歌大脑研究员Ian Goodfellow在社媒平台中强烈推荐了由他组织的Adversarial Attacks and Defences(对抗攻击防御)比赛。为什么组织这样一个比赛呢,这是因为当前图像分类器非常容易被精心设计的对抗图像所欺骗,这些图像给原始图像及正确分类图像添加了微小变化,这些图像几乎不容易被人眼察觉,但会导致图像分类器错误地对错误的分类充满自信。

这项比赛是在kaggle平台上进行,关于kaggle竞赛的介绍与相关竞赛技巧可以参考博主的以下几篇博客:

Kaggle老手领你入门梯度提升——梯度提升两三事

干货|大神教你如何参加kaggle比赛——根据CT扫描图预测肺癌

Kaggle官网上有三个相关的对抗学习挑战,如图1所示

下面具体来说下这三个相关比赛的侧重点:

1、Non Targeted Adversarial Attack,竞赛者所提交的系统需要对任何类别的图像进行处理,使得某个通用机器学习分类器无法识别。 
2、Targeted Adversarial Attack,竞赛者所提交的系统需要对给定的图像进行处理,使得某个通用机器学习分类器无法识别。 
3、Defense Against Adversarial Attack,竞赛者需要构建一个机器学习分类器,拥有足够的鲁棒性使之能正确鉴别对抗性的图像。 

根据前两个挑战的对抗性攻击,防御挑战的得分取决于分类器的好坏,另外前两个挑战的得分是基于在第三个挑战中对抗性攻击的伎俩有多好。

21a34e36727ac2ad9ff700c60b8ff65587a6a03d

 下面,我们将通过一些代码示例来生成非目标和目标的对抗图像,然后看看Inception V3模型是如何对它们进行分类。关于googleNet Inception V3介绍大家可以上网找找相关教程或博客,这里就不一一讲述。

注:下面许多的代码是基于Alex例子,基于tensorflow实现。

开始时,我们导入一些必要的库并定义一些参数/有用的函数

import os

from cleverhans.attacks import FastGradientMethod

from io import BytesIO

import IPython.display

import numpy as np

import pandas as pd

from PIL import Image

from scipy.misc import imread

from scipy.misc import imsave

import tensorflow as tf

from tensorflow.contrib.slim.nets import inception

slim = tf.contrib.slim

tensorflow_master = ""

checkpoint_path = "../input/inception-v3/inception_v3.ckpt"

input_dir = "../input/nips-2017-adversarial-learning-development-set/images/"

max_epsilon = 16.0

image_width = 299

image_height = 299

batch_size = 16

eps = 2.0 * max_epsilon / 255.0

batch_shape = [batch_size, image_height, image_width, 3]

num_classes = 1001

def load_images(input_dir, batch_shape):

 images = np.zeros(batch_shape)

 filenames = []

 idx = 0

 batch_size = batch_shape[0]

 for filepath in sorted(tf.gfile.Glob(os.path.join(input_dir, *.png))):

 with tf.gfile.Open(filepath, "rb") as f:

 images[idx, :, :, :] = imread(f, mode=RGB).astype(np.float)*2.0/255.0 - 1.0

 filenames.append(os.path.basename(filepath))

 idx += 1

 if idx == batch_size:

 yield filenames, images

 filenames = []

 images = np.zeros(batch_shape)

 idx = 0

 if idx 0:

 yield filenames, images

def show_image(a, fmt=png):

 a = np.uint8((a+1.0)/2.0*255.0)

 f = BytesIO()

 Image.fromarray(a).save(f, fmt)

 IPython.display.display(IPython.display.Image(data=f.getvalue()))

class InceptionModel(object):

 def __init__(self, num_classes):

 self.num_classes = num_classes

 self.built = False

 def __call__(self, x_input):

 """Constructs model and return probabilities for given input."""

 reuse = True if self.built else None

 with slim.arg_scope(inception.inception_v3_arg_scope()):

 _, end_points = inception.inception_v3(

 x_input, num_classes=self.num_classes, is_training=False,

 reuse=reuse)

 self.built = True

 output = end_points[Predictions]

 probs = output.op.inputs[0]

 return probs

接下来,我们将在元数据中加载一批图像。

categories = pd.read_csv("../input/nips-2017-adversarial-learning-development-set/categories.csv")

image_classes = pd.read_csv("../input/nips-2017-adversarial-learning-development-set/images.csv")

image_iterator = load_images(input_dir, batch_shape)

# get first batch of images

filenames, images = next(image_iterator)

image_metadata = pd.DataFrame({"ImageId": [f[:-4] for f in filenames]}).merge(image_classes,

 on="ImageId")

true_classes = image_metadata["TrueLabel"].tolist()

target_classes = true_labels = image_metadata["TargetClass"].tolist()

true_classes_names = (pd.DataFrame({"CategoryId": true_classes})

 .merge(categories, on="CategoryId")["CategoryName"].tolist())

target_classes_names = (pd.DataFrame({"CategoryId": target_classes})

 .merge(categories, on="CategoryId")["CategoryName"].tolist())

print("Heres an example of one of the images in the development set")

show_image(images[0])

下面是开发集中的一个图像示例,熊猫是不是很可爱?

6e24caf7c3f6ccf673acdf87815f21b4dc218536

生成无标签对抗图像

以下代码在tensorflow上运行并生成非目标对抗图像,这些非目标图像是为了欺骗原始分类器而设计的,但这些图像没有固定的类别。

tf.logging.set_verbosity(tf.logging.INFO)

with tf.Graph().as_default():

 x_input = tf.placeholder(tf.float32, shape=batch_shape)

 model = InceptionModel(num_classes)

 fgsm = FastGradientMethod(model)

 x_adv = fgsm.generate(x_input, eps=eps, clip_min=-1., clip_max=1.)

 saver = tf.train.Saver(slim.get_model_variables())

 session_creator = tf.train.ChiefSessionCreator(

 scaffold=tf.train.Scaffold(saver=saver),

 checkpoint_filename_with_path=checkpoint_path,

 master=tensorflow_master)

 with tf.train.MonitoredSession(session_creator=session_creator) as sess:

 nontargeted_images = sess.run(x_adv, feed_dict={x_input: images})

print("The original image is on the left, and the nontargeted adversarial image is on the right. They look very similar, dont they? Its very clear both are gondolas")

show_image(np.concatenate([images[1], nontargeted_images[1]], axis=1))

INFO:tensorflow:Restoring parameters from ../input/inception-v3/inception_v3.ckpt

左边是原始图像,右边是非目标对抗图像。它们看起来很相似,很明显都是一条小船。

d983a119799fccd4d47358a61d26aeb5957a1ecb

生成有标签对抗图像

以下代码在tensorflow上运行并生成目标对抗图像,在每种情况下,都有一个特定的目标类别,这些类别是试图欺骗图像分类器输出的。

注意:该代码目前不工作,它只是产生对抗图像,并且这些图片而没有正确的目标。

all_images_target_class = {image_metadata["ImageId"][i]+".png": image_metadata["TargetClass"][i]

 for i in image_metadata.index}

with tf.Graph().as_default():

 x_input = tf.placeholder(tf.float32, shape=batch_shape)

 with slim.arg_scope(inception.inception_v3_arg_scope()):

 logits, end_points = inception.inception_v3(

 x_input, num_classes=num_classes, is_training=False)

 target_class_input = tf.placeholder(tf.int32, shape=[batch_size])

 one_hot_target_class = tf.one_hot(target_class_input, num_classes)

 cross_entropy = tf.losses.softmax_cross_entropy(one_hot_target_class,

 logits,

 label_smoothing=0.1,

 weights=1.0)

 cross_entropy += tf.losses.softmax_cross_entropy(one_hot_target_class,

 end_points[AuxLogits],

 label_smoothing=0.1,

 weights=0.4)

 x_adv = x_input - eps * tf.sign(tf.gradients(cross_entropy, x_input)[0])

 x_adv = tf.clip_by_value(x_adv, -1.0, 1.0)

 saver = tf.train.Saver(slim.get_model_variables())

 session_creator = tf.train.ChiefSessionCreator(

 scaffold=tf.train.Scaffold(saver=saver),

 checkpoint_filename_with_path=checkpoint_path,

 master=tensorflow_master)

 with tf.train.MonitoredSession(session_creator=session_creator) as sess:

 target_class_for_batch = ([all_images_target_class[n] for n in filenames]

 + [0] * (batch_size - len(filenames)))

 targeted_images = sess.run(x_adv,

 feed_dict={x_input: images,

 target_class_input: target_class_for_batch})

print("The original image is on the left, and the targeted adversarial image is on the right. Again, they look very similar, dont they? Its very clear both are butterflies")

show_image(np.concatenate([images[2], targeted_images[2]], axis=1))

INFO:tensorflow:Restoring parameters from ../input/inception-v3/inception_v3.ckpt

左边是原始图像,右边是目标对抗图像。同样可以发现它们看起来很相似,很明显都是蝴蝶。

ae81b393060b2a5ae4a02ea6021ba2f9ca1202f2

分类对抗图像

接下来,我们将看到,当把这些生成的对抗图像送入原始分类器运行时会发生些什么呢,答案是目标对抗图像与原始图像的类别判定完全不同。

with tf.Graph().as_default():

 x_input = tf.placeholder(tf.float32, shape=batch_shape)

 with slim.arg_scope(inception.inception_v3_arg_scope()):

 _, end_points = inception.inception_v3(x_input, num_classes=num_classes, is_training=False)

 predicted_labels = tf.argmax(end_points[Predictions], 1)

 saver = tf.train.Saver(slim.get_model_variables())

 session_creator = tf.train.ChiefSessionCreator(

 scaffold=tf.train.Scaffold(saver=saver),

 checkpoint_filename_with_path=checkpoint_path,

 master=tensorflow_master)

 with tf.train.MonitoredSession(session_creator=session_creator) as sess:

 predicted_classes = sess.run(predicted_labels, feed_dict={x_input: images})

 predicted_nontargeted_classes = sess.run(predicted_labels, feed_dict={x_input: nontargeted_images})

 predicted_targeted_classes = sess.run(predicted_labels, feed_dict={x_input: targeted_images})

predicted_classes_names = (pd.DataFrame({"CategoryId": predicted_classes})

 .merge(categories, on="CategoryId")["CategoryName"].tolist())

predicted_nontargeted_classes_names = (pd.DataFrame({"CategoryId": predicted_nontargeted_classes})

 .merge(categories, on="CategoryId")["CategoryName"].tolist())

predicted_targeted_classes_names = (pd.DataFrame({"CategoryId": predicted_targeted_classes})

 .merge(categories, on="CategoryId")["CategoryName"].tolist())

INFO:tensorflow:Restoring parameters from ../input/inception-v3/inception_v3.ckpt

下面我们将展示这个批次中的所有图像以及它们的分类的类别。每个集合中的左图是原始图像,中间图是非目标对抗形象,右图是目标对抗图像。

for i in range(len(images)):

 print("UNMODIFIED IMAGE (left)",

 "\n\tPredicted class:", predicted_classes_names[i],

 "\n\tTrue class: ", true_classes_names[i])

 print("NONTARGETED ADVERSARIAL IMAGE (center)",

 "\n\tPredicted class:", predicted_nontargeted_classes_names[i])

 print("TARGETED ADVERSARIAL IMAGE (right)",

 "\n\tPredicted class:", predicted_targeted_classes_names[i],

 "\n\tTarget class: ", target_classes_names[i])

 show_image(np.concatenate([images[i], nontargeted_images[i], targeted_images[i]], axis=1))

原图(左图)

预测类别:大熊猫

真实类别:大熊猫

非目标对抗图片(中间图)

预测类别:萨摩耶犬类

目标对抗图片(右图)

预测类别:土狗

真实类别:肉饼

eb92800602fbd72a7c747a2c569444094ca99f60

原图(左图)

预测类别:小船

真实类别:小船

非目标对抗图片(中间图)

   预测类别:堤坝

目标对抗图片(右图)

预测类别:堤坝

真实类别:翅膀

5e571645baa26b5deca4bed6500cad8630a366b5

原图(左图)

预测类别:灰蝶

真实类别:灰蝶

非目标对抗图片(中间图)

   预测类别:小环蝴蝶

目标对抗图片(右图)

预测类别:小环蝴蝶

真实类别:西班牙可卡犬

b79d9aa23bb377733ff8998d5c333bc7857f52c6

原图(左图)

预测类别:灰蝶

真实类别:灰蝶

非目标对抗图片(中间图)

预测类别:河马

目标对抗图片(右图)

预测类别:河马

真实类别:啄木鸟

add1a3bbd9d559f58915acbf43f56c24442d0978

原图(左图)

预测类别:美洲黑鸭

真实类别:美洲黑鸭

非目标对抗图片(中间图)

预测类别:短尾鹦鹉

目标对抗图片(右图)

预测类别:短尾鹦鹉

真实类别:泉水

6bacc1251fca1bfb113c5f7101823bdab44ad176

原图(左图)

预测类别:短尾鹦鹉

真实类别:短尾鹦鹉

非目标对抗图片(中间图)

预测类别:篮球

目标对抗图片(右图)

预测类别:篮球

真实类别:单峰骆驼

4f2a60da42e587d07d38b095ea7c9d5e00ecfc57

原图(左图)

预测类别:球员

真实类别:球员

非目标对抗图片(中间图)

预测类别:鸵鸟

目标对抗图片(右图)

预测类别:鸵鸟

真实类别:金库

a29b1b39b10756a621ba2789f792721602c05fce

原图(左图)

预测类别:鸵鸟

真实类别:鸵鸟

非目标对抗图片(中间图)

预测类别:日晷

目标对抗图片(右图)

预测类别:日晷

真实类别:海上钻井平台

e8b79ea0ca3198133822051dfd075d87b609180f

原图(左图)

预测类别:加农炮

真实类别:加农炮

非目标对抗图片(中间图)

预测类别:虎甲虫

目标对抗图片(右图)

预测类别:虎甲虫

真实类别:特浓咖啡机

729a1a61ac901d8dc85277574645c78b0ea2caff

原图(左图)

预测类别:长角天牛

真实类别:长角天牛

非目标对抗图片(中间图)

预测类别:特浓咖啡

目标对抗图片(右图)

预测类别:特浓咖啡

真实类别:髓内钉

eac6a118765788b3386fe7e6b67a4d333cfb3bfa

原图(左图)

预测类别:特浓咖啡

真实类别:特浓咖啡

非目标对抗图片(中间图)

预测类别:淋浴帽

目标对抗图片(右图)

预测类别:淋浴帽

真实类别:滤盆

e733599f936c88b5a4fd0f20f24dae05cdba20c4

原图(左图)

预测类别:雪橇

真实类别:雪橇

非目标对抗图片(中间图)

预测类别:玫瑰果

目标对抗图片(右图)

预测类别:蜜蜂

真实类别:面包店

a211e66285f2cfb282119cba53a3a3111efbe656

原图(左图)

预测类别:大钢琴

真实类别:大钢琴

非目标对抗图片(中间图)

预测类别:书桌

目标对抗图片(右图)

预测类别:餐桌

真实类别:信箱

918452d7ad531e90c26a1633e764229be314b561

原图(左图)

预测类别:间歇喷泉

真实类别:间歇喷泉

非目标对抗图片(中间图)

预测类别:沉船

目标对抗图片(右图)

预测类别:海狸

真实类别:哈巴狗

43f7b4cccf1b1b4fdde3e337d8a33b34d1addb23

原图(左图)

预测类别:图书馆

真实类别:图书馆

非目标对抗图片(中间图)

预测类别:书店

目标对抗图片(右图)

预测类别:书店

真实类别:安全别针

baf38a228b7c8335232dd22af76aa54106c751ab

原图(左图)

预测类别:松鸭

真实类别:松鸭

非目标对抗图片(中间图)

预测类别:松鸭

目标对抗图片(右图)

预测类别:黄雀

真实类别:针鼹

901ac96bde922ad713c80a3fdb6b57ffca7a80d1

作者信息

Ben Hamner:Kaggle联合创始人与首席技术官。

6fc3a6a48252369b55117e13167a93a47ff90fe4

Linkedin:http://www.linkedin.com/in/ben-hamner-98759712/

Github: https://github.com/benhamner

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Getting Started with the NIPS 2017 Adversarial Learning Challenges》,作者:Ben Hamner,译者:海棠,审阅:李烽

文章为简译,更为详细的内容,请查看原文

翻译者: 海棠 


阿里云机器学习平台PAI论文入选国际顶会ASPLOS 2022 近日,阿里云机器学习PAI主导的论文《机器学习访存密集计算编译优化框架AStitch》入选国际顶会ASPLOS 2022,论文通过编译优化的手段来自动化地提高机器学习任务的执行效率。此次入选意味着阿里云机器学习平台PAI自研的深度学习编译优化系统达到了全球业界先进水平,获得了国际学者的认可,展现了中国机器学习系统技术创新在国际上的竞争力。
蚂蚁安全实验室斩获NeurIPS & Facebook AI联合竞赛冠军 12月10日,由国际人工智能顶会NeurIPS 与 Facebook AI联合举办的图像相似匹配竞赛ISC2021落下帷幕,本次比赛共有1635支参赛队伍参加,是今年NeurIPS会议上最具影响力的比赛之一。来自蚂蚁集团的TitanShield Team(titanshield2)以超越第二名10个百分点的成绩斩获图像表征赛道冠军。据悉,此次夺冠团队采用的技术方案是由蚂蚁集团独立自研的、“基于特征兼容自监督学习框架”的预训练模型,能够针对性地解决内容安全风控领域常见的敏感信息更迭速度快、风控模型训练不及时等问题。作为可信AI技术研究及应用中的一环,该技术上线后可降低80%的图像对抗风险,将有助
他们创造了横扫NLP的XLNet:专访CMU博士杨植麟 Transformer XL 和 XLNet 是最近自然语言处理(NLP)领域里最热的话题之一,而它们都是 CMU 博士生 戴自航、杨植麟等人的工作。今年 6 月,CMU 与谷歌大脑提出的 XLNet 在 20 个任务上超过 BERT,并在 18 个任务上取得当前最佳效果的表现。
Google I/O 李飞飞等四领域女性专家,谈机器学习的过去、现在和未来 在 Google I/O 首日的 Keynote 中,Google 公布了一系列新的硬件、应用和基础研究。自去年提出 AI First 战略,今年的大会上 Google 同样安排了不少与机器学习开发相关的内容,比如《教程 | 如何使用谷歌 Mobile Vision API 开发手机》。
44篇论文强势进击CVPR 2018,商汤科技的研究员都在做哪些研究? 机器之心走进商汤,尝试从 44 篇接收论文中找出商汤近期的主攻方向,分析公司为 3-5 年乃至更长期的发展进行了哪些战略技术储备,也观照 CVPR 会议,乃至视觉领域的关注点迁移趋势。同时我们采访了三位来自商汤入选本届 CVPR oral / spotlight 环节的论文作者,与他们谈了自己的研究,如何进行开发,以及对 CVPR 乃至 CVPR 之外整个视觉领域研究现状的看法。
Jeff Dean等三名高管齐聚谷歌 I/O 压轴论坛,多角度解读谷歌眼中的机器学习 2016 Google I/O 第三日刚刚结束了一场《机器学习:谷歌的视角》(Machine Learning:Google s Vision)活动,谷歌搜索、机器智能和 Web 工程的高级副总裁 John Giannandrea,高级员工、Google Brain 负责人 Jeff Dean,高级产品总监 Aparna Chennapragada 三位高管分别从产品、研究、开源和公司战略层面对谷歌的机器学习进行了系统讨论。
“Google只认钱!机器学习20年没进步”,CMU学者炮轰AI第一大厂 这几天,一位耿直的CMU学者Simon DeDeo,在在Twitter上猛烈炮轰Google Brain团队,对营利性机器学习行业展开嘲讽。(其实也顺便无情抨击了Facebook的研究机构。)
OpenAI首届迁移学习竞赛,南大阿里团队夺冠,中科院第二 OpenAI举行的首届迁移学习竞赛Retro Contest结束,各路AI玩《刺猬索尼克》游戏,在提交结果的229支队伍中,中国的团队获得了冠亚军。