首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类作用域外定义的对象方法的@tf.function( input_signature )

类作用域外定义的对象方法的@tf.function( input_signature )
EN

Stack Overflow用户
提问于 2021-05-03 04:20:34
回答 2查看 908关注 0票数 1

假设我有一个Custom Layer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Custom_Layer(keras.layers.Layer):
    def __init__(self, **kwargs):
        self.w_0 = tf.Variable(tf.random_uniform_initializer(),trainable=True)
        self.b_0 = tf.Variable(tf.zeros_initializer(),trainable=True)    
        ....
    def call(self, inputs):
        output = A_Method(self, inputs)
        return output
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def A_Method(self, TensorA):
    ....
    return something

如果我想将@tf.function(with input_signature)装饰为A_Method以控制跟踪

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@tf.function(input_signature=[???,  tf.TensorSpec(shape=None)])
def A_Method(self, TensorA):
    ....
    return something

我应该为self制定什么规范?我试着把tf.TensorSpec放上去,但是它引起了一个错误

___Updated the question___ :

我对tensorflow非常陌生,抱歉,如果代码是奇怪的或没有意义的。我这么做的原因是我发现RNN花了很长时间才开始第一个阶段,我不知道这个自定义层是否可以做一些类似的事情,但花费的时间更少。但最终我相信初始化时间的缓慢是因为tensorflow retracing repeatedly even on same input_spec - input_shape。我反复使用这一层,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
input_layer = Input(shape=( X_.shape[1],X_.shape[2]),  name='input')
for loop :
Hard_Code_RNN_Layer(input_layer[:,:, slicing])

然后我运行了.experimental_get_tracing_count()计数是300,这实际上不应该超过10,这就是为什么我想把这个方法从def Mimic_RNN(self, step_input, step_state) remove it from the class中取出来,并尝试给它一个input_signature。请见下文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def Initialize_Variable(input_dim, units):
    w_init = tf.random_normal_initializer()
    b_init = tf.zeros_initializer()
    w_0 = tf.Variable(initial_value=w_init(shape=(input_dim, units))) 
    b_0 = tf.Variable(initial_value=b_init(shape=(units)))
    return w_0, b_0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def Initialize_One_Variable(input_dim, units):
    w_init = tf.random_uniform_initializer()
    R_kernal = tf.Variable(initial_value=w_init(shape=(input_dim, units))) 
    return R_kernal
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Hard_Code_RNN_Layer(keras.layers.Layer):
    def __init__(self, input_tuple, Sequencee=True, **kwargs):
        super(Hard_Code_RNN_Layer, self).__init__()
        input_shape, units = input_tuple       
        self.Hidden_Size = (int)(input_shape * 0.85)
        self.inputshape = input_shape
        self.units = units
        self.thiseq = Sequencee
        self.Uz = Initialize_One_Variable(self.Hidden_Size, self.Hidden_Size)
        self.Ur = Initialize_One_Variable(self.Hidden_Size, self.Hidden_Size)
        self.w_hz, self.b_hz    = Initialize_Variable(self.units, self.Hidden_Size)
        self.w_out, self.b_out  = Initialize_Variable(self.Hidden_Size,self.units)
        self.w_0, self.b_0  = Initialize_Variable(self.inputshape,self.units)

    def get_config(self):
        cfg = super().get_config()
        return cfg 

    def Layer_Method(inputs, w_h, b_h):
        return tf.matmul(inputs, w_h) + b_h
    
    def Mimic_RNN(self, step_input, step_state):  <-----------input_signature_this
        x__j = self.Layer_Method(step_input, self.w_0, self.b_0)
        r = tf.sigmoid(tf.matmul(step_state, self.Ur))
        z = tf.sigmoid(tf.matmul(step_state, self.Uz))
        h__ = tf.nn.relu(tf.matmul(x__j, self.w_hz) +  tf.multiply(r, step_state) + self.b_hz) 
        h = (1-z) * h__ + z * step_state
        output__ = tf.nn.relu(tf.matmul(h, self.w_out) + self.b_out)
        
        return output__, h
    
    def call(self, inputs):
        unstack = tf.unstack(inputs, axis=1)
        out1, hiddd = self.Mimic_RNN(step_input=unstack[0], step_state=tf.zeros_like(unstack[0][:,0:self.Hidden_Size]))
        out2, hiddd = self.Mimic_RNN(step_input=unstack[1], step_state=hiddd)
        out3, hiddd = self.Mimic_RNN(step_input=unstack[2], step_state=hiddd)
        
        if(self.thiseq):
            return tf.stack([out1, out2, out3], axis =1 )  
        else:
            return out3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 07:10:09

如果指定了输入签名,那么python函数的所有输入都必须转换为Tensor。在这种情况下,self保存对调用方法的实例的引用,并且不能作为张量进行转换。您只是不能在您的input_signature A_method 函数中指定.

但是,仍然可以从类中修饰方法,因为TensorFlow将检测要修饰的函数是否是方法,如果是这样的话,将自动删除self参数。您可以检查源代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if self._is_method:
  # Remove `self`: default arguments shouldn't be matched to it.
  # TODO(b/127938157): Should this error out if there is no arg to
  # be removed?
  args = fullargspec.args[1:]

值得注意的是,如果在类之外定义了一个方法,则此检查将失败。(检查依赖于标准库ismethod模块的inspect函数)。由于self不能转换为张量,因此修饰方法在调用时会抛出一个错误。

在类定义之外定义一个方法并不是最佳实践:它使代码更难阅读,更难使用。有关更多细节,您可以查看这个问题:在类定义之外定义一个方法?。类之间重用逻辑的python方法要么使用继承,要么定义一个不依赖于对象属性的函数(或者将这些属性作为参数传递给函数的位置)。

票数 1
EN

Stack Overflow用户

发布于 2022-05-05 09:13:42

实际上,可以将与类方法一起使用input_signature。在输入签名规范中,只需忽略初始的self参数,因此您只需为其他参数提供tf.TensorSpec

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

class MyClass:
    @tf.function(input_signature=(tf.TensorSpec([None], tf.float32),
                                  tf.TensorSpec([None], tf.float32)))
    def my_method(self, a, b):
        return a + b

tf.print(MyClass().my_method([1, 2, 3], [4]))
# 5, 6, 7
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67368816

复制
相关文章
TensorFlow2.X学习笔记(4)--TensorFlow低阶API之AutoGraph相关研究
而Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。
MiChong
2020/09/24
1K0
TensorFlow2.X学习笔记(4)--TensorFlow低阶API之AutoGraph相关研究
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
类的成员方法 , 就是 在 类 中定义的 函数 , 在该 函数 中 , 可以调用 类的成员变量 , 以及 本类中其它的成员方法 ;
韩曙亮
2023/10/11
4680
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
Python 「面向对象基本语法1」(判断对象的方法、定义类、示例)
在学基础语法之前先学习一下python中的一个内置函数dir。在python中对象几乎是无处不在的,之前学习的变量、数据、函数都是对象。
python自学网
2022/06/20
8160
Python 「面向对象基本语法1」(判断对象的方法、定义类、示例)
PHP面向对象-类和对象的定义(三)
在PHP中,类的属性和方法可以设置访问控制,以限制它们的访问权限。常用的访问控制有三种:公有(public)、私有(private)和受保护(protected)。
堕落飞鸟
2023/04/27
5710
PHP面向对象-类和对象的定义(五)
多态是面向对象编程中的另一个重要特性,它可以让不同的对象使用相同的方法,但是表现出不同的行为。在PHP中,多态可以通过接口和抽象类来实现。
堕落飞鸟
2023/04/27
6230
C++面向对象编程类对象的定义
对象和对象之间的关系:分别使用不同的内存来存储数据,使用相同的内存上的函数(一份函数拷贝)
风骨散人Chiam
2020/10/28
1K0
PHP面向对象-类和对象的定义(一)
在PHP面向对象编程中,类和对象是最基础和最重要的概念。类是一种抽象的数据类型,它定义了一组属性和方法,用来描述某种事物的特征和行为;而对象则是类的一个实例,它具有类定义的属性和方法,并可以进行相应的操作。
堕落飞鸟
2023/04/27
5810
PHP面向对象-类和对象的定义(四)
继承是面向对象编程中的另一个重要特性,它可以让一个类继承另一个类的属性和方法,并可以对它们进行扩展和修改。在PHP中,可以使用extends关键字实现类的继承,语法如下:
堕落飞鸟
2023/04/27
4800
PHP面向对象-类和对象的定义(二)
其中,对象名可以任意指定,类名必须与定义的类名一致,参数列表是传递给构造函数的参数,可以为空。创建对象时,PHP会自动调用构造函数,并为对象的属性赋初始值。
堕落飞鸟
2023/04/27
5640
【tensorflow2.0】AutoGraph和tf.Module
而Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。
西西嘛呦
2020/08/26
7460
【tensorflow2.0】AutoGraph和tf.Module
类与对象的绑定方法
类与对象的绑定方法 class OldboyStudent: school = 'oldboy' def __init__(self, name, age, gender): self.name = name self.age = age self.sex = gender def choose_course(self): print(f'{self.name} choosing course') def
py3study
2020/01/15
7730
Python面向对象编程-类和对象-类的定义和使用(一)
类是一种定义了一组属性和方法的模板。属性是对象的数据成员,而方法是对象的函数成员。类是一个抽象的概念,它只描述了对象的行为和状态,并不具体实现。
玖叁叁
2023/04/18
6130
Python面向对象编程-类和对象-类的定义和使用(三)
我们可以使用点号 . 来访问对象的属性。例如,如果我们有一个名为 name 的属性,我们可以使用 p1.name 来访问它。
玖叁叁
2023/04/18
6870
Python面向对象编程-类和对象-类的定义和使用(二)
在类中定义方法时,第一个参数必须是 self。self 表示对象本身。当调用方法时,Python 自动将对象作为方法的第一个参数传递。我们可以使用 self 来访问和操作对象的属性。
玖叁叁
2023/04/18
5660
创建自定义类的对象数组
CN_Simo
2017/12/26
2.3K0
创建自定义类的对象数组
小谈startup类ConfigureServices方法的作用
这个是我在面试中遇到的一道面试题,记录下来分享给大家。 简单说ConfigureServices是配置服务器的DI容器,可以添加一些服务进到依赖注入容器中。具体来说就是把中间件等添加到DI容器中,最后都是添加到IServiceCollection中,比如下面的代码:
喵叔
2021/11/29
8440
Tensorflow2.0常用基础API
tensorflow2.0改进之后已经非常像numpy形式了,不用像之前的session那样操作,一些基本的操作如下。需要注意的店以及部分数据均写在代码注释中。
Mirza Zhao
2023/06/26
7880
类和对象的初步接触与定义
        在C++优化和解决完C的指针和大工程容易导致的函数和变量命名冲突后,C++对于C的又有一个重大的优化和改进——struct结构体。在C++中因为要兼容C所以C++用了一个新名字——class类。
比特大冒险
2023/04/16
4200
类和对象的初步接触与定义
PHP方法类与对象的区别
不知道有人是否和作者一样,不是特别的能区分方法类和对象的区别呢。那么今天就用一个简单例子解释类和对象的区别。
小唐同学.
2022/03/07
1.6K0
点击加载更多

相似问题

通过函数指针在类的作用域外定义方法

10

用于列表输入的Tensorflow 2 tf.function input_signature

17

在Tensorflow 2.0中使用tf.function input_signature中的字典

131

类作用域外触发事件javascript

11

替换Python作用域外的对象名称

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文