TF / keras子类在Eager Execution中可以完美地工作,如果没有它,则会引发巨大的无法追踪的错误?

时间:2019-05-02 10:37:58

标签: python tensorflow keras deep-learning

我学会了从keras.io编写自定义图层。在这里:

class modrelu(Layer):
    def __init__(self, **kwargs):
        super(modrelu, self).__init__(**kwargs)

    def build(self, input_shape):
        print(input_shape)
        self.b = self.add_weight(name='brad', shape=(input_shape[0][1],), initializer='uniform',
                                      trainable=True)
        super(modrelu, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        assert isinstance(x, list)
        ip_r, ip_i = x
        comp= tf.complex(ip_r, ip_i) 
        ABS= tf.math.abs(comp)
        ANG= tf.math.angle(comp)

        ABS= tf.nn.relu( self.b + ABS) 

        op_i=  ABS * tf.sin(ANG) #K.dot ??
        op_r= ABS * tf.cos(ANG)
        return [op_r, op_i]

    def compute_output_shape(self, input_shape):
        assert isinstance(input_shape, list)
        shape_a, shape_b = input_shape
        return [shape_a, shape_b]


act= modrelu()
a=tf.constant(np.array([[1,2], [4,4]]), dtype='float32')
b=tf.constant(np.array([[3,4], [5, -1]]), dtype='float32')
act([a,b])

在急切的执行中运行时,我得到很好的输出。没有这种模式,我会得到非常奇怪的错误,我什至无法追踪到它的开始位置,它是在另一个世界中。在这里:

  

-------------------------------------------------- ---------------------------- TypeError跟踪(最近的呼叫   持续)   〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ tensor_util.py   在make_tensor_proto中(值,dtype,形状,verify_shape)       526尝试:   -> 527 str_values = [proto_values中x的compat.as_bytes(x)]       528,除了TypeError:

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ tensor_util.py   在(.0)中       526尝试:   -> 527 str_values = [proto_values中x的compat.as_bytes(x)]       528,除了TypeError:

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ util \ compat.py   以as_bytes(bytes_or_text,编码)        60引发TypeError('期望的二进制或Unicode字符串,%r'%   ---> 61(bytes_or_text,))        62

     

TypeError:预期的二进制或Unicode字符串,得到Dimension(2)

     

在处理上述异常期间,发生了另一个异常:

     

TypeError跟踪(最近的呼叫   最后)         2 a = tf.constant(np.array([[1,2 ,, [4,4]]),dtype ='float32')         3 b = tf.constant(np.array([[3,4],[5,-1]]),dtype ='float32')   ----> 4幕([a,b])

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ base_layer.py   在通话中(自己,输入,* args,** kwargs)       744#用户已经手动覆盖了构建方法,我们需要       745#建立它。   -> 746个self.build(input_shapes)       747#我们必须设置self.built,因为用户定义的构建功能不是       748#约束设置为self.built。

     

在build中(self,input_shape)         7个print(input_shape)         8 self.b = self.add_weight(name ='brad',shape =(input_shape [0] [1],),初始化='uniform',   ----> 9可训练=正确)        10#self.b = K.variable(value = np.random.rand(input_shape [0] [1])-0.5,   dtype ='float32')#        11 super(modrelu,self).build(input_shape)#一定要在最后调用它

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ base_layer.py   在add_weight(自我,名称,形状,dtype,初始值设定项,正则化器,   可训练,约束,分区器,use_resource,同步,   聚合,** kwargs)       607个collection = collections,       608同步=同步,   -> 609聚合=聚合)       610 backend.track_variable(变量)       611

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ training \ checkpointable \ base.py   在_add_variable_with_custom_getter(自身,名称,形状,dtype,   初始化程序,getter,覆盖,** kwargs_for_getter)       第637章       638名称=名称,形状=形状,dtype = dtype,初始化=初始化,   -> 639 ** kwargs_for_getter)       640       641#如果我们设置了一个初始化程序并对该变量进行了处理,则跟踪不会

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ base_layer.py   在make_variable中(名称,形状,dtype,初始值设定项,partition_info,   可训练,caching_device,validate_shape,约束,use_resource,   集合,同步,聚合,分区程序)1975
  collections = collections,1976年
  同步=同步,   -> 1977聚合=聚合)1978 return v 1979

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ variables.py   在通话中(cls,* args,** kwargs)       181 def 通话(cls,* args,** kwargs):       182如果cls是VariableV1:   -> 183 return cls._variable_v1_call(* args,** kwargs)       184个elif cls是变量:       185 return cls._variable_v2_call(* args,** kwargs)

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ variables.py   在_variable_v1_call中(cls,initial_value,可训练,集合,   validate_shape,caching_device,名称,variable_def,dtype,   Expected_shape,import_scope,约束,use_resource,   同步,聚合)       144 use_resource = use_resource,       145同步=同步   -> 146个聚合=聚合)       147       148 def _variable_v2_call(cls,

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ variables.py   在(** kwargs)中       123聚合=变量聚合(无):       124“”“调用Variable类。用于强制签名。”“”   -> 125 previous_getter = lambda ** kwargs:default_variable_creator(无,** kwargs)       ops.get_default_graph()中的getter的126._variable_creator_stack:#pylint:   禁用=受保护的访问       127 previous_getter = _make_getter(getter,previous_getter)

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ variable_scope.py   在default_variable_creator(next_creator,** kwargs)中2435
  caching_device =缓存设备,名称=名称,dtype = dtype,2436
  约束=约束,variable_def = variable_def,   -> 2437 import_scope = import_scope)2438否则:2439返回变量。RefVariable(

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ variables.py   在通话中(cls,* args,** kwargs)       185 return cls._variable_v2_call(* args,** kwargs)       186其他:   -> 187 return super(VariableMetaclass,cls)。调用(* args,** kwargs)       188       189

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ resource_variable_ops.py   在 init (自身,initial_value,可训练,集合,   validate_shape,caching_device,名称,dtype,variable_def,   import_scope,约束)       295 name = name,       296 dtype = dtype,   -> 297约束=约束)       298       299#pylint:disable = unused-argument

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ resource_variable_ops.py   在_init_from_args(自身,initial_value,可训练,集合,   validate_shape,caching_device,名称,dtype,约束)       407 with ops.name_scope(“ Initializer”),ops.device(None):       第408章   -> 409 initial_value()如果是init_from_fn否则为initial_value,       410 name =“ initial_value”,dtype = dtype)       411 self._handle = eager_safe_variable_handle(

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ base_layer.py   in()1957年Initializer = Initializer(dtype = dtype)
  第1958章真相大白   disable = g-long-lambda   -> 1959形状,dtype = dtype,partition_info = partition_info)1960 variable_dtype = dtype.base_dtype 1961如果use_resource   没有:

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ init_ops.py   在通话中(自身,形状,dtype,partition_info)       253第dtype = self.dtype       (254)第254章   -> 255个形状,self.minval,self.maxval,dtype,seed = self.seed)       256       257 def get_config():

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ random_ops.py   以random_uniform(形状,最小,最大,dtype,种子,名称)       233 maxval = 1       234,以ops.name_scope(name,“ random_uniform”,[shape,minval,maxval])作为名称:   -> 235形状= _ShapeTensor(形状)       236 minval = ops.convert_to_tensor(minval,dtype = dtype,name =“ min”)       237 maxval = ops.convert_to_tensor(maxval,dtype = dtype,name =“ max”)

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ ops \ random_ops.py   在_ShapeTensor(shape)中        其他42个:        43 dtype =无   ---> 44 return ops.convert_to_tensor(shape,dtype = dtype,name =“ shape”)        45        46

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py   在convert_to_tensor中(值,dtype,名称,preferred_dtype)1048
  名称=名称,1049 preferred_dtype = preferred_dtype,   -> 1050 as_ref = False)1051 1052

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py   在internal_convert_to_tensor(value,dtype,name,as_ref,   preferred_dtype,ctx)1144 1145如果ret为None:   -> 1146 ret = conversion_func(value,dtype = dtype,name = name,as_ref = as_ref)1147 1148如果未实现ret:

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ constant_op.py   在_constant_tensor_conversion_function(v,dtype,name,as_ref)中       第227章       第228章   -> 229返回常量(v,dtype = dtype,name = name)       230       231

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ constant_op.py   以常量(值,dtype,形状,名称,verify_shape)       206 tensor_value.tensor.CopyFrom(       第207章   -> 208值,dtype = dtype,shape = shape,verify_shape = verify_shape))       (209)第209章       210 const_tensor = g.create_op(

     

〜\ AppData \ Local \ conda \ conda \ envs \ py36 \ lib \ site-packages \ tensorflow \ python \ framework \ tensor_util.py   在make_tensor_proto中(值,dtype,形状,verify_shape)       529引发TypeError(“无法将类型为%s的对象转换为Tensor。”       530“内容:%s。考虑将元素强制转换为”   -> 531“支持的类型”。 %(类型(值),值)       532张量值_proto.string_val.extend(str_values)       533返回tensor_proto

     

TypeError:无法将类型的对象转换为Tensor。   内容:(Dimension(2),)。考虑将元素投射到受支持的对象   类型。

1 个答案:

答案 0 :(得分:2)

您将以TensorShape实例的身材出现。如果执行不急,可以使用as_list()属性将其转换为Python列表:

if tf.executing_eagerly():
    shape = (input_shape[0][1], )
else:
    shape = (input_shape[0].as_list()[1], )

在您的代码中将是这样:

import tensorflow as tf
from tensorflow.keras.layers import Layer
import numpy as np

class modrelu(Layer):
    def __init__(self, **kwargs):
        super(modrelu, self).__init__(**kwargs)

    def build(self, input_shape):
        if tf.executing_eagerly():
            shape = (input_shape[0][1])
        else:
            shape = (input_shape[0].as_list()[1], )
        self.b = self.add_weight(name='brad',
                                 shape=shape,
                                 initializer='uniform',
                                 trainable=True)
        super(modrelu, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        assert isinstance(x, list)
        ip_r, ip_i = x
        comp = tf.complex(ip_r, ip_i) 
        ABS = tf.math.abs(comp)
        ANG = tf.math.angle(comp)
        ABS = tf.nn.relu( self.b + ABS) 
        op_i =  ABS * tf.sin(ANG) #K.dot ??
        op_r = ABS * tf.cos(ANG)
        return [op_r, op_i]

    def compute_output_shape(self, input_shape):
        assert isinstance(input_shape, list)
        shape_a, shape_b = input_shape
        return [shape_a, shape_b]

act = modrelu()
a = tf.constant(np.array([[1,2], [4,4]]), dtype='float32')
b = tf.constant(np.array([[3,4], [5, -1]]), dtype='float32')
act([a,b])
# [<tf.Tensor 'modrelu_6/mul_1:0' shape=(2, 2) dtype=float32>,
#  <tf.Tensor 'modrelu_6/mul:0' shape=(2, 2) dtype=float32>]