tensorflow2.0的函数签名与图结构(推荐)


Posted in Python onApril 28, 2020

input_signature的好处:

1.可以限定函数的输入类型,以防止调用函数时调错,

2.一个函数有了input_signature之后,在tensorflow里边才可以保存成savedmodel。在保存成savedmodel的过程中,需要使用get_concrete_function函数把一个tf.function标注的普通的python函数变成带有图定义的函数。

下面的代码具体体现了input_signature可以限定函数的输入类型这一作用。

@tf.function(input_signature=[tf.TensorSpec([None], tf.int32, name='x')])
def cube(z): #实现输入的立方
 return tf.pow(z, 3)
try:
 print(cube(tf.constant([1., 2., 3.])))
except ValueError as ex:
 print(ex)
print(cube(tf.constant([1, 2, 3])))

输出:

Python inputs incompatible with input_signature:
  inputs: (
    tf.Tensor([1. 2. 3.], shape=(3,), dtype=float32))
  input_signature: (
    TensorSpec(shape=(None,), dtype=tf.int32, name='x'))
tf.Tensor([ 1  8 27], shape=(3,), dtype=int32)

get_concrete_function的使用

note:首先说明,下面介绍的函数在模型构建、模型训练的过程中不会用到,下面介绍的函数主要用在两个地方:1、如何保存模型 2、保存好模型后,如何载入进来。

可以给 由@tf.function标注的普通的python函数,给它加上input_signature, 从而让这个python函数变成一个可以保存的tensorflow图结构(SavedModel)

举例说明函数的用法:

@tf.function(input_signature=[tf.TensorSpec([None], tf.int32, name='x')])
def cube(z):
 return tf.pow(z, 3)
 
try:
 print(cube(tf.constant([1., 2., 3.])))
except ValueError as ex:
 print(ex)
 
print(cube(tf.constant([1, 2, 3])))
 
# @tf.function py func -> tf graph
# get_concrete_function -> add input signature -> SavedModel
 
cube_func_int32 = cube.get_concrete_function(
 tf.TensorSpec([None], tf.int32)) #tensorflow的类型
print(cube_func_int32)

输出:

<tensorflow.python.eager.function.ConcreteFunction object at 0x00000240E29695C0>

从输出结果可以看到:调用get_concrete_function函数后,输出的是一个ConcreteFunction对象

#看用新参数获得的对象与原来的对象是否一样
print(cube_func_int32 is cube.get_concrete_function(
 tf.TensorSpec([5], tf.int32))) #输入大小为5
print(cube_func_int32 is cube.get_concrete_function(
 tf.constant([1, 2, 3]))) #传具体数据

输出:

True
True

cube_func_int32.graph #图定义

输出:

[<tf.Operation 'x' type=Placeholder>,
 <tf.Operation 'Pow/y' type=Const>,
 <tf.Operation 'Pow' type=Pow>,
 <tf.Operation 'Identity' type=Identity>]
pow_op = cube_func_int32.graph.get_operations()[2]
print(pow_op)

输出:

name: "Pow"
op: "Pow"
input: "x"
input: "Pow/y"
attr {
  key: "T"
  value {
    type: DT_INT32
  }
}

print(list(pow_op.inputs))
print(list(pow_op.outputs))

输出:

[<tf.Tensor 'x:0' shape=(None,) dtype=int32>, <tf.Tensor 'Pow/y:0' shape=() dtype=int32>]
[<tf.Tensor 'Pow:0' shape=(None,) dtype=int32>]

cube_func_int32.graph.get_operation_by_name("x")

输出:

<tf.Operation 'x' type=Placeholder>

cube_func_int32.graph.get_tensor_by_name("x:0")  #默认加“:0”

<tf.Tensor 'x:0' shape=(None,) dtype=int32>

cube_func_int32.graph.as_graph_def() #总名字,针对上面两个

node {
 name: "x"
 op: "Placeholder"
 attr {
 key: "_user_specified_name"
 value {
 s: "x"
 }
 }
 attr {
 key: "dtype"
 value {
 type: DT_INT32
 }
 }
 attr {
 key: "shape"
 value {
 shape {
 dim {
  size: -1
 }
 }
 }
 }
}
node {
 name: "Pow/y"
 op: "Const"
 attr {
 key: "dtype"
 value {
 type: DT_INT32
 }
 }
 attr {
 key: "value"
 value {
 tensor {
 dtype: DT_INT32
 tensor_shape {
 }
 int_val: 3
 }
 }
 }
}
node {
 name: "Pow"
 op: "Pow"
 input: "x"
 input: "Pow/y"
 attr {
 key: "T"
 value {
 type: DT_INT32
 }
 }
}
node {
 name: "Identity"
 op: "Identity"
 input: "Pow"
 attr {
 key: "T"
 value {
 type: DT_INT32
 }
 }
}
versions {
 producer: 119
}

 到此这篇关于tensorflow2.0的函数签名与图结构的文章就介绍到这了,更多相关tensorflow函数签名与图结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python实现扫描端口示例
Mar 29 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python 将pdf转成图片的方法
Apr 23 Python
Django rest framework工具包简单用法示例
Jul 20 Python
Python退火算法在高次方程的应用
Jul 26 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
Jul 28 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 Python
Python startswith()和endswith() 方法原理解析
Apr 28 #Python
Python如何将函数值赋给变量
Apr 28 #Python
Python多线程thread及模块使用实例
Apr 28 #Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 #Python
Python内置函数locals和globals对比
Apr 28 #Python
使用python实现CGI环境搭建过程解析
Apr 28 #Python
基于python连接oracle导并出数据文件
Apr 28 #Python
You might like
单位速度在实战中的运用
2020/03/04 星际争霸
Drupal7中常用的数据库操作实例
2014/03/02 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
临床医学专业毕业生的自我评价
2013/10/17 职场文书
投标服务承诺书
2014/05/28 职场文书
土地租赁意向书
2014/07/30 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
2015暑假假期总结
2015/07/13 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
Java实现多文件上传功能
2021/06/30 Java/Android