Как получить вес в tf.layers.dense?

Я хочу нарисовать веса tf.layers.dense в гистограмме тензора, но она не отображается в параметре, как я могу это сделать?

Ответ 1

Веса добавляются как переменная с именем kernel, чтобы вы могли использовать

x = tf.dense(...)
weights = tf.get_default_graph().get_tensor_by_name(
  os.path.split(x.name)[0] + '/kernel:0')

Очевидно, вы можете заменить tf.get_default_graph() на любой другой график, в котором вы работаете.

Ответ 2

Последние слои tenorflow api создают все переменные с tf.get_variable вызова tf.get_variable. Это гарантирует, что если вы захотите снова использовать переменную, вы можете просто использовать функцию tf.get_variable и предоставить имя переменной, которую вы хотите получить.

В случае tf.layers.dense переменная создается как: layer_name/kernel. Итак, вы можете получить переменную, сказав:

with tf.variable_scope("layer_name", reuse=True):
    weights = tf.get_variable("kernel") # do not specify
    # the shape here or it will confuse tensorflow into creating a new one.

[Редактировать]: новая версия Tensorflow теперь имеет функциональные и объектно-ориентированные интерфейсы для слоев API. Если вам нужны слои только для вычислительных целей, то использование функционального API - хороший выбор. Имена функций начинаются с маленьких букв, например → tf.layers.dense(...). Объекты слоя могут быть созданы с использованием заглавных первых букв, например → tf.layers.Dense(...). Если у вас есть дескриптор этого объекта слоя, вы можете использовать все его функциональные возможности. Для получения весов просто используйте obj.trainable_weights это возвращает список всех обучаемых переменных, найденных в области действия этого слоя.

Ответ 3

Я столкнулся с этой проблемой и просто решил ее. tf.layers.dense имя не обязательно должно совпадать с префиксом имени ядра. Мой тензор "dense_2/xxx", но ядро ​​ "dense_1/kernel: 0". Чтобы гарантировать, что tf.get_variable работает, вам лучше установить name=xxx в функции tf.layers.dense, чтобы два имени имели один и тот же префикс. Он работает как демо ниже:

l=tf.layers.dense(input_tf_xxx,300,name='ip1')
with tf.variable_scope('ip1', reuse=True):
    w = tf.get_variable('kernel')

Кстати, моя версия tf - 1.3.

Ответ 4

Я схожу с ума от тензорного потока.

Я запускаю это:

sess.run(x.kernel)

после тренировки, и я получаю веса.

Приходит из описанных свойств здесь.

Я говорю, что я схожу с ума, потому что кажется, что есть миллион несколько разных способов сделать что-то в tf, и это фрагментирует учебники.

Ответ 5

Что-то не так с

model.get_weights()

После того, как я создал модель, скомпилировал ее и запустил fit, эта функция возвращает для меня пустой массив весов.

Ответ 6

h =  tf.layers.Dense()
h.weights

работает

Ответ 7

В TF 2, если вы находитесь внутри функции @tf.function (режим графика):

weights = optimizer.weights

Если вы находитесь в активном режиме (по умолчанию в TF2, за исключением функций, украшенных @tf.function):

weights = optimizer.get_weights()