首先,我是新来的蟒蛇。试图建立一个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]
你的声音有点困惑关于这两个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曲线。我好心建议先得到相关的概念和概念有深刻的理解,在继续申请前...