Предположим, у меня есть тензор потока, реализующий модель классификации:
x = tf.placeholder(tf.float32, shape)
# [insert mdoel here]
logits = tf.layers.dense(inputs=..., units=num_labels, activation=None)
Теперь предположим, что я хочу оптимизировать входные данные с помощью оптимизатора Адама.
Например, чтобы найти целевые альтернативные примеры, я бы объявил переменную для оптимизации (инициализированную в некотором образце во время выполнения), указал целевой класс, отличный от истинного класса, вычислил кросс-энтропию и минимизировал ее.
var_to_optimize = tf.Variable(np.zeros(shape, dtype=np.float32))
tgt_label = tf.placeholder(tf.float32, shape=[num_labels])
xent = tf.nn.softmax_cross_entropy_with_logits_v2(labels=tgt_label, logits=logits)
Затем я хотел бы свести к минимуму кросс-энтропию, возмущая входы
optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)
training_op = optimizer.minimize(xent, var_list=[var_to_optimize])
Однако xent требует, чтобы я передавал значения для входного заполнителя x. Как связать логи модели с помощью var_to_optimize?
Всего 1 ответ
Вопрос, на который я пытался ответить, заключается в следующем: как можно создать две отдельные процедуры оптимизации на одном графике тензорного потока?
В руководстве по следующей ссылке описывается, как это сделать: определяется тензорный график, который обучает нейронную сеть, а затем добавляет случайный шум (равномерный по выборкам), оптимизированный, чтобы вызвать ошибочную классификацию большинства выборок.
https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/12_Adversarial_Noise_MNIST.ipynb