Когда вы вызываете 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))
Это всегда должно работать как положено.