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 18 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python3的输入方式及多组输入方法
Oct 17 Python
Python通用循环的构造方法实例分析
Dec 19 Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 Python
Python3 中作为一等对象的函数解析
Dec 11 Python
django实现模型字段动态choice的操作
Apr 01 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 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
编写自己的php扩展函数
2006/10/09 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP解析RSS的方法
2015/03/05 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
简单谈谈React中的路由系统
2017/07/25 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
幼儿园国庆节活动方案
2014/02/01 职场文书
班级德育工作实施方案
2014/02/21 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang