tensorflow加载训练好的模型、计算图和变量

python不会像MATLAB一样,可以很方便的查看程序运行过程中生成的各个变量或参数值,但是有时候,需要查看某些变量的取值,比如,训练神经网络模型时,可能需要查看权重和偏置的取值。现总结一下利用python加载并输出训练好的模型的方法。
先以一个简单的例子为例

保存模型

import tensorflow as tf
#声明两个变量
a=tf.Variable(tf.constant(1,shape=[1]),name='a')
b=tf.Variable(tf.constant(2,shape=[1]),name='b')

#计算两个变量的和
res=a+b

#声明tf.train.Saver()类用于保存模型
saver=tf.train.Saver()


#创建会话
sess=tf.Session()
sess.run(tf.global_variables_initializer())

#b保存模型
saver.save(sess,r'E:\2019\CNN\restore_model\sample_example_model/')  #''中为模型保存的路径

运行代码后,在目标文件夹里会生成以下文件:
在这里插入图片描述
其中.data文件保存了所有变量的取值;
.index文件保存了所有变量名;
.meta文件保存了tensorflow计算图结构;
checkpoint保存了目录下所有的模型文件列表。
加载模型

import tensorflow as tf
#声明两个变量
a=tf.Variable(tf.constant(1,shape=[1]),name='a')
b=tf.Variable(tf.constant(2,shape=[1]),name='b')

#计算两个变量的和
res=a+b
sess=tf.Session()

#加载保存好的模型
saver=tf.train.Saver()
saver.restore(sess,r'E:\2019\CNN\restore_model\sample_example_model/')

#通过保存的模型中的变量值计算结果
print(sess.run(res))

运行结果:3
这段加载模型的代码基本与保存模型的代码是一样的,两段代码唯一不同的是,在加载模型的代码中没有运行变量的初始化过程,而是将变量的值通过已经保存的模型加再进来。
如果不希望重复定义图上的计算,也可以直接加载保存的tensorflow计算图,代码如下:

import tensorflow as tf
#加载tensorflow计算图
saver=tf.train.import_meta_graph(r'E:\2019\CNN\restore_model\sample_example_model/.meta')
sess=tf.Session()
saver.restore(sess,r'E:\2019\CNN\restore_model\sample_example_model/')
#通过张量名称获得张量
print(sess.run(tf.get_default_graph().get_tensor_by_name('add:0')))

运行结果:[3]
在上面的程序中,默认保存和加载了tensorflow计算图上定义的全部变量。但有时可能只需要保存或加载部分变量。为了保存或加载部分变量,在声明tf.train.Saver类时可以提供一个列表来指定保存或加载的变量。

a=tf.Variable(tf.constant(1,shape=[1]),name='a')
b=tf.Variable(tf.constant(2,shape=[1]),name='b')

#计算两个变量的和
res=a+b
sess=tf.Session()
saver=tf.train.Saver([a])
saver.restore(sess,r'E:\2019\CNN\restore_model\sample_example_model/')
print(sess.run(a))

运行结果:[3]

a=tf.Variable(tf.constant(1,shape=[1]),name='a')
b=tf.Variable(tf.constant(2,shape=[1]),name='b')

#计算两个变量的和
res=a+b
sess=tf.Session()
saver=tf.train.Saver([a])
saver.restore(sess,r'E:\2019\CNN\restore_model\sample_example_model/')
print(sess.run(b))

运行报错:tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value b
在上面的程序中,没有加载变量b,所以输出变量b的值时会报错。
对于卷积神经网络
我已经训练好了一个识别手写数字的模型,现在我想输出模型中全连接层的参数,代码如下:

import tensorflow as tf
x=tf.placeholder(tf.float32,shape=[None,784],name='input')
y_=tf.placeholder(tf.float32,shape=[None,10],name='label')

#定义变量
def get_weights(shape):
    initial=tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(initial)
def get_bias(shape):
    initial=tf.constant(0.1,dtype=tf.float32,shape=shape)
    return tf.Variable(initial)

#定义卷积运算
def conv2d(x,w):
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')

#定义池化运算
def max_pool(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

#输入
x_image=tf.reshape(x,[-1,28,28,1])

#第一层卷积池化层
w_conv1=get_weights([5,5,1,32])
b_conv1=get_bias([32])
conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
pool1=max_pool(conv1)

#第二层卷积池化层
w_conv2=get_weights([5,5,32,64])
b_conv2=get_bias([64])
conv2=tf.nn.relu(conv2d(pool1,w_conv2)+b_conv2)
pool2=max_pool(conv2)


#全连接层
pool_fl=tf.reshape(pool2,[-1,7*7*64])
w_fl1=get_weights([7*7*64,1024])
b_fl1=get_bias([1024])
fl1=tf.nn.relu(tf.matmul(pool_fl,w_fl1)+b_fl1)

sess=tf.Session()

#声明tf.train.Saver([w_fl1])类加载全连接层参数w_fl1(想加载哪些参数就在这里写要加载参数的名称)
saver=tf.train.Saver([w_fl1])
saver.restore(sess,r'E:\2019\21projects_tensorflow\mnist/mnist_model/')

print(sess.run(w_fl1))

其中网络结构和训练模型时的结构一致。
输出结果:
[[ 0.01839377 -0.08246572 0.00331391 … 0.06296185 -0.04869837
0.07754395]
[-0.11393645 0.1014652 0.01383232 … 0.03833918 -0.01894472
0.0146635 ]
[ 0.05764997 0.0452631 0.04700321 … 0.01618802 -0.05291563
-0.05835916]

[-0.25957662 -0.06376158 0.01888037 … -0.02438848 -0.04975826
0.02896979]
[-0.1075234 0.0156611 -0.09313257 … 0.0620559 -0.08073292
-0.07070705]
[-0.10439941 -0.08538222 0.11356532 … -0.00050158 0.03816419
0.00670005]]

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
训练模型成pb文件: 首先,你需要先定义并训练好一个Tensorflow模型。在模型训练完成后,你可以使用Tensorflow的`freeze_graph.py`脚本将模型转换为pb文件。 在终端中输入以下命令: ``` python tensorflow/python/tools/freeze_graph.py \ --input_graph=<input_graph.pb> \ --input_checkpoint=<input_checkpoint> \ --output_graph=<output_graph.pb> \ --output_node_names=<output_node_names> ``` 其中: - `<input_graph.pb>`:模型的GraphDef文件。 - `<input_checkpoint>`:模型的checkpoint文件。 - `<output_graph.pb>`:转换后的pb文件的输出路径。 - `<output_node_names>`:输出节点的名称,可以在定义模型时指定。 例如: ``` python tensorflow/python/tools/freeze_graph.py \ --input_graph=./models/graph.pb \ --input_checkpoint=./models/model.ckpt \ --output_graph=./models/frozen_graph.pb \ --output_node_names=output_node ``` 这将把`graph.pb`和`model.ckpt`转换为`frozen_graph.pb`文件。其中`output_node`是模型定义时指定的输出节点名称。 加载已经训练好的模型文件: 要加载已经训练好的模型文件,你需要使用Tensorflow的`tf.Session()`来创建一个会话,并使用`tf.train.import_meta_graph()`方法将模型的MetaGraph文件导入到当前的计算中。然后,你可以使用`tf.get_default_graph()`方法获取默认的计算,并使用`get_tensor_by_name()`方法获取模型中的张量。 以下是一个加载已经训练好的模型文件的示例代码: ``` import tensorflow as tf # 创建一个会话 sess = tf.Session() # 加载MetaGraph文件 saver = tf.train.import_meta_graph('./models/model.ckpt.meta') # 恢复变量 saver.restore(sess, './models/model.ckpt') # 获取默认计算 graph = tf.get_default_graph() # 获取模型中的张量 input_tensor = graph.get_tensor_by_name('input:0') output_tensor = graph.get_tensor_by_name('output:0') ``` 在这个例子中,我们使用`saver.restore()`方法恢复了模型变量,然后获取了模型中的`input`和`output`张量。这里`input`和`output`是在定义模型时所命名的张量名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值