获取TensorFlow训练的模型中某些权重的值
Get the value of some weights in a model trained by TensorFlow
我已经用 TensorFlow 训练了一个 ConvNet 模型,我想在层中获得一个特定的权重。例如在 torch7 中我会简单地访问 model.modules[2].weights
。获得第 2 层的权重。我如何在 TensorFlow 中做同样的事情?
在 TensorFlow 中,经过训练的权重由 tf.Variable
objects. If you created a tf.Variable
—e.g. called v
—yourself, you can get its value as a NumPy array by calling sess.run(v)
(where sess
is a tf.Session
) 表示。
如果您当前没有指向 tf.Variable
的指针,您可以通过调用 tf.trainable_variables()
获取当前图中可训练变量的列表。这个函数 returns 当前图中所有可训练的 tf.Variable
对象的列表,你可以 select 通过匹配 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]
因此,如果您逐步执行此代码,您将首先获得 used/trainable 个变量的列表。然后你可以在一个列表中对它们进行排序,在这个列表中你将权重 matrices/lists 排序为变量名称,例如你如何处理这些信息。
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 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)
将 return 模型的权重如下所示:
[<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>]
获取数组形式的权重。这给出了所有参数(可训练和不可训练)。不可训练参数的例子是 Batch Norm Layer
的移动均值和移动方差
model.get_weights()
然后您可以使用
访问任何层的权重
model.get_weights()[0]
model.get_weights()[1]
model.weights
也可以解决问题;与
相同
model.trainable_variables
我已经用 TensorFlow 训练了一个 ConvNet 模型,我想在层中获得一个特定的权重。例如在 torch7 中我会简单地访问 model.modules[2].weights
。获得第 2 层的权重。我如何在 TensorFlow 中做同样的事情?
在 TensorFlow 中,经过训练的权重由 tf.Variable
objects. If you created a tf.Variable
—e.g. called v
—yourself, you can get its value as a NumPy array by calling sess.run(v)
(where sess
is a tf.Session
) 表示。
如果您当前没有指向 tf.Variable
的指针,您可以通过调用 tf.trainable_variables()
获取当前图中可训练变量的列表。这个函数 returns 当前图中所有可训练的 tf.Variable
对象的列表,你可以 select 通过匹配 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]
因此,如果您逐步执行此代码,您将首先获得 used/trainable 个变量的列表。然后你可以在一个列表中对它们进行排序,在这个列表中你将权重 matrices/lists 排序为变量名称,例如你如何处理这些信息。
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 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)
将 return 模型的权重如下所示:
[<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>]
获取数组形式的权重。这给出了所有参数(可训练和不可训练)。不可训练参数的例子是 Batch Norm Layer
的移动均值和移动方差model.get_weights()
然后您可以使用
访问任何层的权重model.get_weights()[0]
model.get_weights()[1]
model.weights
也可以解决问题;与
相同model.trainable_variables