ValueError:尝试计算ROC曲线时,输入形状(2256,3)不正确



首先,我是python的新手。试图构建ROC曲线,我在这条代码线上遇到了一个错误:

fpr_keras, tpr_keras, thresholds_keras = roc_curve(Y_test.argmax(axis=1), decoded_imgs.argmax(axis=1))

错误:

ValueError:错误的输入形状(2256,3)

当我在整形后尝试整形时,我得到了第二个错误:

TypeError:"tuple"对象不可调用

我关注了这个链接,但我不明白该怎么办,我正在处理这个问题。有人能编辑我的代码吗?这就是我要做的:链接2

import keras
import numpy as np
from keras.datasets import mnist
from get_dataset import get_dataset
from stack import keras_model
X_train, X_test, Y_train, Y_test = get_dataset()
from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, Dense
from keras.models import Model
input_img = Input(shape=(256, 256, 3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='rmsprop', loss='mae',metrics=['mse', 'accuracy'])
from keras.callbacks import ModelCheckpoint, TensorBoard
checkpoints = []
from keras.preprocessing.image import ImageDataGenerator
generated_data = ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, rotation_range=0,  width_shift_range=0.1, height_shift_range=0.1, horizontal_flip = True, vertical_flip = False)
generated_data.fit(X_train)
epochs = 1
batch_size = 5
autoencoder.fit_generator(generated_data.flow(X_train, X_train, batch_size=batch_size), steps_per_epoch=X_train.shape[0]/batch_size, epochs=epochs, validation_data=(X_test, X_test), callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])
autoencoder.fit(X_train, X_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, X_test), shuffle=True, callbacks=[TensorBoard(log_dir='/tmp/auti')])
decoded_imgs = autoencoder.predict(X_test)
from sklearn.metrics import roc_curve
#2 256  3
print(decoded_imgs.argmax(axis=1))
print(decoded_imgs.argmax(axis=1).reshape(1,3))
fpr_keras, tpr_keras, thresholds_keras = roc_curve(Y_test.argmax(axis=1), decoded_imgs.argmax(axis=1))
ValueError: bad input shape (2, 256, 3)    

编辑行后:

fpr_keras, tpr_keras, thresholds_keras = roc_curve(Y_test.argmax(axis=1), decoded_imgs.reshape(6,256,1)) 

我得到这个错误:

ValueError:发现样本数不一致的输入变量:[2,4]

对于ROC曲线和自动编码器的基础知识,您听起来有点困惑。。。

引用scikit学习roc_curve:文档

roc_curve (y_true,y_score,pos_label=None,sample_weight=None,drop_intermediate=true)

参数:

y_true:数组,shape=[n_samples]

真二进制标签。如果标签不是{-1,1}或{0,1},则应显式给定pos_label。

y_score:数组,形状=[n_samples]

目标分数可以是正类的概率估计、置信值,也可以是决策的非阈值度量(如由某些分类器上的"decision_function"返回)。

换句话说,roc_curve的两个输入都应该是简单的一维标量数组,第一个包含真实类,第二个包含预测分数。

现在,尽管您没有显示自己的数据样本,而且我毫不怀疑您的Y_test.argmax(axis=1)可能符合此规范,但最肯定的是,您的decoded_imgs.argmax(axis=1)(无论您如何重塑它)不符合。为什么?因为自动编码器的本质。

与你试图在代码的一部分(现已删除)中使用的随机森林分类器等模型形成鲜明对比的是,自动编码器不是分类器:它们的功能是重建输入的(去噪、压缩等)版本,而不是来生成类预测(请参阅Keras博客中的漂亮小教程了解快速方向)。在你的情况下,这意味着你的decoded_imgs实际上是经过变换的图像(或者在任何情况下都是类似图像的数据),而不是roc_curve所要求的类分数,因此出现了错误(从技术上讲,这实际上是由于decoded_imgs不是一维数组,但希望你能理解)。

即使你在这里使用了分类器而不是自动编码器,你也会遇到另一个问题:ROC曲线用于二进制分类任务,而不是用于多类任务,如MNIST(实际上也有一些方法将它们应用于多类数据,但它们并没有广泛使用AFAIK)。的确,从表面上看,scikit learn的roc_curve即使在多类环境中也能工作:

import numpy as np
from sklearn import metrics
y = np.array([0, 1, 1, 2, 2]) # 3-class problem
scores = np.array([0.05, 0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)  # works OK, no error

但实际上,这只是因为我们已经明确定义了pos_label=2,因此,在幕后,scikit learn将2以外的所有标签都视为负标签,并随后将剩余的计算视为二进制问题(即类2与所有其他类)。

在您的案例(MNIST)中,您应该问自己一个问题:在10类MNIST数据集中,什么是"正">这个问题有意义吗希望你能说服自己,答案并不简单,就像二进制(0/1)的情况一样。


总结:此处没有需要纠正的编码错误;问题的根本原因只是你尝试了一些没有意义和无效的东西,因为自动编码器不会产生类预测,因此它们的输出不能用于计算ROC曲线。我建议在进行应用之前,首先对相关概念和概念有一个坚实的理解。。。

相关内容

  • 没有找到相关文章

最新更新