Я смотрю код от https://github.com/AshishBora/csgm и испытываю странное поведение при использовании np.random.normal вместо tf.random_normal
в качестве инициализации tf.Variable
.Более конкретный:Вместо
z = tf.Variable(tf.random_normal((batch_size, hparams.n_z)), name='z')
у меня есть
# in mnist_vae/src/model_def.py, line 74
z = tf.Variable(np.random.normal(size=(batch_size,
hparams.n_z)).astype('float32'), name='z')
z - переменная, которая оптимизируется с помощью оптимизатора Adam относительно цели.
Для небольшого фона: Существует предварительно обученная нейронная сеть G, чей вход z получен из стандартного нормального распределения с использованием tf.random_normal.Для данного z*
требуется решить ẑ= argmin_z ||AG(z)-AG(z*)||
и проверить ошибку восстановления ||G(ẑ)-G(z*)||
.Выходное минимальное значение c(z*)=||G(ẑ)-G(z*)||
для нескольких различных z*
довольно стабильно в районе значения c1.Теперь я не совсем уверен, может ли оптимизация (оптимизатор Адама) использовать информацию, полученную из стандартного нормального распределения.Поэтому я заменил tf.random_normal
на np.random_normal
в надежде, что оптимизатор не сможет использовать эту информацию.(см. код выше)
К сожалению, результаты действительно отличаются, если использовать np.random.normal: c(z*)=||G(ẑ)-G(z*)||
для нескольких различных z*
стабильных значений, отличных от c2
(не c1
).Как можно это объяснить?Действительно ли оптимизатор использует информацию о нормальном распределении (например, в качестве логарифмического правдоподобия) при оптимизации?Я чувствую, что нет, так как это только инициализация.
Код указан в https://github.com/AshishBora/csgm