Я не могу избежать этой ошибки при использовании моей модели, обученной с tf.contrib.layers.recompute_grad
:
ValueError: The variables used on recompute were different than the variables originally
used. The function wrapped with @recompute_grad likley creates its own variable
scope with a default name and has been called twice in the same enclosing scope.
To fix, ensure each call to the function happens in its own unique variable
scope.
Любая помощь будет принята с благодарностью.В качестве примера я использую recompute_grad
с Conv2D
следующим образом.Я создаю функцию:
conv_cnt = -1
def Conv2D_mem_eff( input_tensor,
filters,
kernel_size,
kernel_regularizer,
bias_regularizer,
padding,
name ):
global conv_cnt
conv_cnt += 1
with tf.variable_scope( name + '_{:d}'.format(conv_cnt),
use_resource = True ):
def _x( inner_input_tensor ):
x = Conv2D( filters = filters,
kernel_size = kernel_size,
padding = padding,
kernel_regularizer = kernel_regularizer,
bias_regularizer = bias_regularizer,
name = name + '_{:d}'.format(conv_cnt) )(inner_input_tensor)
return x
_x = tf.contrib.layers.recompute_grad( _x )
return _x( input_tensor )
Затем, чтобы использовать ее в моей модели, я использую слой Lambda
, например:
x = Lambda( Conv2D_mem_eff,
arguments = {'filters' : 3,
'kernel_size' : (5,5),
'kernel_regularizer' : l2,
'bias_regularizer' : l2,
'padding' : 'same',
'name' : 'conv01'},
name = 'conv01' )(x)
где l2 = regularizers.l2(0.001)
.Модель использует меньше памяти и тренируется очень быстро.Я могу загрузить модель в отдельный файл и делать прогнозы, однако я не могу рассчитать простой градиент, например:
inp = mdl.input
outp = mdl.layers[lyr_idx].output
print('Input Layer: {}'.format(inp))
print('Output Layer: {}'.format(outp))
grad = K.gradients( outp, inp )[0]
, где
conv_cnt = -1 #This is reset in this new file
lyr_idx = -1
mdl = load_model( args.model, custom_objects={ 'tf' : tf,
'Conv2D' : Conv2D,
'conv_cnt' : conv_cnt } )
Всякий раз, когда я это делаю, яполучите ValueError
выше.Кто-нибудь может мне помочь?Я ошибаюсь, используя глобальную переменную, как я сделал?
ОБНОВЛЕНИЕ
Я изменил модуль тензорного потока tf.contrib.layers.recompute_grad
, чтобы он выводил, что original
и recomputed
градиенты имеют ошибку.Вот что я получил:
ORIGINAL VARIABLES
{<tf.Variable 'fc04/fc04_100000/fc04_100000/kernel:0' shape=(25, 10) dtype=float32>, <tf.Variable 'fc04/fc04_100000/fc04_100000/bias:0' shape=(10,) dtype=float32>}
RECOMPUTE VARIABLES
{<tf.Variable 'gradients/fc04/fc04_100000/IdentityN_grad/fc04_100000/fc04_100001/bias:0' shape=(10,) dtype=float32>, <tf.Variable 'gradients/fc04/fc04_100000/IdentityN_grad/fc04_100000/fc04_100001/kernel:0' shape=(25, 10) dtype=float32>}