- 浏览: 72072 次
- 性别:
- 来自: 北京
文章分类
最新评论
Kaggle首席技术官发布——(Kaggle)NIPS 2017对抗学习挑战赛起步指南
原文链接:http://click.aliyun.com/m/26854/
摘要: 本文是一个kaggle数据处理的入门介绍,由Kaggle首席技术官Ben简单介绍以下2017年的NIPS 对抗学习竞赛数据的处理,用一个具体的代码实例介绍了如何生成目标对抗图像与非目标对抗图像,将对抗图像送入原先的分类器中,可以看到结果与原图大相径庭。
首发地址: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("Here's 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, don't they? It's 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, don't they? It's 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,译者:海棠,审阅:李烽
原文链接:http://click.aliyun.com/m/26854/
摘要: 本文是一个kaggle数据处理的入门介绍,由Kaggle首席技术官Ben简单介绍以下2017年的NIPS 对抗学习竞赛数据的处理,用一个具体的代码实例介绍了如何生成目标对抗图像与非目标对抗图像,将对抗图像送入原先的分类器中,可以看到结果与原图大相径庭。
首发地址: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("Here's 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, don't they? It's 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, don't they? It's 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,译者:海棠,审阅:李烽
原文链接:http://click.aliyun.com/m/26854/
相关推荐
基于Kaggle的经典AI项目——数据集: 含有如下字段 MSZoning: String, // 房屋类型:农用,商用等 LotFrontage: String, // 距离街道的距离 LotArea: String, // 房屋的面积
在本项目中,我们将深入探讨如何使用Python进行深度学习,特别是在Kaggle的肺炎目标检测比赛中。这个压缩包包含了三个关键文件:`数据处理.ipynb`、`数据准备.ipynb`和`.ipynb_checkpoints`。这些IPython笔记本文件...
"机器学习、深度学习、kaggle、天池面试指南"这个主题覆盖了多个关键的知识点,下面将对这些核心概念进行详细的阐述。 首先,机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习和改进,而无需明确编程...
大数据竞赛平台——Kaggle 入门1 Kaggle 是一个数据分析的竞赛平台,网址:https://www.kaggle.com/。企业或者研究者可以将数据、问题描述、期望的指标发布到 Kaggle 上,以竞赛的形式向广大的数据科学家征集解决...
【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于 Python 实现的面部情绪识别-数据源自kaggle比赛
Titanic数据集——Kaggle上下载
标题“Kaggle入门——猫狗大战”指向的是一个数据科学竞赛项目,旨在区分猫和狗的图像。在这个项目中,参赛者需要构建一个深度学习模型来识别图像中的动物是猫还是狗。描述中提到,这个例子是基于AlexNet网络进行...
Python-Kaggle官方API是数据科学社区Kaggle提供的一项功能,它允许用户通过编程方式与Kaggle平台进行交互,实现数据集的便捷上传和下载。这一API特别适用于参与Kaggle比赛的用户,他们可以高效地管理比赛所需的数据...
KAGGLE竞赛官方网站上下载下来的数据集,最全kaggle泰坦尼克数据集。欢迎下载。 正版数据集含代码使用,避免官网下载注册的麻烦。正版数据集含代码使用,避免官网下载注册的麻烦。正版数据集含代码使用,避免官网下载...
- **背景与目标**:该挑战赛旨在略微修改源图像,使其被未知的机器学习分类器误分类。这种类型的攻击有助于理解模型的鲁棒性。 8. **NIPS2017: Targeted Adversarial Attack** - **背景与目标**:目标是通过略微...
深度学习是一种人工智能领域的技术,它通过模仿人脑的工作方式来学习模式,特别是在处理大量数据时表现出色。在图像识别领域,深度学习已经成为一种强大的工具,能够帮助计算机理解并分类图像内容。"Kaggle-猫狗样本...
Kaggle入门——使用scikit-learn解决DigitRecognition的工程文件,详细解释请移步本人博客搜索该文章:http://blog.csdn.net/u012162613。如有错误请指正
本数据集是Kaggle上的经典比赛——“泰坦尼克号”(Titanic)生存预测挑战。该比赛的目标是根据乘客的信息,预测他们在泰坦尼克号沉船事故中是否幸存。 【描述】:这个数据集是Kaggle官方提供的,通常需要一定积分...
这个比赛当时是在jupyter notebook上编程的,这篇博客是之前自己整理的代码和流程记录。 但是很可惜,notebook转markdown显示效果很不好,下面给出目录和代码。 # coding: utf-8 # # 数据分析 ...
这一特殊挑战非常适合希望开始使用自然语言处理的数据科学家。比赛数据集并不太大,即使您没有太多的个人计算能力,您也可以在我们免费、无需设置、名为Kaggle Notebooks的 Jupyter Notebooks 环境中完成所有工作。 ...
在本教程中,我们将深入探讨如何使用R语言参与Kaggle上的泰坦尼克号(Titanic)数据竞赛。泰坦尼克号数据集是机器学习初学者的经典案例,它包含了乘客的一些基本信息,如年龄、性别、船票等级等,任务是预测乘客在沉船...
本次实战Kaggle比赛的主题是“房价预测”,旨在利用统计学和机器学习技术预测房屋的价格。这个数据集提供了一个宝贵的实践机会,帮助我们深入理解如何处理实际的预测问题。 数据集通常包含多个特征,如地理位置、...
特征提取是机器学习模型构建过程中的关键环节,它涉及到从原始数据中提取信息,并将其转化为模型能够理解和使用的特征。这些特征的好坏直接关系到模型性能的优劣。在数据科学竞赛平台Kaggle,以及在日常工作中,高效...
Titanic生存概率预测是Kaggle平台上的经典竞赛项目,泰坦尼克号成员存活的数据集非常适合新手开始作为机器学习项目和Kaggle竞赛的练手。我们将在该项目中探索具备何种特征的人在此次海滩中幸存的几率更高,并通过...
【标题】:Kaggle入门赛——泰坦尼克号(Tatanic)数据分析与预测:84.21%准确率提升指南 【描述】:Kaggle是全球知名的机器学习竞赛平台,其中的“泰坦尼克号”(Tatanic)数据集是初学者非常受欢迎的入门赛。这个...