我想在张量板直方图中绘制tf.layers.dense的权重,但是参数中没有显示,我该怎么做?
答案 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,)