我正试图创建一个对cnn的攻击,下面的例子是[here][1]。https://www.anishathalye.com/2017/07/25/synthesizing-adversarial-examples/
他们的笔记本在我的系统上运行,没有任何问题。你知道吗
我想攻击我自己的网络,而不是加载Inception。为了简单起见,我先在同一个笔记本上训练网络:
tf.reset_default_graph()
x = tf.placeholder(tf.float32, shape=(None, *img_shape), name='input')
y = tf.placeholder(tf.float32, shape=(None, total_labels), name='output')
keep_prob = tf.placeholder(tf.float32, name='keep_prob')
logits = conv_net(x, keep_prob, total_labels) # some standard cnn architecture is used
cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y)
cost = tf.reduce_mean(cross_entropy)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
到目前为止还不错。网络是用
sess.run(optimizer, feed_dict={x: feature_batch, y: label_batch, keep_prob: keep_probability})
现在我想通过在图像上训练覆盖来创建攻击:
overlay = tf.Variable(tf.zeros(1, *img_shape), name='Overlay')
assign_op = tf.assign(overlay, x)
loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y)
optim = tf.train.GradientDescentOptimizer(0.0001).minimize(loss, var_list=[overlay])
我的理解是,上面的代码将可训练变量overlay
分配给我的输入占位符x
,作为我的网络的输入,然后根据网络预测计算损失,优化器将损失最小化。通过传递var_list
,我告诉优化器“嘿,你在训练overlay
,你看不清楚。”
但是,这不起作用并引发以下错误:
ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables ["<tf.Variable 'Overlay:0' shape=(1, 55, 65, 1) dtype=float32_ref>"] and loss Tensor("softmax_cross_entropy_with_logits_3/Reshape_2:0", shape=(?,), dtype=float32).
很明显,我在这里遗漏了一些步骤/理解。我没有看到源笔记本做任何其他事情。你知道吗
占位符不是可训练的,渐变不会通过占位符传播。如果我是你,我会尝试下一个工作流程:通过varaible将数据传输到网络。你知道吗
相关问题 更多 >
编程相关推荐