Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类作用域外定义的对象方法的@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

复制
相关文章
在Ubuntu上安装Minikube
为了方便开发者体验Kubernetes,社区提供了可以在本地部署的Minikube。由于在国内网络环境内,无法顺利的安装使用Minikube,我们可以从阿里云的镜像地址来获取所需Docker镜像和配置。
mazhen
2023/11/24
9681
在Ubuntu上安装ReviewBoard
因为ReviewBoard在Windows上停止更新了,所以了解如何在Linux系统安装ReviewBoard是很有必要的。笔者只在Apache+MySQL+Ubuntu下实现过,其余均参考官方安装文档:http://www.reviewboard.org/docs/manual/dev/admin/installation/linux/。 [Note] 安装过程中如碰到报错问题,自行谷歌或者百度,大部分均可解决。有些是软件版本问题,比如之前用Ubuntu 12.04有个软件包用easy_install安装的版本一直低于安装ReviewBoard的要求,升级成Ubuntu 13.04之后就没问题了。
星哥玩云
2022/07/01
1.5K0
在 Ubuntu 上安装 MySQL
在 Ubuntu 中安装 Mysql 最方便方式是用 MySQL 自己的 APT 仓库。 APT 仓库中包含了 MySQL 的服务器和工具相关的软件。我们需要将此 MySQL APT 仓库添加到系统的包源列表中。
不惑
2023/09/23
1.2K0
在 Ubuntu 上安装Microsoft Edge[通俗易懂]
1.要安装Microsoft Edge,你首先需要在终端中运行这些命令,在设备上设置微软的存储库。
全栈程序员站长
2022/09/13
2.3K0
在Ubuntu 16.04上安装WordPress
在本指南中,您将学习如何在运行Ubuntu 16.04的Linode上安装WordPress。WordPress是一个流行的动态内容管理系统,专注于博客。WordPress可以部署在LAMP或LEMP堆栈上,并具有广泛的插件框架和主题系统,允许网站所有者和开发人员使用其简单但功能强大的发布工具。
Techeek
2018/09/17
5.2K0
在Ubuntu 16.04上安装WordPress
在Ubuntu上安装使用CouchPotato
CouchPotato(https://couchpota.to/)是开源的自动种子下载器,它是免费的影视资源搜索器,您只要输入资源的名称和或关键词,即可进行后台搜索,支持下载字幕,支持通过bt软件下载。CouchPotato使用C/S架构,Python开发。 CouchPotato源代码:https://github.com/CouchPotato/CouchPotatoServer CouchPotato (CP) is an automatic NZB and torrent downloader.
Zip
2018/07/20
3.3K0
在Ubuntu 16.04上安装Rancher
Rancher是运行容器和构建私有容器服务的开源平台。 Rancher基于Docker,因此您可以在专用的box,KVM机器上甚至LXC容器上运行它。 Rancher提供了一个庞大的应用程序库,只需点击几下即可安装,并且还支持来自Dockerhub的Docker镜像。
星哥玩云
2022/07/12
1.7K0
在Ubuntu上安装Oracle JDK
如果不想使用Ubuntu提供的OpenJDK,想使用Oracle的版本。可以进行如下操作
EltonZheng
2021/01/26
1.4K0
在Ubuntu上单机安装Hadoop
最近大数据比较火,所以也想学习一下,所以在虚拟机安装Ubuntu Server,然后安装Hadoop。
深蓝studyzy
2022/06/16
1K0
在Ubuntu 18.04上安装WordPress
WordPress是一个非常流行的专注于博客的动态内容管理系统(CMS)。WordPress可以部署在LAMP或LEMP堆栈上。它具有的可扩展插件框架和主题系统允许网站所有者使用其简单但功能强大的发布工具。
eru
2018/09/05
7.8K0
在Ubuntu 18.04上安装WordPress
在Ubuntu 16.04上安装VNC
虚拟网络计算( Virtual Network Computing ),或称作VNC,是一种图形桌面共享系统,允许您从一台计算机远程控制另一台计算机。VNC服务器传输键盘和鼠标事件,并通过网络连接显示远程主机的屏幕,从而允许您在Linode服务器上运行完整的桌面环境。
苏易北
2018/09/11
6.2K0
在Ubuntu 16.04上安装VNC
在Ubuntu 16.04上安装MediaWiki
MediaWiki是一个流行的免费wiki软件包。它与维基百科使用的软件相同,是完全动态的,可以在LAMP堆栈上运行,利用PHP语言和MySQL数据库后端。通过简单的安装和配置,当您需要用到一个熟悉的、功能齐全的动态wiki引擎时,MediaWiki是一个很好的选择。
物花无语
2018/08/20
3.1K2
在Ubuntu 16.04上安装Java
Java是世界上最流行的编程语言之一。Java可用于创建从软件到基本Web应用程序的任何内容。
双愚
2018/09/12
1.6K0
在 Ubuntu Linux 上安装 Dropbox
下载相应的 DEB 文件。考虑到你使用的是 64 位的 Ubuntu,请获取 64 位版本的 DEB 文件。
用户9105998
2021/11/22
2.5K0
在 Ubuntu Linux 上安装 AnyDesk
AnyDesk 是一个流行的远程桌面软件,可用于 Linux、Windows、BSD、macOS 和移动平台。
用户8639654
2021/10/11
3.2K0
在Ubuntu 14.04上安装 Webmin
Webmin是一个开源的基于网页的Unix/Linux系统管理工具。通过使用Webmin,你可以在浏览器上设置和安装所有的系统服务,包括:DNS、DHCP、Apache、NFS和Samba等等。因此,有了这个,你就再也不需要去记住所有的修改配置的命令了。
星哥玩云
2022/07/01
1.8K0
在Ubuntu 14.04上安装 Webmin
在Ubuntu 18.04上安装NVIDIA
在安装之前首先就是要禁用Nouveau的驱动,禁用该驱动的方法参照这篇https://www.linuxidc.com/Linux/2019-02/157171.htm。
小陈运维
2021/10/13
1.3K0
在 Ubuntu Linux 上安装 Dropbox
下载相应的 DEB 文件。考虑到你使用的是 64 位的 Ubuntu,请获取 64 位版本的 DEB 文件。
用户1685462
2021/09/12
2.1K0
在Ubuntu 14.04上安装Caffe
http://suanfazu.com/t/ubuntu-14-04-caffe/447/1 安装依赖 sudo apt-get install libatlas-base-dev sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev sudo apt-get install libgflags-dev libgoogle-g
bear_fish
2018/09/19
1.5K0
在Ubuntu 16.04上安装Roundcube
Roundcube是一个基于网络的IMAP电子邮件客户端,提供类似于谷歌Gmail的用户界面。它是用PHP编写的服务器端应用程序,旨在访问电子邮件服务器或服务。电子邮件用户使用Web浏览器与Roundcube进行交互。
沈唁
2018/09/20
4.5K0
在Ubuntu 16.04上安装Roundcube

相似问题

Django -将产品添加到收藏列表中

12

如何在django中显示收藏夹列表

112

将用户添加到收藏夹列表中

70

如何将活动添加到收藏列表中?

13

将列表视图中的项目添加到收藏列表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文