【问题标题】:Raise "Shapes must be equal rank" when adding regularizers to Keras layers将正则化器添加到 Keras 层时,提高“形状必须相等等级”
【发布时间】:2021-12-07 02:33:57
【问题描述】:

下面是我的代码。当我删除正则化器时,代码运行良好。如果我添加正则化器,则会引发错误,如下所示。

import pandas as pd
from tensorflow.keras import layers, Model,Input,Sequential
from tensorflow.keras.optimizers import Adam,RMSprop

def tower_tasks_model():
    input_layer_tst=Input(shape=(2,))
    #defined three towner network
    A_1_1 = layers.Dense(units=2, activation='relu', name='A_1_1', kernel_initializer='VarianceScaling',)(input_layer_tst)
    A_2_1 = layers.Dense(units=2, activation='relu', name='A_2_1', kernel_initializer='VarianceScaling',)(input_layer_tst)
    A_3_1 = layers.Dense(units=2, activation='relu', name='A_3_1',kernel_initializer='VarianceScaling',kernel_regularizer=tf.keras.regularizers.l2(1e-3), activity_regularizer=tf.keras.regularizers.l1(1e-3),)(input_layer_tst)

    A_1_1_concat = layers.Concatenate(name='A_1_1_concat')([A_1_1, input_layer_tst])
    A_2_1_concat = layers.Concatenate(name='A_2_1_concat')([A_2_1, input_layer_tst])
    A_3_1_concat = layers.Concatenate(name='A_3_1_concat')([A_3_1, input_layer_tst])

    A_1_result = layers.Dense(units=1, name='A_1', activation='sigmoid', kernel_initializer='VarianceScaling')(A_1_1_concat)
    A_2_result = layers.Dense(units=1, name='A_2', activation='sigmoid', kernel_initializer='VarianceScaling')(A_2_1_concat)
    A_3_result = layers.Dense(units=1, name='A_3', activation='sigmoid',kernel_initializer='VarianceScaling')(A_3_1_concat)

    model = Model(inputs=[input_layer_tst], outputs=[A_1_result, A_2_result, A_3_result],name='tower_result_mode')
    return model

class CustomMultiLossLayer(tf.keras.layers.Layer):
    def __init__(self, nb_outputs=3, **kwargs):
        self.nb_outputs = nb_outputs
        super(CustomMultiLossLayer, self).__init__(**kwargs)

    def focal_loss(self, y_true, y_pred, gamma, alpha):
        idx = tf.where(y_true >= 0)
        y_true = tf.gather_nd(y_true, idx)
        y_pred = tf.gather_nd(y_pred, idx)

        pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
        pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))

        pt_1 = tf.keras.backend.clip(pt_1, 1e-3, .999)
        pt_0 = tf.keras.backend.clip(pt_0, 1e-3, .999)

        return -tf.keras.backend.sum(
            alpha * tf.keras.backend.pow(1. - pt_1, gamma) * tf.keras.backend.log(pt_1)) - tf.keras.backend.sum(
            (1 - alpha) * tf.keras.backend.pow(pt_0, gamma) * tf.keras.backend.log(1. - pt_0))

    def build(self, input_shape=None):
        self.log_vars = []
        for i in range(self.nb_outputs):
            self.log_vars += [self.add_weight(name='log_var' + str(i), shape=(1,),initializer=tf.keras.initializers.Constant(1.), trainable=True)]
        super(CustomMultiLossLayer, self).build(input_shape)

    def multi_loss(self, ys_true, ys_pred):
        assert len(ys_true) == self.nb_outputs and len(ys_pred) == self.nb_outputs
        loss = 0
        for index, (y_true, y_pred, log_var) in enumerate(zip(ys_true, ys_pred, self.log_vars)):
            precision = tf.keras.backend.exp(-log_var)
            if index == 0:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.30)
            elif index == 1:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.25)
            else:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.25)
            loss += precision * single_task_loss + log_var
        return loss

    def call(self, inputs):
        ys_true = inputs[:self.nb_outputs]
        ys_pred = inputs[self.nb_outputs:]
        loss = self.multi_loss(ys_true, ys_pred)
        self.add_loss(loss, inputs=inputs)
        return tf.keras.backend.concatenate(inputs, -1)

def weigh_losses_mode(prediction_model):
    input_layer_tst=Input(shape=(2,))

    A_1_predit, A_2_predit, A_3_predit = prediction_model([input_layer_tst])
    A_1_true = Input(shape=(1,), name='A_1_true')
    A_2_true = Input(shape=(1,), name='A_2_true')
    A_3_true = Input(shape=(1,), name='A_3_true')
    out = CustomMultiLossLayer(nb_outputs=3, name='multi_loss_layer')(
        [A_1_true, A_2_true, A_3_true, A_1_predit, A_2_predit, A_3_predit])
    return Model([input_layer_tst, A_1_true, A_2_true, A_3_true], out)

tower_result_predict_model = tower_tasks_model()


train_model = weigh_losses_mode(tower_result_predict_model)
adam_optimizer = Adam(lr=0.0005)
train_model.compile(optimizer=adam_optimizer, loss=None)
train_model.summary()
a=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
b=[2,2,2,2,2,1,1,0,1,1,1,1,1,1,1,1,1]
c=[1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]
d=[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
e=[1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0]

df=pd.DataFrame({'A':a,'B':b,'C':c,'D':d,'E':e})
hist = train_model.fit(x=[df[['A','B']],  df['C'], df['D'],df['E']],batch_size=10,epochs=10,verbose=2)

错误是:

2021-10-20 16:24:42.901252: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] 未启用任何 MLIR 优化通道(已注册 2) 纪元 1/10 回溯(最近一次通话最后): 文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/IPython/core/interactiveshell.py”,第 3427 行,在 run_code 执行(code_obj,self.user_global_ns,self.user_ns) 文件“”,第 1 行,在 runfile('/Users/zhang_james/Documents/study/my_py_env/regular_t.py', wdir='/Users/zhang_james/Documents/study/my_py_env') 运行文件中的文件“/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_bundle/pydev_umd.py”,第 197 行 pydev_imports.execfile(filename, global_vars, local_vars) # 执行脚本 文件“/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py”,第 18 行,在 execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) 文件“/Users/zhang_james/Documents/study/my_py_env/regular_t.py”,第 121 行,在 hist = train_model.fit(x=[df[['A','B']], df['C'], df['D'],df['E']],batch_size=10,epochs= 10,详细=2) 文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py”,第 1100 行,适合 tmp_logs = self.train_function(迭代器) 调用中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py”,第 828 行 结果 = self._call(*args, **kwds) 文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py”,第 871 行,在 _call self._initialize(args, kwds, add_initializers_to=initializers) _initialize 中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py”,第 725 行 self._stateful_fn._get_concrete_function_internal_garbage_collected(#pylint: disable=protected-access 文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py”,第 2969 行,在 _get_concrete_function_internal_garbage_collected 图函数,_ = self._maybe_define_function(args,kwargs) _maybe_define_function 中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py”,第 3361 行 graph_function = self._create_graph_function(args, kwargs) _create_graph_function 中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/function.py”,第 3196 行 func_graph_module.func_graph_from_py_func( func_graph_from_py_func 中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py”,第 990 行 func_outputs = python_func(*func_args, **func_kwargs) 文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py”,第 634 行,位于 Wrapped_fn out = weak_wrapped_fn().wrapped(*args, **kwds) 包装器中的文件“/Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py”,第 977 行 引发 e.ag_error_metadata.to_exception(e) ValueError:在用户代码中: /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:805 train_function * 返回 step_function(自我,迭代器) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:795 step_function ** 输出 = model.distribute_strategy.run(run_step, args=(data,)) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1259 运行 返回 self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica 返回 fn(*args, **kwargs) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:788 run_step ** 输出 = model.train_step(数据) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:755 train_step 损失 = self.compiled_loss( /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/keras/engine/compile_utils.py:229 调用 reg_loss = math_ops.add_n(regularization_losses) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/util/dispatch.py​​:201 包装器 返回目标(*args,**kwargs) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/ops/math_ops.py:3572 add_n 返回 gen_math_ops.add_n(输入,名称=名称) /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/ops/gen_math_ops.py:418 add_n _, _, _op, _outputs = _op_def_library._apply_op_helper( /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/op_def_library.py:748 _apply_op_helper op = g._create_op_internal(op_type_name,输入,dtypes=None, /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py:590 _create_op_internal return super(FuncGraph, self)._create_op_internal(# pylint: disable=protected-access /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/ops.py:3528 _create_op_internal ret = 操作( /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/ops.py:2015 init self._c_op = _create_c_op(self._graph, node_def, 输入, /Users/zhang_james/software/anaconda3/lib/python3.8/site-packages/tensorflow/python/framework/ops.py:1856 _create_c_op 引发 ValueError(str(e)) ValueError:形状必须是等位的,但是是 0 和 1 将形状 1 与其他形状合并。对于 '{{node AddN}} = AddN[N=3, T=DT_FLOAT](model/tower_result_mode/A_3_1/ActivityRegularizer/truediv, A_3_1/kernel/Regularizer/mul, model/multi_loss_layer/add_5)' 输入形状:[ ]、[]、[1]。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    这个错误通常是因为计算出来的loss不是一个标量,而是一个n维张量。只需使用 tf.keras.backend.sum(*)tf.keras.backend.mean(*) 将损失减少到标量,然后它应该可以与正则化器一起使用:

    
    def multi_loss(self, ys_true, ys_pred):
        assert len(ys_true) == self.nb_outputs and len(ys_pred) == self.nb_outputs
        loss = 0
        for index, (y_true, y_pred, log_var) in enumerate(zip(ys_true, ys_pred, self.log_vars)):
            precision = tf.keras.backend.exp(-log_var)
            if index == 0:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.30)
            elif index == 1:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.25)
            else:
                single_task_loss = self.focal_loss(y_true, y_pred, gamma=4, alpha=0.25)
            loss += precision * single_task_loss + log_var
    
        return tf.keras.backend.sum(loss)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2017-07-18
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多