gpt4 book ai didi

tensorflow - 为什么 get_tensor_by_name 无法正确获取 tf.keras.layers 定义的层的权重

转载 作者:行者123 更新时间:2023-12-04 17:37:45 26 4
gpt4 key购买 nike

我尝试使用 tensorflow 中的 get_tensor_by_name 获取由 tf.keras.layers 定义的层的权重。代码呈现如下

# encoding: utf-8
import tensorflow as tf

x = tf.placeholder(tf.float32, (None,3))
h = tf.keras.layers.dense(3)(x)
y = tf.keras.layers.dense(1)(h)

for tn in tf.trainable_variables():
print(tn.name)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
w = tf.get_default_graph().get_tensor_by_name("dense/kernel:0")
print(sess.run(w))

权重的名称是dense/kernel:0。但是,sess.run(w) 的输出很奇怪

[( 10,) ( 44,) ( 47,) (106,) (111,) ( 98,) ( 58,) (108,) (111,) ( 99,)
( 97,) (108,) (104,) (111,) (115,) (116,) ( 47,) (114,) (101,)
... ]

这不是 float 数组。事实上,如果我使用 tf.layers.dense 来定义网络,一切都会顺利进行。所以我的问题是如何通过正确使用张量名称来获取 tf.keras.layers 定义的层的权重。

最佳答案

您可以在层上使用 get_weights() 来获取特定层的权重值。这是您的案例的示例代码:

import tensorflow as tf

input_x = tf.placeholder(tf.float32, [None, 3], name='x')
dense1 = tf.keras.Dense(3, activation='relu')
l1 = dense1(input_x)
dense2 = tf.keras.Dense(1)
y = dense2(l1)

weights = dense1.get_weights()

可以使用 Keras API 以更简单的方式完成,如下所示:

def mymodel():
i = Input(shape=(3, ))
x = Dense(3, activation='relu')(i)
o = Dense(1)(x)

model = Model(input=i, output=o)
return model


model = mymodel()

names = [weight.name for layer in model.layers for weight in layer.weights]
weights = model.get_weights()

for name, weight in zip(names, weights):
print(name, weight.shape)

此示例获取模型每一层的权重矩阵。

关于tensorflow - 为什么 get_tensor_by_name 无法正确获取 tf.keras.layers 定义的层的权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56002345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com