ValueError: переменные, используемые при пересчете, отличались от первоначально использованных переменных - PullRequest
0 голосов
/ 01 июля 2019

Я не могу избежать этой ошибки при использовании моей модели, обученной с 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>}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...