Я хочу нарисовать веса 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()