TensorFlow2.X——函数签名&&图操作

函数签名&&图操作

一、函数签名

函数签名由函数原型组成。它告诉你的是关于函数的一般信息,它的名称,参数,它的范围以及其他杂项信息。

  • 我们使用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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值