Я проверил, и, по-видимому, можно ответить на ваш собственный вопрос здесь.
После дальнейшего изучения и поднятия проблемы с github я хочу добавить несколько последующих действий.
быстрый ответ на мой вопрос: да, проблема в том, как я устанавливаю дисперсию. Если бы я установил это так:
m.likelihood.variance.assign(0.01)
, тогда мой код работал бы. (Хотя это не совсем эквивалентно, поскольку дисперсия правдоподобия в настоящее время является обучаемым параметром.)
Но это только проявление более широкой проблемы с API Tensorflow - как поднимается здесь: https://github.com/tensorflow/tensorflow/issues/26033
Попытка использовать float64s вместо плавающего по умолчанию float32 в любой библиотеке, построенной на основе tenorflow, может быть болезненной, пока эта проблема не будет решена.
Это приводит к довольно враждебным функциям API пользователя, если вы пытаетесь использовать float64s, так как в некоторых местах Python аргументы с плавающей точкой подходят, в то время как в других их нужно приводить к правильному размеру с плавающей точкой.
Вот пример из тензорного вероятности, который демонстрирует проблему:
adaptive_hmc = tfp.mcmc.SimpleStepSizeAdaptation(
hmc,
num_adaptation_steps=10,
target_accept_prob=0.75,
adaptation_rate=0.1
)
Сравните аргументы target_accept_prob и adaption_rate. Чтобы на самом деле это заработало, требуется привести аргумент target_accept_prob с чем-то вроде «tf.cast (0.75, dtype = tf.float64)», но аргумент adaption_rate подходит для использования с float32 или float64. Вам нужно покопаться в источнике или дождаться исключения и попытаться выяснить, какой аргумент заставляет его знать, где требуются такие приведения.