Tensorflow中tf.trainable_variables()不返回模型权重numpy数组怎么办
问题原因
tf.trainable_variables() 设计上返回的就是所有可训练的 tf.Variable 类型对象实例,仅存储变量的元信息(名称、形状、数据类型等),不会直接返回权重的数值数组,需要调用对应接口读取实际值。
对应解决方案
分两种TensorFlow版本场景处理:
TensorFlow 2.x(默认开启即时执行模式)
直接对每个Variable对象调用.numpy()方法即可导出为numpy数组,示例代码如下:
import tensorflow as tf # 获取所有可训练变量列表 trainable_vars = tf.trainable_variables() # 批量导出为numpy数组 weights_list = [var.numpy() for var in trainable_vars] # 如需提取指定层的权重,按变量名过滤即可 b1c1_kernel = next(var.numpy() for var in trainable_vars if var.name == "VGGNet/B1C1/kernel:0")
TensorFlow 1.x(默认图执行模式)
1.x不会自动执行计算,需要配合会话(Session)才能读取变量值,操作步骤如下:
import tensorflow as tf # 先定义全局变量初始化操作 init_op = tf.global_variables_initializer() with tf.Session() as sess: # 初始化变量,若加载预训练权重可替换为saver.restore(sess, "权重文件路径") sess.run(init_op) trainable_vars = tf.trainable_variables() # 调用sess.run批量读取权重数值 weights_list = sess.run(trainable_vars)
注意事项
如果基于预训练权重提取数值,取值前必须确认权重已经成功加载到当前模型/会话中,否则提取到的会是随机初始化的数值。
内容的提问来源于stack exchange,提问作者Anwar As'ad
相关产品推荐
相关产品推荐

