Как устранить неполадки в пользовательских слоях Keras - PullRequest
0 голосов
/ 18 апреля 2020

Я создаю модель с использованием Keras (я новичок) и написал лямбда-функцию, чтобы случайным образом выбирать, переворачивать или нет начальный входной слой.

Это фрагмент кода, который пытается это сделать:

input_global = Input(shape=(2001,1))
flipped = Lambda(lambda x: keras.backend.reverse(x, axes=1) if np.random.random() < 0.5 else x, output_shape=(input_global.shape[1], input_global.shape[2]))(input_global)

Моя модель компилируется, но запись сообщений типа print("Hello, world") в середине определения модели приводит только к "Hello" мир "регистрируется один раз - не каждый раз, когда данные поступают в модель во время обучения.

Как я узнаю, что моя функция сделала то, что я намеревалась сделать?

1 Ответ

1 голос
/ 18 апреля 2020

При построении модели Keras вы строите график операций, и всякий раз, когда вы вводите данные через свою модель, вы вводите данные через этот график операций. Другими словами, вы строите модель один раз, а затем можете выполнять ввод через нее столько раз, сколько захотите.

Функции не-Keras не будут частью графика включая операции типа print или np.random.random(). Вам нужно будет использовать эквиваленты Кераса.

Для print используйте функцию keras.backend.print_tensor.

Для np.random.random используйте функцию keras.backend.random_uniform.

Я думаю, что вы не собирались это делать, но поскольку вы используете np.random.random() в своем пользовательском слое, эта операция будет выполняться только при построении модели. . Он не будет выполняться всякий раз, когда вы запускаете данные через вашу модель. Другими словами, слой либо только обратит входные данные, либо вернет только входные данные. Чтобы получить случайное поведение, которое, я думаю, вам нужно, вам нужно использовать функцию Keras (т. Е. keras.backend.random_uniform). Использование этой функции Keras будет генерировать случайное число каждый раз, когда вы запускаете вашу модель.

Чтобы обозначить точку, np.random.random() будет запущен один раз при построении модели и, по сути, во время сборки определит, что этот слой будет делать (то есть, он будет либо только изменять вход, либо он будет возвращать только вход без изменений). keras.backend.random_uniform(), с другой стороны, не будет генерировать случайное число при построении модели, а вместо этого добавляет к модели операцию random_uniform, поэтому каждый раз, когда данные проходят через модель, случайное число будет вытягиваться из униформы распределение в этой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...