#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)
. Не могли бы вы предоставить дополнительную информацию об этом?