如何在tf.layers.dense中获得权重?

时间:2017-07-28 11:24:55

标签: tensorflow

我想在张量板直方图中绘制tf.layers.dense的权重,但是参数中没有显示,我该怎么做?

7 个答案:

答案 0 :(得分:29)

权重被添加为名为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()

答案 1 :(得分:8)

最新的tensorflow图层api使用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,这将返回在该图层范围内找到的所有可训练变量的列表。

答案 2 :(得分:8)

我遇到了这个问题并且解决了它。 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。

答案 3 :(得分:4)

我对张量流感到疯狂。

我跑了这个:

sess.run(x.kernel)

训练结束后,我得到了重量。

来自here描述的属性。

我说我疯了,因为似乎有一百万种略有不同的方法可以在tf中做某些事情,并且这些方法会对教程进行分段。

答案 4 :(得分:0)

有什么问题吗

model.get_weights()

创建模型后,对其进行编译并运行fit,此函数将为我返回一个由numpy组成的权重数组。

答案 5 :(得分:0)

在TF 2中,如果您位于@ tf.function(图形模式)中:

weights = optimizer.weights

如果您处于急切模式(TF2中的默认值,除了@ tf.function装饰函数中):

weights = optimizer.get_weights()

答案 6 :(得分:0)

在TF2权重中将输出一个长度为2的列表

weights_out [0] =内核重量

weights_out [1] =偏差重量

模型尺寸为50的第二层权重(layer [0]是无权重的输入层),输入尺寸为784

inputs = keras.Input(shape=(784,), name="digits")
x = layers.Dense(50, activation="relu", name="dense_1")(inputs)
x = layers.Dense(50, activation="relu", name="dense_2")(x)
outputs = layers.Dense(10, activation="softmax", name="predictions")(x)

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(...)
model.fit(...)

kernel_weight = model.layers[1].weights[0]
bias_weight = model.layers[1].weights[1]
all_weight = model.layers[1].weights
print(len(all_weight))                      #  2
print(kernel_weight.shape)                  # (784,50)
print(bias_weight.shape)                    # (50,)