在TensorFlow训练的模型中获取某些权重的值


69

我已经使用TensorFlow训练了ConvNet模型,并且希望在图层中获得特定的权重。例如,在torch7中,我只需访问即可model.modules[2].weights。获得第2层的权重。我如何在TensorFlow中做同样的事情?

Answers:


101

在TensorFlow中,训练后的权重由tf.Variable对象表示。如果您自己创建了一个(例如tf.Variable称为)v,则可以通过调用sess.run(v)(其中sesstf.Session)来将其值作为NumPy数组获取。

如果当前没有指向的指针,则tf.Variable可以通过调用获取当前图形中可训练变量的列表tf.trainable_variables()。此函数返回tf.Variable当前图形中所有可训练对象的列表,您可以通过匹配v.name属性来选择所需的对象。例如:

# Desired variable is called "tower_2/filter:0".
var = [v for v in tf.trainable_variables() if v.name == "tower_2/filter:0"][0]

1
非常感谢@mrry,如果我从Tensorflow的任何模型Zoo支持中加载相关模型,我可以使用与我尝试过的函数相同的函数来访问它们的可训练参数,但是它返回了空矩阵。请提供任何答案
S.AMEEN'Mar

5
这取决于用于加载模型的机制。如果您使用较新的版本,tf.train.import_meta_graph()tf.trainable_variables()应该可以使用。如果你使用较低级别tf.import_graph_def()的功能,那么你应该在传递变量名return_elements可选参数,和张量将返回(您可以再传给sess.run()
mrry

1
很抱歉再次询问。我曾尝试在audacity的一个修道院github.com/tensorflow/tensorflow/blob/master/tensorflow / ...中尝试使用tf.Session(graph = graph)作为会话来实现这样的想法:var = [v for v in tf.trainable_variables()如果v.name ==“ layer1_weights”];您能给我打印砝码的功能吗?
S.AMEEN'S

5
嗯,该模型的问题在于变量没有有意义的名称。您有两个选择。(注意:您必须使用与训练网络以获取权重相同的会话。)1.session.run(layer1_weights)在训练后只需执行即可获取变量的值(这是我的回答中的第一个建议)。2.print在其后添加一条语句layer1_weights = tf.Variable(...)以查找该变量的TensorFlow名称(例如print(layer1_weights.name)),然后使用该字符串在中查找该变量tf.trainable_variables()
mrry

11

2.0兼容答案:如果使用构建模型Keras Sequential API,则可以使用以下代码获取模型的权重:

!pip install tensorflow==2.1

from tf.keras import Sequential

model = Sequential()

model.add(Conv2D(filters=conv1_fmaps, kernel_size=conv1_ksize,
                         strides=conv1_stride, padding=conv1_pad,
                         activation=tf.nn.relu, input_shape=(height, width, channels),
                    data_format='channels_last'))

model.add(MaxPool2D(pool_size = (2,2), strides= (2,2), padding="VALID"))

model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(units = 32, activation = 'relu'))

model.add(Dense(units = 10, activation = 'softmax'))

model.summary()

print(model.trainable_variables) 

最后一条语句,print(model.trainable_variables)将返回模型的权重,如下所示:

    [<tf.Variable 'conv2d/kernel:0' shape=(3, 3, 1, 32) dtype=float32>,
 <tf.Variable 'conv2d/bias:0' shape=(32,) dtype=float32>, <tf.Variable 
'dense/kernel:0' shape=(6272, 32) dtype=float32>, <tf.Variable 'dense/bias:0' 
shape=(32,) dtype=float32>, <tf.Variable 'dense_1/kernel:0' shape=(32, 10) 
dtype=float32>, <tf.Variable 'dense_1/bias:0' shape=(10,) dtype=float32>]

9

因此,如果逐步执行此代码,将首先获得已使用/可训练变量的列表。然后,您可以将它们排序在一个列表中,在其中将权重矩阵/列表排序为变量名,例如,如何处理该信息。

vars = tf.trainable_variables()
print(vars) #some infos about variables...
vars_vals = sess.run(vars)
for var, val in zip(vars, vars_vals):
    print("var: {}, value: {}".format(var.name, val)) #...or sort it in a list....

8
始终要归功于它所属的位置。在这个问题中
lamo_738 '19

1
还有,这是sess什么?答案应该是独立的
。– elcortegano
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.