Почему результаты отличаются от вызовов и предсказаний в модели Keras? Кажется, предвидеть игнорировать любое случайное значение - PullRequest
1 голос
/ 16 апреля 2020

Я вижу разные способы поведения между вызовом модели и вызовом метода predict. Кажется, что в поле Предсказание будут игнорироваться все случайно сгенерированные значения.

В этом блокноте я пытаюсь представить процесс стохастики c в моей сети.

По сути, для каждой записи Я дублирую его 10 раз, и для каждого среза добавляю некоторый случайный шум.

При вызове модели с тензором я вижу ожидаемый результат, где входная запись дает некоторый шум. При вызове predict для тех же данных я вижу только один и тот же вывод.

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

Почему я вижу такое поведение? Означает ли это, что при обучении сети с помощью fit она также будет игнорировать случайные значения?

1 Ответ

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

Когда вы вызываете predict, Keras использует скомпилированный граф TensorFlow для запуска модели, что, среди прочего, означает, что размерность пакета для тензора данных обычно будет None (потому что вы можете прогнозировать для пакетов любой размер). В вашей функции foo, которая добавляет шум к входу:

def foo(x):
    B, D = K.int_shape(x)
    if B is None:
        return x
    else:
        mask = tf.random.normal((B,D))
        return x + mask

Вы используете int_shape, чтобы получить форму x как Python целых чисел, или None для неизвестных измерений. Это работает, как и ожидалось, с нетерпеливыми тензорами, где все измерения всегда известны, но в графическом режиме возвращаемое размерность пакета B равно None, поэтому условие проходит через первую ветвь, а вход остается неизменным.

Самое простое решение - вместо этого использовать shape, который даст вам другой тензор (символ c или рвение), содержащий полную форму x, и который вы можете использовать для генерации случайного шума:

def foo(x):
    return x + tf.random.normal(K.shape(x))

Это всегда должно работать как положено.

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