Liu/attack_nomal/main.py

99 lines
3.3 KiB
Python
Raw Normal View History

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import keras
from data_load import data_format
# 加载数据集
X_train, X_test, Y_train, Y_test = data_format('data/archive/PowerQualityDistributionDataset1.csv')
# 设置随机种子以确保重现性
np.random.seed(7)
np.random.shuffle(X_test)
np.random.seed(7)
np.random.shuffle(Y_test)
tf.random.set_seed(7)
# 加载训练好的模型
model = keras.models.load_model('model_nomal')
# 使用测试集评估模型的初始准确率
loss, accuracy = model.evaluate(X_test, Y_test)
print("Test original accuracy:", accuracy)
# 定义损失函数
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
# 将测试数据转换为TensorFlow张量
X_test_tensor = tf.convert_to_tensor(X_test, dtype=tf.float64)
Y_test_tensor = tf.convert_to_tensor(Y_test, dtype=tf.int32)
# 用于存储不同gamma值下的准确率
accuracy_per_gamma = {}
# 遍历不同的gamma值
for gamma in [0.05, 0.1, 0.2, 0.4]:
# 使用GradientTape计算梯度
with tf.GradientTape() as tape:
tape.watch(X_test_tensor)
predictions = model(X_test_tensor)
loss = loss_fn(Y_test_tensor, predictions)
# 计算关于输入的梯度
gradients = tape.gradient(loss, X_test_tensor)
# 平坦化梯度以便进行处理
flattened_gradients = tf.reshape(gradients, [-1])
# 选择最大的γ * |X|个梯度
num_gradients_to_select = int(gamma * tf.size(flattened_gradients, out_type=tf.dtypes.float32))
top_gradients_indices = tf.argsort(flattened_gradients, direction='DESCENDING')[:num_gradients_to_select]
# 创建新的梯度张量,初始值为原始梯度
updated_gradients = tf.identity(flattened_gradients)
# 创建布尔掩码,用于选择特定梯度
mask = tf.ones_like(updated_gradients, dtype=bool)
mask = tf.tensor_scatter_nd_update(mask, tf.expand_dims(top_gradients_indices, 1), tf.zeros_like(top_gradients_indices, dtype=bool))
# 应用掩码更新梯度
updated_gradients = tf.where(mask, tf.zeros_like(updated_gradients), updated_gradients)
# 将梯度恢复到原始形状
updated_gradients = tf.reshape(updated_gradients, tf.shape(gradients))
# 用于存储不同学习率下的准确率
accuracy_list = []
# 遍历不同的学习率
for learning_rate in [0.1, 0.2, 0.3, 0.4, 0.5]:
# 应用学习率到梯度
scaled_gradients = (learning_rate * 700) * updated_gradients
# 更新X_test_tensor
X_train_updated = tf.add(X_test_tensor, scaled_gradients)
X_train_updated = X_train_updated.numpy()
# 评估更新后的模型
loss, accuracy = model.evaluate(X_train_updated, Y_test)
print(f"Accuracy gamma: {gamma},learning:{learning_rate}", accuracy)
# 记录准确率
accuracy_list.append(accuracy)
# 存储每个gamma值下的准确率
accuracy_per_gamma[gamma] = accuracy_list
# 定义学习率和gamma值
learning_rates = [0.1, 0.2, 0.3, 0.4, 0.5]
gammas = [0.05, 0.1, 0.2, 0.4]
# 创建并绘制结果图
plt.figure(figsize=(10, 6))
for gamma in gammas:
plt.plot(learning_rates, accuracy_per_gamma[gamma], marker='o', label=f'Gamma={gamma}')
plt.title('Accuracy vs Learning Rate for Different Gammas')
plt.xlabel('Learning Rate')
plt.ylabel('Accuracy')
plt.legend()
plt.show()