逆向工程以查找 python 库中给定操作的执行位置
Reverse Engineering to find where a given operation in a python library is executed
https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/notebooks/expectation_over_transformation_classification_rotation.ipynb 上有一个有趣的笔记本,可以在图像也旋转时执行对抗性攻击。
但是,我想编辑转换以包括 其他转换。
从代码中可以看出,为旋转导入了以下class:
from art.preprocessing.expectation_over_transformation import EoTImageRotationTensorFlow
eot_rotation = EoTImageRotationTensorFlow(nb_samples=eot_samples,
clip_values=clip_values,
angles=eot_angle)
然后,攻击使用有关 EOTImageRotationTensorflow class 的信息来攻击图像
classifier_eot = TensorFlowV2Classifier(model=model,
nb_classes=nb_classes,
loss_object=loss,
preprocessing=preprocessing,
preprocessing_defences=[eot_rotation],
clip_values=clip_values,
input_shape=input_shape)
attack_eot = ProjectedGradientDescent(estimator=classifier_eot,
eps=eps,
max_iter=num_steps,
eps_step=eps_step,
targeted=True)
当我在/usr/local/lib/python3.8/dist-packages/art/preprocessing/expectation_over_transformation/image_rotation/tensorflow.py中检查这样一个class时,我看到有一个执行旋转的函数。
def _transform(
self, x: "tf.Tensor", y: Optional["tf.Tensor"], **kwargs
) -> Tuple["tf.Tensor", Optional["tf.Tensor"]]:
"""
Transformation of an input image and its label by randomly sampled rotation.
:param x: Input samples.
:param y: Label of the samples `x`.
:return: Transformed samples and labels.
"""
import tensorflow as tf # lgtm [py/repeated-import]
import tensorflow_addons as tfa
# pylint: disable=E1120,E1123
angles = tf.random.uniform(shape=(), minval=self.angles_range[0], maxval=self.angles_range[1])
angles = angles / 360.0 * 2.0 * np.pi
x_preprocess = tfa.image.rotate(images=x, angles=angles, interpolation="NEAREST", name=None)
x_preprocess = tf.clip_by_value(
t=x_preprocess, clip_value_min=-self.clip_values[0], clip_value_max=self.clip_values[1], name=None
)
return x_preprocess, y
理论上,我可以简单地更改 _transform() 函数来进行我想要的转换。
但是,这样的功能不是用来旋转图像的,我什至可以删除重新运行算法没有任何反应的功能。 我什至创建了一个 python for 循环来打开艺术库中的所有 python 文件 并搜索关键字 rotate 但甚至 评论这些条目算法运行没有问题
因此,我相信旋转发生在某个地方,我根本不知道它在哪里。。这是我进行逆向工程并找到执行旋转的确切位置的任何方式吗?
一种选择是在函数中添加一个故意的错误,例如 0/0
(除以零)。这会告诉你它是否被调用,以及来自哪里...
https://github.com/Trusted-AI/adversarial-robustness-toolbox/blob/main/notebooks/expectation_over_transformation_classification_rotation.ipynb 上有一个有趣的笔记本,可以在图像也旋转时执行对抗性攻击。
但是,我想编辑转换以包括 其他转换。
从代码中可以看出,为旋转导入了以下class:
from art.preprocessing.expectation_over_transformation import EoTImageRotationTensorFlow
eot_rotation = EoTImageRotationTensorFlow(nb_samples=eot_samples,
clip_values=clip_values,
angles=eot_angle)
然后,攻击使用有关 EOTImageRotationTensorflow class 的信息来攻击图像
classifier_eot = TensorFlowV2Classifier(model=model,
nb_classes=nb_classes,
loss_object=loss,
preprocessing=preprocessing,
preprocessing_defences=[eot_rotation],
clip_values=clip_values,
input_shape=input_shape)
attack_eot = ProjectedGradientDescent(estimator=classifier_eot,
eps=eps,
max_iter=num_steps,
eps_step=eps_step,
targeted=True)
当我在/usr/local/lib/python3.8/dist-packages/art/preprocessing/expectation_over_transformation/image_rotation/tensorflow.py中检查这样一个class时,我看到有一个执行旋转的函数。
def _transform(
self, x: "tf.Tensor", y: Optional["tf.Tensor"], **kwargs
) -> Tuple["tf.Tensor", Optional["tf.Tensor"]]:
"""
Transformation of an input image and its label by randomly sampled rotation.
:param x: Input samples.
:param y: Label of the samples `x`.
:return: Transformed samples and labels.
"""
import tensorflow as tf # lgtm [py/repeated-import]
import tensorflow_addons as tfa
# pylint: disable=E1120,E1123
angles = tf.random.uniform(shape=(), minval=self.angles_range[0], maxval=self.angles_range[1])
angles = angles / 360.0 * 2.0 * np.pi
x_preprocess = tfa.image.rotate(images=x, angles=angles, interpolation="NEAREST", name=None)
x_preprocess = tf.clip_by_value(
t=x_preprocess, clip_value_min=-self.clip_values[0], clip_value_max=self.clip_values[1], name=None
)
return x_preprocess, y
理论上,我可以简单地更改 _transform() 函数来进行我想要的转换。
但是,这样的功能不是用来旋转图像的,我什至可以删除重新运行算法没有任何反应的功能。 我什至创建了一个 python for 循环来打开艺术库中的所有 python 文件 并搜索关键字 rotate 但甚至 评论这些条目算法运行没有问题
因此,我相信旋转发生在某个地方,我根本不知道它在哪里。。这是我进行逆向工程并找到执行旋转的确切位置的任何方式吗?
一种选择是在函数中添加一个故意的错误,例如 0/0
(除以零)。这会告诉你它是否被调用,以及来自哪里...