我正在尝试实现自定义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.build
和Layer.call
只是在“编译时”被顺序调用。 training
参数的存在可能暗示在“运行时”都不会调用它们。坦率地说,这是奇怪和令人困惑的。如果在调用函数时无法得知training
参数的值,为什么还要添加它呢?
我认为最重要的问题是:除了使用K.get_value
来实现in this paper所述的时间抖动归一化之外,还有什么选择?