Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow keras中用于召回的自定义宏_Tensorflow_Machine Learning_Keras_Backpropagation_Precision Recall - Fatal编程技术网

Tensorflow keras中用于召回的自定义宏

Tensorflow keras中用于召回的自定义宏,tensorflow,machine-learning,keras,backpropagation,precision-recall,Tensorflow,Machine Learning,Keras,Backpropagation,Precision Recall,我正在尝试为recall=(类的召回+类的召回)/2创建一个自定义宏。我提出了以下代码,但我不确定如何计算类0的真正数 def unweightedRecall(): def召回(y_真,y_pred): #召回第1类 真正1=K.sum(K.round(K.clip(y_pred*y_真,0,1))) 可能的正1=K.sum(K.round(K.clip(y\u true,0,1))) recall1=真阳性1/(可能阳性1+K.ε() #---在这里获得0类的真正数--- #还有,有没有更干

我正在尝试为
recall=(类的召回+类的召回)/2
创建一个自定义宏。我提出了以下代码,但我不确定如何计算类0的真正数

def unweightedRecall():
def召回(y_真,y_pred):
#召回第1类
真正1=K.sum(K.round(K.clip(y_pred*y_真,0,1)))
可能的正1=K.sum(K.round(K.clip(y\u true,0,1)))
recall1=真阳性1/(可能阳性1+K.ε()
#---在这里获得0类的真正数---
#还有,有没有更干净的方法来获取可能的积极信息0
可能的正0=K.int\u形状(y\u真)[0]-可能的正1
recall0=真阳性0/(可能阳性0+K.ε()
返回(重新调用0+重新调用1)/2
召回
似乎我必须使用
Keras.backend.equal(x,y)
,但是如何用shape
K.int\u shape(y\u true)[0]
和所有值创建一个张量,比如x


编辑1

基于Marcin的评论,我想基于keras中的回调创建一个自定义度量。同时,我遇到了f1公制的以下代码:

类度量(keras.callbacks.Callback):
_epoch_end上的def(self、batch、logs={}):
predict=np.asarray(self.model.predict(self.validation_data[0]))
targ=自我验证\u数据[1]
self.f1s=f1(目标,预测)
返回
度量=度量()
模型拟合(X_序列,y_序列,历代=历代,批量大小=批量大小,验证数据=[X_测试,y_测试],
verbose=1,回调=[metrics])
但是回调如何返回准确度呢?我想实现
unweightedrecall=(recall class1+recall class2)/2
。我可以想到下面的代码,但如果您能帮我完成,我将不胜感激

从sklearn.metrics导入召回分数
类度量(keras.callbacks.Callback):
_epoch_end上的def(self、batch、logs={}):
predict=np.asarray(self.model.predict(self.validation_data[0]))
targ=自我验证\u数据[1]
#---将结果存储在什么中---
self.XXXX=回忆分数(目标、预测、平均值=”宏观“)
#我们真的不需要归还任何东西??
返回
度量=度量()
模型拟合(X_序列,y_序列,历代=历代,批量大小=批量大小,验证数据=[X_测试,y_测试],
verbose=1,回调=[metrics])

编辑2:模型:

def createModelHelper(numNeurons=40,optimizer='adam'):
inputLayer=Input(shape=(data.shape[1],))
denseLayer1=密集(numneuron)(输入层)
outputLayer=denseLayer1(1,激活='sigmoid')(denseLayer1)
模型=模型(输入=输入层,输出=输出层)
compile(loss=unweightedRecall,optimizer=optimizer)
回归模型
keras版本(存在平均值问题)

您的两个类实际上是否只有一个维度输出(0或1)

如果是:

def recall(y_true, y_pred):
    # recall of class 1

    #do not use "round" here if you're going to use this as a loss function
    true_positives = K.sum(K.round(y_pred) * y_true)
    possible_positives = K.sum(y_true)
    return true_positives / (possible_positives + K.epsilon())


def unweightedRecall(y_true, y_pred):
    return (recall(y_true,y_pred) + recall(1-y_true,1-y_pred))/2.

现在,如果您的两个类实际上是一个2元素输出:

def unweightedRecall(y_true, y_pred):
    return (recall(y_true[:,0],y_pred[:,0]) + recall(y_true[:,1],y_pred[:,1]))/2.

回调版本

对于回调,您可以使用
LambdaCallback
,手动打印或存储结果:

myCallBack = LambdaCallback(on_epoch_end=unweightedRecall)
stored_metrics = []

def unweightedRecall(epoch,logs):
    predict = model.predict(self.validation_data[0])
    targ = self.validation_data[1]

    result = (recall(targ,predict) + recall(1-targ,1-predict))/2. 
    print("recall for epoch " + str(epoch) + ": " + str(result))
    stored_metrics.append(result)

其中,
recall
是一个使用
np
而不是
K
的函数。和
epsilon=np.finfo(float).eps
epsilon=np.finfo(np.float32.eps)

使用
keras.metrics
keras.loss
API计算
精度和
召回率时存在问题。记住-损失或度量的最终值是每个批次的平均值-但对于
精度`和
召回,批次的平均值不等于最终度量值。我建议您使用
keras.callbacks
来计算适当的值。感谢您提供的信息!非常感谢(自定义)回调的任何指针!如果很容易实现(recall class1+recall class2)/2的回调,我将非常感谢您的回答:)非常感谢您的回答!!如何将回调版本用于model.compile中的
度量
参数?我仍然不确定
metrics
参数如何将结果与度量相关联。回调将不是度量,这就是我们创建
存储的度量列表的原因。在backprop阶段,我想使用“未加权调用”来更新权重。如何使用回调函数实现这一点?根据我的理解,我可以使用第一种方法来实现这一点,方法是更新
度量
以使用
unweightedRecall
。您必须使用“丢失”功能
loss=unweightedRecall
——但这只适用于keras函数,而不适用于回调版本。你会遇到Marcin提到的问题。但这似乎不是一个相关的问题。毕竟,几乎所有的应用程序都是分批处理的。谢谢您的更正!这真的很有帮助:)