tensorflow hub是用来加载预训练模型的,比如说bert模型什么的。
本篇博客讲述如何训练导出一个tensorflow hub 所拥有的模型。然后如何加载这么一个模型
如下是训练导出一个tensorflow hub模块所接受的模型1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import tensorflow as tf
import tensorflow_hub as hub
'''2 - 建立一个网络结构,并基于该网络结构建立一个Module '''
def half_plus_two():
'''该函数主要是创建一个简单的模型,其网络结构就是y = a*x + b '''
# 创建两个变量,a和b,如网络的权重和偏置
a = tf.get_variable('a', shape=[])
b = tf.get_variable('b', shape=[])
# 创建一个占位变量,为后面graph的输入提供准备
x = tf.placeholder(tf.float32)
# 创建一个完整的graph
y = a*x + b
# 通过hub的add_signature,建立hub需要的网络
# 这个函数决定了如何去加载这个模型。
hub.add_signature(name='info', inputs={'x': x}, outputs={'y': y})
def export_module(path):
'''该函数用于调用创建api进行module创建,然后进行网络的权重赋值,最后通过session进行运行权重初始化,并最后输出该module'''
# 通过hub的create_module_spec,接收函数建立一个Module
spec = hub.create_module_spec(half_plus_two)
# 防止串graph,将当期的操作放入同一个graph中
with tf.Graph().as_default():
# 通过hub的Module读取一个模块,该模块可以是url链接,表示从tensorflow hub去拉取,
# 或者接收上述创建好的module
module = hub.Module(spec)
# 这里演示如何将权重值赋予到graph中的变量,如从checkpoint中进行变量恢复等
init_a = tf.assign(module.variable_map['a'], 0.5)
init_b = tf.assign(module.variable_map['b'], 2.0)
init_vars = tf.group([init_a, init_b])
with tf.Session() as sess:
# 运行初始化,为了将其中变量的值设置为赋予的值
sess.run(init_vars)
# 将模型导出到指定路径
module.export(path, sess)
def main(argv):
export_module('hub_dict')
if __name__ == '__main__':
tf.app.run(main)
加载上面代码所创建的模型的代码:
1 | import os |
官方讲解tensorflowHub的文档