def _deepfoolx(model, x, epochs, eta, clip_min, clip_max, min_prob):
y0 = tf.stop_gradient(model(x))
y0 = tf.reshape(y0, [-1])
k0 = tf.argmax(y0)
ydim = y0.get_shape().as_list()[0]
xdim = x.get_shape().as_list()[1:]
xflat = _prod(xdim)
def _cond(i, z):
xadv = tf.clip_by_value(x + z*(1+eta), clip_min, clip_max)
y = tf.reshape(model(xadv), [-1])
p = tf.reduce_max(y)
k = tf.argmax(y)
return tf.logical_and(tf.less(i, epochs),
tf.logical_or(tf.equal(k0, k),
tf.less(p, min_prob)))
def _body(i, z):
xadv = tf.clip_by_value(x + z*(1+eta), clip_min, clip_max)
y = tf.reshape(model(xadv), [-1])
gs = [tf.reshape(tf.gradients(y[i], xadv)[0], [-1])
for i in range(ydim)]
g = tf.stack(gs, axis=0)
yk, yo = y[k0], tf.concat((y[:k0], y[(k0+1):]), axis=0)
gk, go = g[k0], tf.concat((g[:k0], g[(k0+1):]), axis=0)
yo.set_shape(ydim - 1)
go.set_shape([ydim - 1, xflat])
a = tf.abs(yo - yk)
b = go - gk
c = tf.norm(b, axis=1)
score = a / c
ind = tf.argmin(score)
si, bi = score[ind], b[ind]
dx = si * bi
dx = tf.reshape(dx, [-1] + xdim)
return i+1, z+dx
_, noise = tf.while_loop(_cond, _body, [0, tf.zeros_like(x)],
name='_deepfoolx_impl', back_prop=False)
return noise
评论列表
文章目录