0. 前言

Tensorflow于1.7之后推出了tensorflow hub,其是一个适合于迁移学习的部分,主要通过将tensorflow的训练好的模型进行模块划分,并可以再次加以利用。不过介于推出不久,目前只有图像的分类和文本的分类以及少量其他模型
这里先通过几个简单的例子,来展示该hub的使用流程。

1. 一个超简单例子

1.1 创建一个Module

from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport osimport tensorflow as tf
import tensorflow_hub as hubdef 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)# 创建一个完整的graphy = a*x + b# 通过hub的add_signature,建立hub需要的网络hub.add_signature('function1',inputs=x, outputs=y)y = a * xhub.add_signature('function2', inputs=x, outputs=y)def export_module(path):'''该函数用于调用创建api进行module创建,然后进行网络的权重赋值,最后通过session进行运行权重初始化,并最后输出该module'''# 通过hub的create_module_spec,接收函数建立一个Modulespec = hub.create_module_spec(half_plus_two)# 防止串graph,将当期的操作放入同一个graph中with tf.Graph().as_default():# 通过hub的Module读取一个模块,该模块可以是url链接,表示从tensorflow hub去拉取,# 或者接收上述创建好的modulemodule = 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)if __name__ == '__main__':export_module("./module")

运行上述代码,可得

可以看出,该例子中,生成一个Module是

  • 1 - 先通过自定义网络,然后通过 hub.add_signature(inputs=x, outputs=y) 进行类似注册的操作
  • 2 - 再通过hub.create_module_spec(half_plus_two)进行生成ModuleSpec对象
  • 3 - 创建一个独立的tf.Graph(),通过module =
    hub.Module(spec)进行装载该Module,然后进行权重赋值,初始化等操作
  • 4 - 最后通过module.export(path,sess)导出该Module

1.2 调用一个存在的Module

from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport os
import tensorflow as tf
import tensorflow_hub as hubdef testExportTool1(self):# 指定module的文件夹位置,这里是exportmodule_path = os.path.join('.','module')with tf.Graph().as_default():# 读取当前存在的一个modulem = hub.Module(module_path)print('signature',m.get_signature_names())# 如直接采用y=f(x) 一样进行调用,output1=  m([10,3,4], signature='function1', as_dict=True)output2 = m([10, 3, 4], signature='function2')with tf.Session() as sess:# 惯例进行全局变量初始化sess.run(tf.initializers.global_variables())# 观察生成的值是否与预定义值一致,即prediction是否与label一致print(sess.run(output1)['default'])print(sess.run(output2))self.assertAllEqual(sess.run(output1)['default'], [7, 3.5, 4])self.assertAllEqual(sess.run(output2), [5, 1.5, 2])if __name__ == '__main__':testExportTool1()

对于调用来说,就十分简单了

  • 1 - 创建一个tf.Graph(),然后通过m = hub.Module(module_path)进行装载已存在的Module
  • 2 - 如y=f(x)一样进行调用
  • 3 - sess.run一下即可。

[深度学习-实践]tensorflow_hub简单理解模型的生成与加载相关推荐

  1. [深度学习-实践]GAN基于手写体Mnist数据集生成新图片

    系列文章目录 深度学习GAN(一)之简单介绍 深度学习GAN(二)之基于CIFAR10数据集的例子 深度学习GAN(三)之基于手写体Mnist数据集的例子 深度学习GAN(四)之PIX2PIX GAN ...

  2. 简单理解Tomasulo算法与重加载缓冲区

    参考书:<计算机体系结构量化研究方法> 作者:John L. Hennessy 流水线运行的一个主要限制是:它们使用循序指令发射与执行的方式.把指令执行的流水线简单比喻为洗衣服: 采用循序 ...

  3. 动手学深度学习第九节softmax回归中FashionMNIST数据集无法加载的解决方法

    在电脑上运行本节代码时最开始下载FashionMNIST时出了问题,自己折腾了很长时间才加载出本地数据集,希望给同样遇到问题的朋友以参考. 环境:VScode 直接下载时出现问题(响应时间过长,未完成 ...

  4. 解析OBJ模型并将其加载到Unity3D场景中

    版权声明:本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为解析OBJ模型并将其加载到Unit ...

  5. 达观数据王文广:如何玩转自然语言理解和深度学习实践?

    ​ 本文根据达观数据王文广在"达观杯"文本智能处理挑战赛期间的技术直播分享整理而成,内容略有删减. 一.深度学习概述 深度学习是从机器学习基础上发展起来的,机器学习分为监督学习.非 ...

  6. 【Pytorch深度学习实践】B站up刘二大人之BasicCNN Advanced CNN -代码理解与实现(9/9)

    这是刘二大人系列课程笔记的 最后一个笔记了,介绍的是 BasicCNN 和 AdvancedCNN ,我做图像,所以后面的RNN我可能暂时不会花时间去了解了: 写在前面: 本节把基础个高级CNN放在一 ...

  7. 【Pytorch深度学习实践】B站up刘二大人之 Gradient Descend-代码理解与实现(2/9)

    开篇几句题外话: 以往的代码,都是随便看看就过去了,没有这样较真过,以至于看了很久的深度学习和Python,都没有能够形成编程能力: 这次算是废寝忘食的深入进去了,踏实地把每一个代码都理解透,包括其中 ...

  8. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

    深度学习 Caffe 初始化流程理解(数据流建立) 之前在简书的文章,搬迁过来 ^-^ 本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处. #Caffe FeatureMap数据流的建 ...

  9. 【Pytorch深度学习实践】B站up刘二大人之SoftmaxClassifier-代码理解与实现(8/9)

    这是刘二大人系列课程笔记的倒数第二个博客了,介绍的是多分类器的原理和代码实现,下一个笔记就是basicCNN和advancedCNN了: 写在前面: 这节课的内容,主要是两个部分的修改: 一是数据集: ...

最新文章

  1. 2018-3-22论文一种新型的智能算法--狼群算法(笔记三)算法的步骤+收敛性分析
  2. Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译
  3. python 调用数据挖掘_Python数据挖掘 环境搭建
  4. c# imager让图片有圆角unity_Qt编写自定义控件24-图片轮播控件
  5. 五、Go语言复合数据类型(下)
  6. HDU 5673 Robot 卡特兰数
  7. Lyft的TypeScript实践
  8. 勾股定理的形象拆分法,原来数学可以这么好玩!
  9. I begin to keep a daily
  10. android十进制转十六进制算法,十进制转十六进制 代码
  11. jquery.ui.sortable 笔记
  12. java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...
  13. C++ 文件输入输出问题
  14. 怎样才算是优质的Scratch作品?
  15. 矩阵分解 三角分解(LU分解)
  16. 如何将各种电子书格式转换为PDF格式
  17. 9 个将改变一切的物联网应用
  18. 对于复杂网络解决现实的网络问题
  19. 混沌与分形(一):谢尔宾斯基三角形与门格海绵
  20. Mac 系统快速迁移记录(M1 Max)

热门文章

  1. 使用duilib开发半透明异形窗体程序(附源码和demo)
  2. ExtJs之Ext.data.Store
  3. 分布式数据库中间件 MyCat 安装及使用
  4. 如何在CentOS 7上使用HAproxy Loadbalancer设置Percona XtraDB集群(负载均衡)
  5. “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案
  6. SQL-连接查询:left join,right join,inner join,full join之间的区别
  7. Dockerfile 文件结构、docker镜像构建过程详细介绍
  8. JavaScript -- arguments、apply 、call、bind
  9. vue2学习计划1-1 浏览器跨域问题
  10. 【Python爬虫】Requests库网络爬虫实战