ValueError异常:坏输入形状(2,256,3)试图计算时ROC曲线

问题描述 投票:-1回答:1

首先,我是新来的蟒蛇。试图建立一个ROC曲线,我在这行代码得到一个错误:

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

错误:

ValueError异常:坏输入形状(2,256,3)

当我尝试重塑后,我收到了第二个错误塑造:

类型错误:“元组”对象不是可调用

我跟着这个link,但我不知道我应该怎么做,我堆叠在这个问题上。有人可以修改我的密码?这就是我想要做的事:link2

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]

python machine-learning keras scikit-learn roc
1个回答
2
投票

你的声音有点困惑关于这两个ROC曲线和自动编码非常基本的...

从报价scikit学习documentation roc_curve的:

roc_curve(y_true,y_score,pos_label =无,sample_weight =无,drop_intermediate =真)

参数:

y_true:阵列,形状= [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博客的可爱的小tutorial的快速定位)。其中,在你的情况下,意味着你decoded_imgs实际上是变换图像(或图像数据等,在任何情况下),而不是由roc_curve所需的类的得分,因此误差(其,从技术上来说,实际上是由于decoded_imgs不作为一个一维数组,但希望你的想法)。

即使你已经在这里使用的分类,而不是自动编码器,你会在另一个问题碰着:ROC曲线用于二进制分类任务,而不是为多级的,如MNIST(实际上有把它们应用到多一些的方法-class数据太多,但他们没有被广泛使用AFAIK)。的确,从表面上看,scikit学习的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学习认​​为其他所有的标签比2为消极的,并随后把该计算的其余部分,如果我们的问题是一个二进制(即类2 VS所有其他类)。

在你的情况(MNIST),你应该问自己一个问题:到底什么是“积极的”,在10级MNIST数据集?而没有这个问题,甚至有意义吗?我们希望,你应该能够说服自己的答案并不简单,因为在二进制(0/1)的情况下。


要总结会:没有编码错误在这里予以纠正;您的问题的根本原因很简单,你尝试一些毫无意义的,无效的,因为自动编码不产生类的预测,因此它们的输出不能用于计算ROC曲线。我好心建议先得到相关的概念和概念有深刻的理解,在继续申请前...

© www.soinside.com 2019 - 2024. All rights reserved.