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



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

权重作为名为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()替换为您正在使用的任何其他图形。  

我遇到了这个问题并刚刚解决了它。tf.layers.dense的名称不必与内核名称的前缀相同。我的张量是"dense_2/xxx",但它的内核是"dense_1/内核:0"。为了确保tf.get_variable正常工作,您最好在tf.layers.dense函数中设置name=xxx,以使两个名称具有相同的前缀。它的工作原理如下:

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。

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

我快要被张量流弄疯了。

我运行这个:

sess.run(x.kernel)

训练后,我得到了重量。

来自此处描述的属性。

我说我快疯了,因为似乎有一百万个稍微不同的方法可以在 tf 中做某事,这会使教程支离破碎。

有什么问题吗

model.get_weights()

在我创建一个模型,编译它并运行fit后,这个函数为我返回一个权重的numpy数组。

在 TF 2 中,如果你在 @tf.function 中(图形模式(:

weights = optimizer.weights

如果您处于预先模式(TF2 中的默认值,@tf.function 修饰函数除外(:

weights = optimizer.get_weights()

TF2 权重中的

将输出长度为 2 的列表

weights_out[0] = 内核重量

weights_out[1] = 偏置权重

模型中的第二层权重(layer[0] 是没有权重的输入层(,大小为 50,输入大小为 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,)

尝试创建一个循环来获取顺序网络中每个层的权重,方法是首先打印可以从中获取的层的名称:model.summary()
然后你可以得到运行此代码的每个层的权重:

for layer in model.layers:
print(layer.name)
print(layer.get_weights())

最新更新