除了在Keras.layers.Layer内部使用get_value之外,还有其他选择吗?

时间:2020-08-04 07:10:05

标签: python tensorflow machine-learning keras neural-network

我正在尝试实现自定义Keras层,其行为比matmul更为复杂。我正在尝试使用tf.keras.backend.get_value和tf.keras.backend.set_value来实现它。这不能在预处理中实现!抖动未应用到输入!它在自动编码器的瓶颈之后被应用!请不要回答“在预处理中应用”。

class Jitter(Layer):
    def __init__(self, rate, **kwargs):
        super(Jitter, self).__init__(**kwargs)
        self.rate = rate

    def call(self, inputs, training=None):
        if training:
            p, s = self.rate / 2, 1 - self.rate
            x = K.get_value(inputs)
            y = np.zeros_like(x)
            for i in range(len(x)):
                y[i] = np.random.choice([x[max(i - 1, 0)], x[i], x[min(i + 1, len(x) - 1)]], p=[p, s, p])
            return K.variable(y)
        return inputs

...more code...

x = K.print_tensor(x, message='pre-Jitter')
x = Jitter(0.12)(x)
x = K.print_tensor(x, message='post-Jitter')

我遇到2个错误。第一个错误是与this Keras documentation相反,training始终为假,即使在训练期间也是如此。如果我删除了if training:,则第二个错误是调用K.get_value(inputs)会引发以下错误:

(0) Invalid argument: You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,96,80]
     [[node input_1 (defined at :1) ]]

尽管文档尚不清楚,但是Layer.buildLayer.call只是在“编译时”被顺序调用。 training参数的存在可能暗示在“运行时”都不会调用它们。坦率地说,这是奇怪和令人困惑的。如果在调用函数时无法得知training参数的值,为什么还要添加它呢?

我认为最重要的问题是:除了使用K.get_value来实现in this paper所述的时间抖动归一化之外,还有什么选择?

0 个答案:

没有答案
相关问题