Как инициализировать локальные переменные под определенным name_scope

with tf.name_scope('trans_part'):
    with tf.name_scope('t_conv3'):    
        # next line is the error line
        t = tf.layers.conv2d_transpose(t, filters=f, kernel_size=w, strides=s, padding='same')
        t = tf.nn.tanh(t)

    with tf.name_scope('identical_conv4'):
        t = tf.layers.conv2d(inputs=t, filters=f, kernel_size=w, strides=1, padding='same')
        t  = tf.nn.tanh(t)

        t = tf.layers.conv2d(inputs=t, filters=f, kernel_size=w, strides=1, padding='same')
        t = tf.nn.tanh(t)

Инициализировать

var = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='trans_part')

sess.run(tf.variables_initializer(var_list=var))

Ошибка:

line 43 
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value conv2d_transpose/kernel_1

Вопрос:

  1. как инициализировать переменные под определенным name_scope?
  2. Это вызвано инициализатором или name_scope?
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте tf.variable_scope() вместо tf.name_scope(). tf.name_scope() добавит имя области только к результирующему имени тензора (например, к результату применения сверточного/плотного слоя), но не к базовым переменным. tf.variable_scope(), однако, добавит имя области к обоим.

import tensorflow as tf

x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))
t = x
with tf.variable_scope('trans_part'):
    with tf.name_scope('t_conv3', default_name=scope):    
        t = tf.layers.conv2d_transpose(t,
                                       filters=3,
                                       kernel_size=3,
                                       strides=1,
                                       padding='same')
        print(t.name) # trans_part/t_conv3/conv2d_transpose/BiasAdd:0
        t = tf.nn.tanh(t)
    with tf.name_scope('identical_conv4'):
        t = tf.layers.conv2d(inputs=t,
                             filters=3,
                             kernel_size=3,
                             strides=1,
                             padding='same')
        t  = tf.nn.tanh(t)

        t = tf.layers.conv2d(inputs=t,
                             filters=3,
                             kernel_size=3,
                             strides=1,
                             padding='same')
        t = tf.nn.tanh(t)

var_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='trans_part')

with tf.Session() as sess:
    sess.run(tf.variables_initializer(var_list=var_list))

print([v.name for v in var_list])
# ['trans_part/conv2d_transpose/kernel:0',
#  'trans_part/conv2d_transpose/bias:0',
#  'trans_part/conv2d/kernel:0',
#  'trans_part/conv2d/bias:0',
#  'trans_part/conv2d_1/kernel:0',
#  'trans_part/conv2d_1/bias:0']

Вы также можете добавить имя области к именам слоев, которые вы определяете, а затем отфильтровать те переменные, которые не имеют подстроки имени области в своих именах:

import tensorflow as tf

x = tf.placeholder(tf.float32, shape=(None, 32, 32, 3))
t = x
with tf.name_scope('trans_part') as scope:
    with tf.name_scope('t_conv3'):    
        # next line is the error line
        t = tf.layers.conv2d_transpose(t,
                                       filters=3,
                                       kernel_size=3,
                                       strides=1,
                                       padding='same',
                                       name=scope + 'con2d_transpose')
        t = tf.nn.tanh(t)

    with tf.name_scope('identical_conv4') as scope2:
        t = tf.layers.conv2d(inputs=t,
                             filters=3,
                             kernel_size=3,
                             strides=1,
                             padding='same',
                             name=scope + 'conv2d1')
        t  = tf.nn.tanh(t)

        t = tf.layers.conv2d(inputs=t,
                             filters=3,
                             kernel_size=3,
                             strides=1,
                             padding='same',
                             name=scope + 'conv2d2')
        t = tf.nn.tanh(t)

# from all trainable variables pick those that do have 'trans_part`
# substring in their name        
var_list = [v for v in tf.trainable_variables() if 'trans_part' in v.name]

with tf.Session() as sess:
    sess.run(tf.variables_initializer(var_list=var_list))

print([v.name for v in var_list])
# ['trans_part/con2d_transpose/kernel:0',
#  'trans_part/con2d_transpose/bias:0',
#  'trans_part/conv2d1/kernel:0',
#  'trans_part/conv2d1/bias:0',
#  'trans_part/conv2d2/kernel:0',
#  'trans_part/conv2d2/bias:0']

Обратите внимание, что в этом случае имена должны быть уникальными для каждого слоя, который вы определяете!

Другие вопросы по теме