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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
python字符串string的内置方法实例详解
May 14 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
Python import与from import使用及区别介绍
Sep 06 Python
python3正则提取字符串里的中文实例
Jan 31 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 Python
python异常中else的实例用法
Jun 15 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+mysql 实现身份验证代码
2010/03/24 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
PDO::query讲解
2019/01/29 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
jquery异步循环获取功能实现代码
2010/09/19 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
Vue精简版风格概述
2018/01/30 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
python中sys.argv参数用法实例分析
2015/05/20 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
jupyter实现重新加载模块
2020/04/16 Python
外企测试工程师面试题
2015/02/01 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
大班幼儿评语大全
2014/04/30 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
六年级情感作文之500字
2019/10/23 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js