Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Python 多标签分类:keras自定义指标_Python_Tensorflow_Machine Learning_Keras - Fatal编程技术网

Python 多标签分类:keras自定义指标

Python 多标签分类:keras自定义指标,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,语境化 我正在研究图像的多标签分类问题。我试图预测39种标签。换言之,我试图确定39个特征中的哪一个出现在给定的图像中(在一张图像中可以找到许多特征,这就是为什么我处于多标签分类状态。 数据 我的输入数据是(X,Y):X是形状(1814204,3),Y是形状(1814,39)。因此,基本上X是图像集,Y是与每个图像相关的标签,用于监督学习过程 型号 我正在构建一个卷积神经网络来进行预测。对于这个任务,我正在使用Keras来创建我的模型 我所做的 为了验证我的模型,我需要选择一个度量值。但是,在我

语境化
我正在研究图像的多标签分类问题。我试图预测39种标签。换言之,我试图确定39个特征中的哪一个出现在给定的图像中(在一张图像中可以找到许多特征,这就是为什么我处于多标签分类状态。
数据
我的输入数据是(X,Y):X是形状(1814204,3),Y是形状(1814,39)。因此,基本上X是图像集,Y是与每个图像相关的标签,用于监督学习过程

型号
我正在构建一个卷积神经网络来进行预测。对于这个任务,我正在使用Keras来创建我的模型

我所做的
为了验证我的模型,我需要选择一个度量值。但是,在我的情况下,Keras中可用的度量值是不相关的,并且不会帮助我验证我的模型,因为我处于多标签分类的情况。这就是为什么我决定创建我的自定义度量值。我创建了应用于Y和Y_predi列的召回和精度度量值换言之,我将计算39个类别中每个类别的召回率和准确率。下面是我的度量标准代码:

def召回(y_true,y_pred):
#召回度量。
真正=K.sum(K.round(K.clip(y_真*y_pred,0,1)),轴=0)
可能的正=K.sum(K.round(K.clip(y_true,0,1)),轴=0)
回忆=真阳性/(可能阳性+K.epsilon())
召回
def精度(y_真,y_pred):
#精度度量。
真正=K.sum(K.round(K.clip(y_真*y_pred,0,1)),轴=0)
预测正=K.sum(K.round(K.clip(y\u pred,0,1)),轴=1)
精度=真正/(预测正+K.ε()
返回精度
我的向量Y是形状(n,39),这就是为什么我在轴=0上进行运算。换句话说,对于每个标签,我计算精度和召回率

下一步,我通过将其精确到keras fit函数来调用这两个度量。换句话说,我使用了以下代码行:

model.compile(loss='binary\u crossentropy',optimizer=sgd,metrics=[精度,召回率])
构建、编译和装配模型的代码:
这是我用来构建模型的代码,训练它+它的结果。(我没有把代码中我把数据分成训练和验证的部分:训练1269个样本,验证545个样本)

#型号:CNN
模型=顺序()
add(Conv2D(32,(3,3),input_shape=(204,204,3),padding='same',activation='relu',kernel_constraint=maxnorm(3)))
模型。添加(辍学(0.2))
add(Conv2D(32,(3,3),activation='relu',padding='same',kernel_constraint=maxnorm(3)))
add(MaxPooling2D(池大小=(2,2)))
model.add(展平())
add(密集(512,activation='relu',kernel_constraint=maxnorm(3)))
模型。添加(辍学率(0.5))
模型.添加(密度(39))
添加(激活('sigmoid'))
#编译模型
纪元=5
lrate=0.001
衰变=lrate/时代
sgd=sgd(lr=lrate,动量=0.9,衰变=衰变,nesterov=False)
compile(loss='binary\u crossentropy',optimizer=sgd,metrics=[精度,召回率])
#拟合模型
model.fit(X_序列,Y_序列,epochs=epochs,batch_size=32,validation_数据=(X_有效,Y_有效))
结果

对1269个样本进行训练,对545个样本进行验证
纪元1/5
96/1269[=>………]-预计到达时间:6:40-损失:0.6668-精度:0.1031-召回率:0.2493
议题/问题
问题1:在结果部分的日志中,有精度和召回值。我不知道为什么我得到的是真实值而不是向量值。我构建两个度量的方式应该给我一个形状数组(1,39)表示精度和(1,39)对于包含每个类的精度和召回率的召回,输出仍然只是一个数字?

问题2:这些由日志给出的精度和召回率值代表了对大小=批次的数据的度量计算?我如何计算一个历元的度量(作为一个信息,哪一个比一个批次的计算更有用?有些人可能会说,只计算所有批次的平均值?当然,这是我的想法,但我不知道怎么做,因为KERAS对我来说有点像一个黑匣子,我不知道“幕后”到底发生了什么,以便跟踪/修改适当的部分。)关于代码?

我认为您使用的是
tensorflow
后端。实际上,您可以通过
tf.py_func
调用
sklearn
度量来使用
sklearn.metrics
,将
python
函数扭曲为
tf
函数

对于Q1,您看到的实际值实际上是度量向量的平均值


对于第二季度。它应该是整个验证阶段的平均分数。

为了补充所说的内容,Keras在每个验证批次结束时计算指标,因此您的召回率和准确率会产生误导。这就是为什么它们会从Keras 2中删除。您需要创建一个Keras回调,该回调将传递整个验证阶段在每个历元结束时收集数据并计算度量(在代码中,这在回调的on_epoch_end部分内)。并且,尽管代码可能稍微过时。其中,他们使用on_epoch_end方法附加许多度量

关于向量作为浮点返回的问题

返回:表示输出数组平均值的单个张量值 跨越所有数据点

我假设这样做是为了方便和简单,因为绝大多数指标都需要平均结果向量,但这可能是Keras团队修改的结果。

对于第一季度,为什么是Ker