函数签名&&图操作
一、函数签名
函数签名由函数原型组成。它告诉你的是关于函数的一般信息,它的名称,参数,它的范围以及其他杂项信息。
- 我们使用input_signature对tf.function修饰的函数进行数字签名;
- tf.TensorSpec() :#TensorSpec : 描述一个张量。
tf.TensorSpec ( shape, dtype=tf.dtypes.float32, name=None )
对于被tf.function修饰过的函数都有get_concrete_function的属性,
可以通过该操作对函数添加函数签名,从而获取特定追踪。通过增加函数签名之后才能够将模型保存。
二、图操作
- graph() : 获取计算图;
- get_operations() :返回一组在图中的操作列表;
- get_operation_by_name():返回具有给定名称的操作;
- get_tensor_by_name():返回给定名称的张量;
- as_graph_def():返回此图的序列化GraphDef表示形式。
代码示例:
import tensorflow as tf
import numpy as np
#input_signature : 函数签名
#TensorSpec : 描述一个张量
@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('\n')
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 添加函数签名,获取特定追踪
cube_func_int32 = cube.get_concrete_function(tf.TensorSpec([None], tf.int32))
print(cube_func_int32)
<tensorflow.python.eager.function.ConcreteFunction object at 0x0000020B5D0C0248>
#使用具体的参数来得到一个具体的函数
print(cube.get_concrete_function(tf.TensorSpec([4], tf.int32)))
print(cube_func_int32 is cube.get_concrete_function(tf.TensorSpec([4], tf.int32)))
<tensorflow.python.eager.function.ConcreteFunction object at 0x0000020B5D0C0248>
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>
#返回给定名称的张量。
#Tensor names must be of the form "<op_name>:<output_index>
cube_func_int32.graph.get_tensor_by_name("x:0")
<tf.Tensor ‘x:0’ shape=(None,) dtype=int32>
#返回此图的序列化GraphDef表示形式
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
}