在参考了百度上的两篇博客后, 一共用这两种方式实现了梯度反转
1. 版本一:
import tensorflow as tf
from tensorflow import keras as K
# 梯度反转:版本1, 通过手动计算个部分的梯度, 然后手动修改实现
# x = tf.placeholder(dtype=tf.float32, shape=(1, 1)) # 不知道为什么, 报错了, 说没有喂入一个shape=[1, 1], dtype=float的值
x = tf.constant([[1.]], dtype=tf.float32)
df = K.layers.Dense(1, use_bias=False, kernel_initializer=K.initializers.constant([[1.]]))
f = df(x)
dl = K.layers.Dense(1, use_bias=False, kernel_initializer=K.initializers.constant([[10.]]))
l = dl(f)
dy = K.layers.Dense(1, use_bias=False, kernel_initializer=K.initializers.constant([[2.]]))
y = dy(f)
opt = tf.train.GradientDescentOptimizer(0.1)
loss1 = y
loss2 = l
# 计算标签分类器loss1对df(特征dense层参数)和dy(标签分类器desne层参数)的梯度
y_g = opt.compute_gradients(loss1, [df.trainable_variables, dy.trainable_variables], gate_gradients=2)
# 计算域分类器loss2对dl(与分类器dense层参数)的梯度
l_dl_g = opt.compute_gradients(loss2, [dl