在这个paper on domain adaptation之后,我尝试在Tensorflow中实现渐变反转的下面一层(为Keras编写的,使用Theano后端,在这个Keras issue)中可以找到,因为我的模型不能很好地与Theano一起运行。在
class GradientReversalLayer(Layer):
""" Reverse a gradient
<feedforward> return input x
<backward> return -lambda * delta
"""
def __init__(self, hp_lambda, **kwargs):
super(GradientReversalLayer, self).__init__(**kwargs)
self.hp_lambda = hp_lambda
self.gr_op = ReverseGradient(self.hp_lambda)
def build(self, input_shape):
self.trainable_weights = []
def call(self, x, mask=None):
return self.gr_op(x)
def get_output_shape_for(self, input_shape):
return input_shape
def get_config(self):
config = {"name": self.__class__.__name__,
"lambda": self.hp_lambda}
base_config = super(GradientReversalLayer, self).get_config()
return dict(list(base_config.items()) + list(config.items()))
层执行此操作:
^{pr2}$如果我使用tf后端运行模型,并且在no中写入此函数,则会出现以下错误:
theano.tensor.var.AsTensorError: ('Cannot convert Tensor("concatenate_1/concat:0", shape=(?, ?, 128), dtype=float32) to TensorType', <class 'tensorflow.python.framework.ops.Tensor'>)
在这样称呼之后:
lstm_concat = concatenate([hidden_out_1, hidden_out_2])
lstm_concat = FlipGradientKeras.GradientReversalLayer(0.31)(lstm_concat)
ops codes显示了通用框架,但我希望确保我实现的所有东西都与Theano操作一样。在
我想应该是这样的:
def ReverseGradient(input_tensor, hp_lambda):
with ops.name_scope(name, "ReverseGradient", [input_tensor, hp_lambda]) as name:
input_tensor = ops.convert_to_tensor(input_tensor, name="input_tensor")
但剩下的我真的不太确定。在
提前谢谢!在
我通过扩展已完成的工作here来解决这个问题。在
工作代码如下:
相关问题 更多 >
编程相关推荐