在Tensorflow中仅传播一次自定义层

时间:2019-08-25 15:37:41

标签: tensorflow keras neural-network layer

给定张量流中的自定义层,是否可以让模型仅在一个时期内使用它?对于所有其他纪元,该层可能只是被忽略,或者仅仅是一个标识。

例如:给定数据我希望该层将给定数据简单地加倍。其他层应该可以正常工作。那怎么办?

def do_stuff(data):
      return 2*data

def run_once(data):
  return tf.py_func(do_stuff, 
                     [data],
                     'float32',
                     stateful=False,
                     name='I run once')


class CustomLayer(Layer):
  def __init__(self, output_dim, **kwargs):
    self.output_dim = output_dim
    self.trainable = False
    super(CustomLayer, self).__init__(**kwargs)

  def call(self, x):
    res = tf.map_fn(run_once, x)
    res.set_shape([x.shape[0],
                   self.output_dim[1], 
                   self.output_dim[0],
                   x.shape[-1]])
    return res

inputs = Input(shape=(224, 224, 1))    
x = Lambda(preprocess_input(x), input_shape=(224, 224, 1), output_shape=(224, 224, 3))
outputs = Dense(1)(x)
model = Model(input=inputs, output=outputs)
output = model(x)

1 个答案:

答案 0 :(得分:1)

有趣的问题。要仅在第一个时期执行TF操作,可以使用tf.condtf.control_dependencies来检查/更新布尔张量的值。例如,您的自定义层可以按以下方式实现:

class CustomLayer(Layer):
    def __init__(self, **kwargs):
        super(CustomLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.first_epoch = tf.Variable(True)

    def call(self, x):
        res = tf.cond(self.first_epoch,
                      true_fn=lambda: run_once(x),
                      false_fn=lambda: x)
        with tf.control_dependencies([res]):
            assign_op = self.first_epoch.assign(False)
            with tf.control_dependencies([assign_op]):
                res = tf.identity(res)
        return res

要验证该层是否按预期工作,请将run_once定义为:

def run_once(data):
    print_op = tf.print('First epoch')
    with tf.control_dependencies([print_op]):
        out = tf.identity(data)
    return out