我学会了从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),)。考虑将元素投射到受支持的对象 类型。
答案 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>]