Gui*_*aro -1 python machine-learning roc scikit-learn keras
首先,我是Python新手。尝试构建 ROC 曲线时,我在此代码行上收到错误:
fpr_keras, tpr_keras, thresholds_keras = roc_curve(Y_test.argmax(axis=1), decoded_imgs.argmax(axis=1))
Run Code Online (Sandbox Code Playgroud)
错误:
ValueError:输入形状错误(2、256、3)
当我在重塑后尝试塑造时,出现第二个错误:
类型错误:“元组”对象不可调用
我点击了这个链接,但我不明白我应该做什么,我正在解决这个问题。有人可以编辑我的代码吗?这就是我想做的: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)
Run Code Online (Sandbox Code Playgroud)
将行编辑为:
fpr_keras, tpr_keras, thresholds_keras = roc_curve(Y_test.argmax(axis=1), decoded_imgs.reshape(6,256,1))
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError:发现输入变量的样本数量不一致:[2, 4]
您听起来对 ROC 曲线和自动编码器的基础知识有点困惑......
\n\n引用自 scikit-learn文档roc_curve:
\n\n\nroc_曲线 (y_true、y_score、pos_label=无、sample_weight=无、drop_intermediate=True)
\n\n参数:
\n\ny_true :数组,形状 = [n_samples]
\n\n真正的二进制标签。如果标签不是 {-1, 1} 或 {0, 1},则应显式给出 pos_label。
\n\ny_score :数组,形状 =\n [n_samples]
\n\n目标分数可以是正类的概率估计、置信度值或决策的非阈值度量(由某些分类器上的 \xe2\x80\x9cdecision_function\xe2\x80\x9d 返回)。
\n
换句话说,两个输入都roc_curve应该是简单的一维标量数组,第一个包含真实类别,第二个包含预测分数。
现在,尽管您没有显示您自己的数据样本,并且虽然我不怀疑您Y_test.argmax(axis=1)可能符合此规范,但最肯定的是您的decoded_imgs.argmax(axis=1)(无论您如何重塑它)不符合此规范。为什么?由于自动编码器的本质。
与您还尝试在代码的(现已删除)部分中使用的随机森林分类器等模型形成鲜明对比,自动编码器不是分类器:它们的功能是重建其输入的(去噪、压缩等)版本,而不是生成类别预测(请参阅 Keras 博客中的精彩小教程以快速了解)。在您的情况下,这意味着您decoded_imgs实际上是转换后的图像(或类似图像的数据,在任何情况下),而不是 所需的类分数roc_curve,因此出现错误(从技术上讲,这实际上是由于decoded_imgs不是一个维数组,但希望你能明白)。
即使您在这里使用了分类器而不是自动编码器,您也会遇到另一个问题:ROC 曲线用于二元分类任务,而不是用于多类任务,如 MNIST(实际上有一些方法将它们应用于多分类任务)类数据也是如此,但它们并未广泛使用(AFAIK)。确实,从表面上看,scikit-learnroc_curve即使在多类设置中也能工作:
import numpy as np\nfrom sklearn import metrics\n\ny = np.array([0, 1, 1, 2, 2]) # 3-class problem\nscores = np.array([0.05, 0.1, 0.4, 0.35, 0.8])\nfpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) # works OK, no error\nRun Code Online (Sandbox Code Playgroud)\n\n但实际上这种情况发生只是因为我们明确定义了pos_label=2,因此,在幕后,scikit-learn 会考虑除2负标签之外的所有标签,然后将其余计算视为我们的问题是一个二元问题(即类2与所有其他类别相比)。
就您的情况 (MNIST) 而言,您应该问自己一个问题:10 类 MNIST 数据集中的“正”到底是什么?这个问题有意义吗?希望您能够说服自己,答案并不简单,就像二进制 (0/1) 的情况一样。
\n\n总结一下:没有编码这里没有需要纠正的你的问题的根本原因只是你尝试了一些毫无意义和无效的事情,因为自动编码器不产生类预测,因此它们的输出不能用于计算 ROC 曲线。我建议在继续应用之前首先充分理解相关概念和概念......
\n| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |