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

在TensorFlow训练的模型中获取某些权重的值,tensorflow,Tensorflow,我用TensorFlow训练了一个ConvNet模型,我想在层中获得一个特定的权重。例如,在torch7中,我只需访问model.modules[2].weights。获取第2层的权重。在TensorFlow中,我将如何做同样的事情?在TensorFlow中,经过训练的权重由对象表示。如果您自己创建了一个tf.变量,例如名为v,则可以通过调用(其中sess是一个变量)来获取它作为NumPy数组的值 如果当前没有指向tf.变量的指针,则可以通过调用获取当前图形中可训练变量的列表。此函数返回当前图形

我用TensorFlow训练了一个ConvNet模型,我想在层中获得一个特定的权重。例如,在torch7中,我只需访问
model.modules[2].weights
。获取第2层的权重。在TensorFlow中,我将如何做同样的事情?

在TensorFlow中,经过训练的权重由对象表示。如果您自己创建了一个
tf.变量
,例如名为
v
,则可以通过调用(其中
sess
是一个变量)来获取它作为NumPy数组的值

如果当前没有指向
tf.变量的指针
,则可以通过调用获取当前图形中可训练变量的列表。此函数返回当前图形中所有可训练的
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]

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

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....

2.0兼容答案:如果我们使用
Keras顺序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\u 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>]
[,,
, , ]

非常感谢@mrry,如果我从Tensorflow的任何model zoo支持加载相关模型,我可以使用我尝试过的相同功能访问它们的可训练参数,但它返回空矩阵。任何答案都取决于加载模型的机制。如果使用较新的
tf.train.import\u meta\u graph()
,则
tf.trainable\u variables()
应该可以工作。如果使用较低级别的
tf.import\u graph\u def()
函数,则应在
return\u elements
可选参数中传递变量名称,并将返回一个张量(然后可以传递到
sess.run()中)
。很抱歉再次询问。我在audacity中与一个修道院进行了尝试,并尝试将tf.Session(graph=graph)作为Session:var=[v代表tf.trainable\u variables中的v(),如果v.name==“layer1\u weights”];你能给我一个可以打印权重的函数吗?啊,这个模型的问题是变量没有有意义的名称。你有两个选择。(注意,你必须使用与训练网络检索权重相同的会话。)1.只需执行
session.run(layer1\u权重)
在训练后获取变量的值(这是我回答中的第一个建议)。2.在
layer1\u weights=tf.variable(…)
之后添加
print
语句,以查找TensorFlow的变量名称(例如
print(layer1\u weights.name)
),然后使用该字符串在
tf.trainable_variables()
中查找变量。始终对变量所属的位置进行评分。此处也给出了ans,这里什么是
sess
?答案应该是自含的。。