【问题标题】:Custom accuracy in tff federated learning using keras.metric使用 keras.metric 在 tff 联合学习中自定义准确度
【发布时间】:2022-08-20 00:07:48
【问题描述】:
class BinaryTruePositives(tf.keras.metrics.Metric):

    def __init__(self, name=\'binary_true_positives\', **kwargs):
        super(BinaryTruePositives, self).__init__(name=name, **kwargs)
        self.true_positives = self.add_weight(name=\'tp\', initializer=\'zeros\')

    def update_state(self, y_true, y_pred, sample_weight=None):
    
        y_true = tf.squeeze(y_true)
   
        y_pred = tf.sign(y_pred)

        y_pred=tf.reshape(y_pred,[-1])
  
    
        self.true_positives.assign_add(tf.keras.backend.mean(tf.keras.backend.equal(y_true, 
        y_pred)))

    def result(self):
        return self.true_positives

    def reset_states(self):
        self.true_positives.assign(0)


    def model_fn():
        keras_model = create_keras_model()
        return tff.learning.from_keras_model(keras_model,
        input_spec=preprocessed_example_dataset.element_spec,
        loss=tf.keras.losses.MSE,
        metrics=[BinaryTruePositives()])
TypeError: Expected tensorflow.python.keras.losses.Loss or collections.abc.Sequence, found function.

    标签: python tensorflow keras tensorflow-federated


    【解决方案1】:

    更多的堆栈跟踪在这里可能有用,但我相信上面代码中的问题是tf.keras.losses.MSE 是一个功能定义损失逻辑,而不是 tf.keras.losses.Loss 本身的实例。

    查看旧版本的 TFF,您似乎正在点击 this line,但请注意,使用较新版本的 TFF 会出现不同的错误(我相信您会点击 this line)。

    您可以通过传递来解决此问题

    loss=tf.keras.losses.MeanSquaredError()
    

    而不是上面model_fn 中的现有损失参数。

    【讨论】:

    • 嗨基思拉什,谢谢您的回复。 tff 的自定义精度仅适用于二进制类,但是当我尝试多类时,它会引发形状错误,我试图重塑 y_true 但没有奏效。相同的自定义精度在没有联合学习的情况下也可以工作。你能看看这个吗?再一次感谢你。
    【解决方案2】:
    class BinaryTruePositives(tf.keras.metrics.Metric):
    
        def __init__(self, name='Results', **kwargs):
            super(BinaryTruePositives, self).__init__(name=name, **kwargs)
            self.true_positives = self.add_weight(name='tp', initializer='zeros')
    
        def update_state(self, y_true, y_pred, sample_weight=None):
            
            y_true=tf.reshape(y_true, [16, 4])
            
            y_true=tf.cast(y_true, dtype=tf.float32)
            
            y_true = tf.squeeze(y_true)
            
            print("before pred")
            
            tf.print(y_pred)
     
            y_pred = tf.sign(y_pred)
            print("pred after sign")
            tf.print(y_pred)
            print("true")
            tf.print(y_true)
            
            equal_t = tf.equal(y_true, y_pred)
            
            reduce_t = tf.reduce_all(equal_t, axis=1)
            
            tf.print(reduce_t)
            
            z=tf.keras.backend.mean(reduce_t)
            
            tf.print(z)
    
            self.true_positives.assign_add(z)
            
    
        def result(self):
            return self.true_positives
    
        def reset_states(self):
            self.true_positives.assign(0.)
    
        It worked. but now it throws an error of shape. Even though I reshape 
        y_true. 
    
        Batch_size=16
    
        After printing, it displays first batch size results and then the error.
        [[-0.00392384036 0.0555611625 0.0308244769 -0.0159802306]
        [-0.0485811867 -0.0572906882 -0.0325558931 0.00928601343]
        [-0.0213074014 -0.0333432704 0.0229184721 -0.0973156691]
        ...
        [-0.116143309 0.0813855231 -0.114974774 0.0727083907]
        [0.00289174495 0.0473632365 -0.0516404174 -0.0565651]
        [-0.043574594 -0.0561362281 0.0185791403 -0.0167554729]]
        [[-1 1 1 -1]
        [-1 -1 -1 1]
        [-1 -1 1 -1]
        ...
        [-1 1 -1 1]
        [1 1 -1 -1]
        [-1 -1 1 -1]]
        [[1 -1 1 -1]
        [1 1 1 1]
        [-1 -1 1 1]
        ...
        [1 1 1 1]
        [-1 -1 1 1]
        [-1 1 -1 1]]
        [0 0 0 ... 0 0 0]
        0.0625
    
    
        InvalidArgumentError:  [_Derived_]  Incompatible shapes: [64] vs. [16,4]
         [[{{node 
          StatefulPartitionedCall/StatefulPartitionedCall/mean_squared_error/Squa 
          redDifference}}]]
         [[StatefulPartitionedCall]]
         [[import/StatefulPartitionedCall_1/ReduceDataset]] 
        [Op:__inference_wrapped_function_48795]
    
        Function call stack:
        wrapped_function -> wrapped_function -> wrapped_function
    
        I am trying for multi classifications and classes are defined as 
        z=[]
        for i in range(len(y_train)):
            print(I)
            if y_train[i] == 0:
                z.append([1, 1, 1, 1])
            elif y_train[i] == 1:
                z.append([-1, -1, -1, -1])
            elif y_train[i] == 2:
                z.append([1,-1, 1, -1])
            elif y_train[i] == 3:
                z.append([-1, 1, -1, 1])
            elif y_train[i] == 4:
                z.append([1, 1, -1, -1])
            else:
                z.append([-1, -1, 1, 1])
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2021-06-26
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多