Sci-kit Learn Confusion Matrix: найдены входные переменные с непоследовательным количеством образцов - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь построить матрицу путаницы между предсказанными метками теста и фактическими, но я получаю эту ошибку

ValueError: Найдены входные переменные с несовместимым количеством образцов: [1263, 12630]

Набор данных: GTSRB

Используемый код

Увеличение изображения

train_datagen = ImageDataGenerator(rescale=1./255,
                            rotation_range=20,
                            horizontal_flip=True,
                            width_shift_range=0.1,
                            height_shift_range=0.1,
                            shear_range=0.01,
                            zoom_range=[0.9, 1.25],
                            brightness_range=[0.5, 1.5])

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator и test_generator

batch_size = 10

train_generator = train_datagen.flow_from_directory(
    directory=train_path,
    target_size=(224, 224),
    color_mode="rgb",
    batch_size=batch_size,
    class_mode="categorical",
    shuffle=True,
    seed=42
)

test_generator = test_datagen.flow_from_directory(
    directory=test_path,
    target_size=(224, 224),
    color_mode="rgb",
    batch_size=batch_size,
    class_mode="categorical",
    shuffle=False,
    seed=42
)

Вывод этого кода

Найдено 39209 изображений, относящихся к 43 классам.

Найдено 12630 изображений, относящихся к 43 классам.

Затем я использовал модель VGG-16 и заменил последний плотный слой на Dense(43, activation='softmax')

Сводка модели

_________________________________________________________________ 
Layer (type)                 Output Shape              Param #   
================================================================= 
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________ 
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________ 
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________ 
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________ 
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________ 
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________ 
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________ 
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________ 
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________ 
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________ 
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________ 
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________ 
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________ 
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________ 
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________ 
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________ 
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________ 
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________ 
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________ 
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________ 
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________ 
predictions (Dense)          (None, 1000)              4097000   
_________________________________________________________________ 
dense_1 (Dense)              (None, 43)                43043     
================================================================= 
Total params: 138,400,587 
Trainable params: 43,043 
Non-trainable params: 138,357,544
_________________________________________________________________

Скомпилируйте модель

my_sgd = SGD(lr=0.01)

model.compile(
    optimizer=my_sgd,
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

Поезд модели

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
epochs=10
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    epochs=epochs, 
                    verbose=1
)

Прогнозы

STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
test_generator.reset()

predictions = model.predict_generator(test_generator, steps=STEP_SIZE_TEST, verbose=1)

Вывод

1263/1263 [=============================] -229 с 181 мс / шаг

Печать формы прогнозов (вести на будущее)

(12630, 43)

Получение test_data и test_labels

test_data = []
test_labels = []
batch_index = 0

while batch_index <= test_generator.batch_index:
    data = next(test_generator)
    test_data.append(data[0])
    test_labels.append(data[1])
    batch_index = batch_index + 1

test_data_array = np.asarray(test_data)
test_labels_array = np.asarray(test_labels)

Форма test_data_array и test_labels_array

test_data_array.shape

(1263, 10, 224, 224, 3)

test_labels_array.shape

(1263, 10, 43)

Матрица путаницы

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(test_labels_array, predictions)

Я получаю вывод

ValueError: Найдены входные переменные с непоследовательным количеством выборок: [1263, 12630]

Iпонять, что эта ошибка связана с тем, что размер test_labels_array не равен прогнозам;1263 и 12630 соответственно, но я действительно не знаю, что я делаю неправильно.

Любая помощь будет высоко ценится.

PS: Если у кого-нибудь есть какие-либо советы о том, как увеличитьТочность обучения, пока мы на нем, это было бы замечательно.

Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Вы должны изменить форму test_data_array и test_labels_array следующим образом:

data_count, batch_count, w, h, c = test_data_array.shape

test_data_array=np.reshape(test_data_array, (data_count*batch_count, w, h, c))
test_labels_array = np.reshape(test_labels_array , (data_count*batch_count, -1))

то, как вы добавляете результаты test_generator, является причиной.Фактически, первый вызов вашего test_generator сгенерирует 10 данных в форме (224, 224, 3).Для следующего вызова ваш test_generator сгенерирует 10 данных в форме (224, 224, 3).Итак, теперь у вас должно быть 20 данных формы (224, 224, 3), в то время как способ добавления результатов приведет к тому, что вы получите 2 данных формы (10, 224, 224, 3).это не то, что вы ожидаете.

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