Python 关于tf.keras中自定义层中布尔列表的一个问题

Python 关于tf.keras中自定义层中布尔列表的一个问题,python,tensorflow,keras,keras-layer,tf.keras,Python,Tensorflow,Keras,Keras Layer,Tf.keras,我正在尝试为我的模型构建一个自定义输出层,以便可以将角度范围限制在[-90,90]。代码如下: class OutputLayer(Layer): def __init__(self): super(OutputLayer, self).__init__() def call(self, inputs, **kwargs): if_larger_than_90 = (inputs > 90) if_smaller_than_

我正在尝试为我的模型构建一个自定义输出层,以便可以将角度范围限制在[-90,90]。代码如下:

class OutputLayer(Layer):
    def __init__(self):
        super(OutputLayer, self).__init__()

    def call(self, inputs, **kwargs):
        if_larger_than_90 = (inputs > 90)
        if_smaller_than_minus_90 = (inputs < -90)
        outputs = inputs - 180.0 * if_larger_than_90 + 180.0 * if_smaller_than_minus_90
        return outputs
类输出层(层):
定义初始化(自):
超级(输出层,自我)。\uuuu初始化
def呼叫(自我,输入,**kwargs):
如果_大于_90=(输入>90)
如果_小于_减去_90=(输入<-90)
输出=输入-180.0*如果大于90+180.0*如果小于90
返回输出
当我尝试运行它时,它会返回一个错误:

Traceback (most recent call last):
  File "E:/Studium/Thesis/Transfer Learning.py", line 78, in <module>
    main()
  File "E:/Studium/Thesis/Transfer Learning.py", line 73, in main
    metrics = a_new_model.evaluate(data_gen)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 833, in evaluate
    use_multiprocessing=use_multiprocessing)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 456, in evaluate
    sample_weight=sample_weight, steps=steps, callbacks=callbacks, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 396, in _model_iteration
    distribution_strategy=strategy)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 610, in _process_inputs
    training_v2_utils._prepare_model_with_inputs(model, adapter.get_dataset())
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py", line 185, in _prepare_model_with_inputs
    inputs, target, _ = model._build_model_with_inputs(dataset, targets=None)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2622, in _build_model_with_inputs
    self._set_inputs(cast_inputs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 2709, in _set_inputs
    outputs = self(inputs, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 842, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\sequential.py", line 270, in call
    outputs = layer(inputs, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 842, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\autograph\impl\api.py", line 237, in wrapper
    raise e.ag_error_metadata.to_exception(e)
TypeError: in converted code:

    E:/Studium/Thesis/Transfer Learning.py:19 call  *
        outputs = inputs - 180.0 * if_larger_than_90 + 180.0 * if_smaller_than_minus_90
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\ops\math_ops.py:924 r_binary_op_wrapper
        x = ops.convert_to_tensor(x, dtype=y.dtype.base_dtype, name="x")
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\ops.py:1184 convert_to_tensor
        return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\ops.py:1242 convert_to_tensor_v2
        as_ref=False)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\ops.py:1296 internal_convert_to_tensor
        ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\tensor_conversion_registry.py:52 _default_conversion_function
        return constant_op.constant(value, dtype, name=name)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\constant_op.py:227 constant
        allow_broadcast=True)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\constant_op.py:265 _constant_impl
        allow_broadcast=allow_broadcast))
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\tensor_util.py:449 make_tensor_proto
        _AssertCompatible(values, dtype)
    C:\ProgramData\Miniconda3\envs\TF_2G\lib\site-packages\tensorflow_core\python\framework\tensor_util.py:331 _AssertCompatible
        (dtype.name, repr(mismatch), type(mismatch).__name__))

    TypeError: Expected bool, got 180.0 of type 'float' instead.


Process finished with exit code 1
回溯(最近一次呼叫最后一次):
文件“E:/Studium/Thesis/Transfer Learning.py”,第78行
main()
文件“E:/Studium/Thesis/Transfer Learning.py”,第73行,主目录
度量=新模型。评估(数据生成)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training.py”,第833行,在evaluate中
使用多处理=使用多处理)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training\u v2.py”,第456行,在评估中
样本权重=样本权重,步长=步长,回调=回调,**kwargs)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training\u v2.py”,第396行,在模型迭代中
分销(策略=策略)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training\u v2.py”,第610行,在进程输入中
培训\u v2\u实用工具。\u准备\u模型\u和\u输入(模型,适配器。获取\u数据集())
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training\u v2\u utils.py”,第185行,在带有输入的“准备”模型中
输入,目标,u=model._使用输入构建模型(数据集,目标=None)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training.py”,第2622行,在带有输入的构建模型中
自设置输入(转换输入)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\training.py”,第2709行,在集合输入中
输出=自身(输入,**kwargs)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\base\u layer.py”,第842行,在调用中__
输出=调用fn(转换输入,*args,**kwargs)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\sequential.py”,第270行,在调用中
输出=图层(输入,**kwargs)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\keras\engine\base\u layer.py”,第842行,在调用中__
输出=调用fn(转换输入,*args,**kwargs)
文件“C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\autograph\impl\api.py”,第237行,在包装器中
将e.ag\u错误\u元数据引发到\u异常(e)
TypeError:在转换的代码中:
E:/Studium/论文/迁移学习。py:19呼叫*
输出=输入-180.0*如果大于90+180.0*如果小于90
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\ops\math\u ops.py:924 r\u binary\u op\u wrapper
x=ops.convert_to_tensor(x,dtype=y.dtype.base_dtype,name=“x”)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\ops.py:1184 convert\u to\u tensor
返回convert_to_tensor_v2(值、数据类型、首选数据类型、名称)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\ops.py:1242 convert\u to\u tensor\u v2
as_ref=False)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\ops.py:1296 internal\u convert\u to\u tensor
ret=conversion\u func(值,dtype=dtype,name=name,as\u ref=as\u ref)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\tensor\u conversion\u registry.py:52\u default\u conversion\u函数
返回常量\运算常量(值,数据类型,名称=名称)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\constant\u op.py:227 constant
允许(广播=真)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\constant\u op.py:265\u constant\u impl
允许广播=允许广播)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\tensor\u util.py:449 make\u tensor\u proto
_资产可兼容(值、数据类型)
C:\ProgramData\Miniconda3\envs\TF\u 2G\lib\site packages\tensorflow\u core\python\framework\tensor\u util.py:331\u AssertCompatible
(dtype.name、repr(不匹配)、type(不匹配)。\uu name
TypeError:应为bool,改为使用“float”类型的180.0。
进程已完成,退出代码为1

那么在Tensorflow中使用int*bool这样的命令是非法的吗?如果是这样,我如何使用其他方法实现相同的目标?

您可以将布尔值转换为浮点值:

    if_larger_than_90 = tf.keras.backend.cast(inputs > 90, "float32")
然而,对我来说,试图以这种方式限制网络似乎有点奇怪。最好构造一个能使输出保持在范围内的损耗,或者将其限制在网外。但是如果它对你有用-好的