ValueError: неправильная форма ввода (2, 256, 3) при попытке вычислить ROC-кривую - PullRequest
0 голосов
/ 09 февраля 2019

Во-первых, я новичок в Python.Пытаясь построить кривую ROC, я получаю сообщение об ошибке в этой строке кода:

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

error:

ValueError: неверная форма ввода (2, 256, 3)

Когда я пытаюсь изменить форму после изменения формы, я получаю вторую ошибку:

TypeError: объект 'tuple' не вызывается

Я следовалэто ссылка , но я не понимаю, что мне делать, я стекаюсь по этой проблеме.Может кто-нибудь отредактировать мой код?Вот что я пытаюсь сделать: 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]

1 Ответ

0 голосов
/ 09 февраля 2019

Вы немного озадачены тем, что знаете об основах кривых ROC и автоэнкодеров ...

Цитирование из документации scikit-learn из roc_curve:

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

Параметры:

y_true: массив, форма = [n_samples]

Истинные двоичные метки.Если метки не являются {-1, 1} или {0, 1}, тогда явно указывается pos_label.

y_score: array, shape = [n_samples]

Целевые оценки могут быть оценками вероятности положительного класса, доверительными значениями илимера решений, не имеющая порогового значения (возвращаемая функцией «function_function» для некоторых классификаторов).

Другими словами, оба входа в roc_curve должны быть простыми одномерными массивами скалярных чисел, первоеодин содержит истинные классы, а второй - прогнозируемые баллы.

Теперь, несмотря на то, что вы не показываете образец своих собственных данных, и хотя я не сомневаюсь, что ваш Y_test.argmax(axis=1) может соответствовать этой спецификации, скорее всего, ваш decoded_imgs.argmax(axis=1) (однакоВы изменили это) не .Зачем?Из-за самой природы автоэнкодера.

В отличие от моделей, подобных классификатору Random Forest, вы также пытаетесь использовать в (теперь удаленной) части вашего кода, автоэнкодеры не являются классификаторами : их функция состоит в том, чтобы восстановить (введенную в исходное состояние, сжатую и т. д.) версию их входных данных, а , а не для создания предсказаний классов (см. небольшой учебник в блоге Keras для быстрого ознакомленияориентация).Что, в вашем случае, означает, что ваши decoded_imgs на самом деле являются преобразованными изображениями (или изображениями, подобными данным, в любом случае), а не оценками класса, требуемыми для roc_curve, следовательно, ошибка (которая, технически говоря, на самом делеиз-за того, что decoded_imgs не является одномерным массивом, но, надеюсь, вы поняли).

Даже если бы вы использовали классификатор вместо автоэнкодера здесь, вы бы столкнулись с другой проблемой: кривые ROCиспользуются для бинарных классификационных задач, а не для многоклассовых, таких как MNIST (на самом деле есть некоторые подходы, применяющие их к мультиклассовым данным, но они не используются AFAIK широко).Это правда, что внешне roc_curve scikit-learn будет работать даже в мультиклассовой настройке:

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) вы должны задать себе вопрос: что именно является "положительным" в наборе данных MNIST из 10 классов? И имеет ли этот вопрос смысл? Надеюсь, вы сможете убедить себя, что ответ не простой, как в двоичном (0/1) случае.


Подведем итог: кодировка отсутствует1075 * ошибка здесь для исправления;Основная причина вашей проблемы заключается в том, что вы пытаетесь сделать что-то бессмысленное и недопустимое, поскольку авто-кодеры не генерируют предсказания классов, поэтому их выходные данные нельзя использовать для вычисления кривой ROC.Я любезно предлагаю сначала получить четкое представление о соответствующих понятиях и концепциях, прежде чем переходить к заявкам ...

...