Я пытаюсь реализовать собственный слой 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 ошибки. Первая ошибка заключается в том, что в отличие от эта документация Keras , 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
для реализации нормализация временного джиттера, как описано в этой статье ?