Пользовательский переход на Rnn в TensflowFlow 2.0 - PullRequest
0 голосов
/ 09 марта 2020

Мне нужно перенести приведенную ниже часть в моей пользовательской реализации RNN в tenorflow 1.x в tenorflow 2.x.

Я застрял в том месте, где мне нужно конвертировать tf.get_variable с инициализаторами такие как инициализаторы xaver внутри tf.variable_scope.

Я ссылался на руководство по миграции, но все еще не мог понять преобразование tf.get_variable с инициализацией xavier, а также мне пришлось перенести несколько заполнителей без предварительной определенная форма.


        with tf.variable_scope(self._scope):

            with tf.variable_scope("PresentState"):
                self._U = tf.get_variable("U", shape=[self._num_in, self._n_hidden], dtype=tf.float32,
                                             initializer=xavier_initializer())
                self._W = tf.get_variable("W", shape=[self._n_hidden, self._n_hidden],
                                             dtype=tf.float32,
                                             initializer=xavier_initializer())
                self._b = tf.get_variable("B", shape=[self._n_hidden], dtype=tf.float32,
                                            initializer=xavier_initializer())
                self._p = None

Заполнитель часть.

p = tf.placeholder(tf.float32, shape=[batch_size, None, num_in], name="p")

1 Ответ

0 голосов
/ 10 марта 2020

В идиоматическом c коде TF2.x не следует использовать tf.Placeholder, а вместо этого определять их как аргументы функций для вашего вызываемого @tf.function. Поскольку TF2.x теперь поддерживает активное выполнение, вам не нужны никакие вызовы tf.Session и, следовательно, вы можете передавать простые переменные python любому @tf.function.

Для первой части вашего вопроса:

Я не настолько глубоко разбираюсь в RNN, но из вашего кода похоже, что вы могли бы преобразовать внутренний tf.variable_scope в tf.Module, что позволяет использовать инициализацию Xavier следующим образом (не проверено):

class PresentState(tf.Module):
  def __init__(self, ins, hiddens, outs):
    initializer = tf.initializers.GlorotNormal() # Xavier initialization
    self._U = tf.Variable(initializer([ins, outs]), dtype=tf.float32)
    self._W = tf.Variable(initializer([ins, outs]), dtype=tf.float32)
    self._b = tf.Variable(initializer([outs]), dtype=tf.float32)
    self._p = None
...