tensorflow: получить ValueError («Никакие значения не поддерживаются.») при пакетной нормализации

#python #tensorflow

#питон #tensorflow

Вопрос:

Я использую пакетную нормализацию через tensorflow. Проблема в том, что, похоже, сеть должна использовать tf.cond оператор на уровне batchnorm, иначе он сообщит о следующей ошибке:

 ValueError("None values not supported.")
  

Я в замешательстве по этому поводу. Я публикую простой пример в следующем:

 conv_bias = some_layer_defined_previously
train = tf.cast((True), tf.bool)
conv_bias = self.batch_norm2(conv_bias, filters, train)
  

Эта сеть будет работать хорошо. Однако, если я изменю его на следующее:

 conv_bias = some_layer_defined_previously
train = True
conv_bias = self.batch_norm3(conv_bias, filters, train)
  

Затем возникает ошибка.

Я в замешательстве, потому что единственное различие между двумя сетями — это уровень batchnorm. Определения двух уровней пакетной нормы следующие:

batchnorm2

 def batch_norm2(self, x, size, training, decay=0.999):
    beta = tf.Variable(tf.zeros([size]), name='beta')
    scale = tf.Variable(tf.ones([size]), name='scale')
    pop_mean = tf.Variable(tf.zeros([size]), 'mean')
    pop_var = tf.Variable(tf.ones([size]), 'var')
    epsilon = 1e-3
    self.model_params  = [beta, scale, pop_mean, pop_var]
    batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2])
    train_mean = tf.assign(pop_mean, pop_mean * decay   batch_mean * (1 - decay))
    train_var = tf.assign(pop_var, pop_var * decay   batch_var * (1 - decay))

    def batch_statistics():
        with tf.control_dependencies([train_mean, train_var]):
            return tf.nn.batch_normalization(x, batch_mean, batch_var, beta, scale, epsilon, name='batch_norm')

    def population_statistics():
        return tf.nn.batch_normalization(x, pop_mean, pop_var, beta, scale, epsilon, name='batch_norm')

    return tf.cond(training, batch_statistics, population_statistics)
  

batchnorm3

 def batch_norm3(self, x, size, training, decay=0.999):
    beta = tf.Variable(tf.zeros([size]), name='beta')
    scale = tf.Variable(tf.ones([size]), name='scale')
    pop_mean = tf.Variable(tf.zeros([size]), 'mean')
    pop_var = tf.Variable(tf.ones([size]), 'var')
    epsilon = 1e-3
    batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2])
    train_mean = tf.assign(pop_mean, pop_mean * decay   batch_mean * (1 - decay))
    train_var = tf.assign(pop_var, pop_var * decay   batch_var * (1 - decay))
    with tf.control_dependencies([train_mean, train_var]):
        return tf.nn.batch_normalization(x, batch_mean, batch_var, beta, scale, epsilon, name='batch_norm')
  

Единственное различие между этими двумя определениями заключается в том, что я удаляю tf.cond in batchnorm2 и напрямую использую True ветвь tf.cond in batchnorm3 . В batchnorm3 , на самом деле train переменная не используется, поэтому независимо от его типа I, или train=True , либо train = tf.cast((True), tf.bool) , ошибка точно такая же.

Полное сообщение об ошибке выглядит следующим образом:

 File "some_src_file.py", line 237, in functionA
    grads_vars[i] = (tf.clip_by_norm(grad, mc.MAX_GRAD_NORM), var)
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/ops/clip_ops.py", line 110, in clip_by_norm
    t = ops.convert_to_tensor(t, name="t")
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 946, in convert_to_tensor
    as_ref=False)
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1036, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 235, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 214, in constant
    value, dtype=dtype, shape=shape, verify_shape=verify_shape))
  File "/my_path/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 421, in make_tensor_proto
    raise ValueError("None values not supported.")
ValueError: None values not supported.
  

В чем причина этого? Спасибо вам всем за то, что помогли мне!

Комментарии:

1. Функции в tensorflow ожидают тензор в качестве параметра, когда вы передаете его просто как логическое значение, он не может обработать это, если вы перейдете на страницу его определения, там будет четко указано, что его входные данные должны быть скалярными, а не логическими.

2. @anand_v.singh Похоже, это не ключевая проблема. Даже если я приведу переменную train к tf.bool, она сообщает точно такую же ошибку.

3. Какая переменная вызывает ошибку? Поскольку ошибка находится в grads_vars[i] = (tf.clip_by_norm(grad, mc.MAX_GRAD_NORM), var) . Не могли бы вы предоставить дополнительную информацию об этом?