我想在张量板直方图中绘制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()
将输出长度为 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())