2017-02-01 5 views
2

Я пытаюсь реализовать алгоритм обучения для прогнозирования того, имеет ли изображение целевое значение 1 или 0. Во-первых, мои целевые значения устанавливаются как так ...Ошибка данных об установке scikit

real = [1] * len(images) 
fake = [0] * len(fake_images) 

total_target = real + fake 
total_target = numpy.array(total_target) 

>>> [1 1 1 ... 0 0 0 0] 

Следующая преобразовать список изображений в numpynumpy массив массивов. Поэтому я хранить каждое изображение как numpy массив ...

training_set = [] 
for image in total_images: 
    im = image.convert("L") 
    dataset = numpy.asarray(im) 
    training_set.append(dataset) 
training_set = numpy.array(training_set) 

Так training_set держит изображения. Порядок training_set соответствует порядку total_target, поэтому первое изображение в training_set соответствует первому значению в total_target, которое должно быть 1 в приведенном выше примере.

Далее я выравниваться обучающий набор ...

n_samples = len(training_set) 
data = training_set.reshape((n_samples, -1)) 

Теперь я передаю его в следующий ...

classifier = svm.SVC(gamma=0.001) 
classifier.fit(data[:n_samples-1], total_target[:n_samples-1]) 

я не включил последнего изображения и его соответствующее значение, потому что это значение, которое я хочу предсказать ...

expected = total_target[-1] 
predicted = classifier.predict(data[-1]) 

Когда я запускаю все это, я получаю следующее сообщение об ошибке. ..

Отказ Предупреждение: Передача 1-го массива в качестве устаревших данных в 0.17 и присвоение значения ValueError в 0.19. Измените свои данные либо с помощью X.reshape (-1, 1), если у ваших данных есть одна функция или X.resape (1, -1), если она содержит один образец. DeprecationWarning)

ОК, так что по ошибке он выглядит как мой total_target в неправильном формате, поэтому я добавляю следующее ...

total_target = numpy.array(total_target).reshape(-1, 1) 

Я бегу, и теперь я получаю следующее ошибки

DataConversionWarning: вектор-столбец y был передан, когда ожидался 1d-массив. Измените форму y на (n_samples), например, используя ravel(). y_ = column_or_1d (y, warn = True)

C: \ Users \ Eric \ Anaconda2 \ lib \ site-packages \ sklearn \ utils \ validation.py: 386: DeprecationWarning: передача 1-го массива в качестве устаревших данных в 0.17 и willraise ValueError в 0.19. Измените свои данные либо с помощью X.reshape (-1, 1), если у ваших данных есть одна функция или X.resape (1, -1), если она содержит один образец. DeprecationWarning)

Я попытался с помощью ravel() на total_target, но он просто возвращает меня к ошибке раньше. Я думаю, что мое форматирование неверно. Я довольно новичок в массивах numpy.

+0

'OK, так что по ошибке он выглядит как мой total_target в неправильном формате,' - Нет, scikit- узнайте, что 'data [-1]' является плоским вектором вместо 2d-массива. 'total_target' должен быть плоским вектором, и нет необходимости его изменять. – cel

ответ

1

Numpy's atleast_2d получает код для работы.

Давайте сначала произвести некоторые фиктивные данные, а именно 5 реальных и 5 поддельных 8-битных изображений из 800 строк на 1200 столбцов:

In [111]: import numpy as np 

In [112]: real, fake = 5, 5 

In [113]: rows, cols = 800, 1200 

In [114]: bits = 8 

In [115]: target = np.hstack([np.ones(real), np.zeros(fake)]) 

In [116]: np.random.seed(2017) 

In [117]: images = np.random.randint(2**bits, size=(real + fake, rows, cols)) 

In [118]: data = images.reshape(images.shape[0], -1) 

In [119]: data 
Out[119]: 
array([[ 59, 9, 198, ..., 189, 201, 38], 
     [150, 251, 145, ..., 95, 214, 175], 
     [156, 212, 220, ..., 179, 63, 48], 
     ..., 
     [ 25, 94, 108, ..., 159, 144, 216], 
     [179, 103, 217, ..., 92, 219, 34], 
     [198, 209, 177, ..., 6, 4, 144]]) 

In [120]: data.shape 
Out[120]: (10L, 960000L) 

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

In [121]: from sklearn import svm 

In [122]: classifier = svm.SVC(gamma=0.001) 

In [123]: classifier.fit(data[:-1], target[:-1]) 
Out[123]: 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
    decision_function_shape=None, degree=3, gamma=0.001, kernel='rbf', 
    max_iter=-1, probability=False, random_state=None, shrinking=True, 
    tol=0.001, verbose=False) 

Если вы попробуете теперь классифицировать последнее изображение через classifier.predict(data[-1]), то жалобщик sklearn. Для того, чтобы сделать sklearn счастливым вам просто необходимо убедиться, что данные испытаний двумерно так:

In [124]: classifier.predict(np.atleast_2d(data[-1])) 
Out[124]: array([ 1.])