Классификация кошек с использованием Perceptron в Python - PullRequest
0 голосов
/ 29 апреля 2019

Привет, ребята. Я хочу классифицировать собак и кошек, используя Перцептрон, но у меня есть некоторые ошибки Сначала я беру 20 изображений с тренировочного набора, 10 кошек, затем 10 собак, кошки помечены как ноль y_train.append(0), а собаки помечены как один y_train.append(1)

x_train,y_train = [],[]
for i in range(10):
    img = cv2.imread('C:\\Users\\Hi-XV\\Desktop\\dogs-vs-cats-redux-kernels-edition\\train\\cat.' + str(i) + '.jpg')
    img = cv2.resize(img,(64,64))
    x_train.append(img)
    y_train.append(0)
    img2 = cv2.imread('C:\\Users\\Hi-XV\\Desktop\\dogs-vs-cats-redux-kernels-edition\\train\\dog.' + str(i) + '.jpg')
    img2 = cv2.resize(img,(64,64))
    x_train.append(img2)
    y_train.append(1)

Вот как я это обрабатываю:

x_train = np.array(x_train)
y_train = np.array(y_train)
y_train = y_train.reshape(-1, 1)

x_train_flatten = x_train.reshape(x_train.shape[0], -1).T
x_train = x_train_flatten / 255

Это моя сигмоидальная функция, всегда возвращающая значение от 0 до 1:

def sigmoid(self,z):
    return 1/(1+np.exp(-z))

Это моя функция обратного распространения:

def propaganate(self,X,Y,w,b):
    A = self.sigmoid(np.dot(w.T,X) +b)
    m = X.shape[1]
    dw = np.dot(X, (A - Y).T) / m
    db = np.sum(A-Y)/m
    cost = (-1  / m) * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))
    return dw,db,cost

Это моя основная функция с градиентным спуском:

def optimize(self,learningRate=0.005,steps=2000):
    X = self.x_train
    Y = self.y_train
    w = self.w
    b = self.b
    costs =[]
    for i in range(steps):
        dw,db,cost =self.propaganate(X,Y,w,b)

        w = w - learningRate*dw
        b = b - learningRate*db
        if i%100 ==0:
            costs.append(cost)
            print('cost after %i: %f' %(i,cost))
    return w,b

Это моя функция прогнозирования:

def predict(self,image):
    w,b = self.optimize()
    m = image.shape[1]
    w = w.reshape((image.shape[0],-1))
    Y_prediction = np.zeros((1,m))
    A = self.sigmoid(np.dot(w.T,image)+b)
    for i in range(A.shape[1]):
        Y_prediction[0,i] =A[0,i]
    print(Y_prediction)
    return Y_prediction

Наконец-то я звоню pct.predict(predict_imgs) и вот как он записывает:

стоимость после 0: 13.862944 стоимость после 100: 0,017974 стоимость после 200: 0,011118 стоимость после 300: 0,008078 стоимость после 400: 0,006354 стоимость после 500: 0,005242 стоимость после 600: 0,004465 стоимость после 700: 0,003890 стоимость после 800: 0,003447 стоимость после 900: 0,003096 стоимость после 1000: 0,002810 стоимость после 1100: 0,002573 стоимость после 1200: 0,002373 стоимость после 1300: 0,002202 стоимость после 1400: 0,002054 стоимость после 1500: 0,001926 стоимость после 1600: 0,001812 стоимость после 1700: 0,001711 стоимость после 1800: 0,001621 стоимость после 1900 года: 0,001540

Таким образом, стоимость представляется правильной, поскольку она почти равна 0 Но потом я предсказываю один образ собаки, и вот как я это делаю:

predict_imgs = []
pd_img = cv2.imread('C:\\Users\\Hi-XV\\Desktop\\dogs-vs-cats-redux-kernels- 
edition\\train\\dog.1.jpg')
pd_img = cv2.resize(pd_img,(64,64))
predict_imgs.append(pd_img)
predict_imgs = np.array(predict_imgs)

predict_imgs_flatten = predict_imgs.reshape(pd_img.shape[0],-1).T
predict_imgs = predict_imgs_flatten/255
pct.predict(predict_imgs)

Вот как он вошел:

[[0,47129622 0,47146358 0,47072547 0,46926181 0,46849233 0,4705466 0,4713464 0,47103178 0,47406489 0,47669844 0,47609287 0,47602436 0,47432492 0,46869344 0,4653232 0,46576656 0,46390416 0,46274703 0,46455358 0,46425507 0,46637787 0,46493939 0,46585933 0,46551723 0,46313767 0,46074716 0,45894883 0,45560602 0,45442201 0,45338179 0,45419183 0,45414762 0,45349525 0,45224447 0,45072343 0,45040515 0,44871289 0,44694917 0,44369839 0,44729202 0,44997111 0,44890832 0,44254292 0,43972149 0,4354109 0,43391902 0,43312538 0,43134105 0,42976022 0,42922733 0,42829998 0,42911856 0,42773902 0,42823065 0,4274165 0,42786264 0,42790718 0,42816487 0,42216149 0,41795934 0,41516696 0,41230804 0,41243036 0,41221888]]

Я пробовал с изображением кошки:

[[0,46602192 0,46570703 0,46540704 0,4669786 0,46794146 0,46773242 0,4684889 0,4683816 0,46921272 0,46943627 0,46954064 0,47158274 0,4749414 0,47375206 0,47201231 0,47086452 0,47094515 0,47293698 0,47381821 0,47411287 0,47467158 0,47491538 0,47760668 0,47640458 0,47514657 0,47359331 0,47391838 0,47318598 0,47173989 0,47296217 0,47173741 0,47185791 0,47241618 0,47475851 0,47406301 0,4755808 0,47666993 0,47613153 0,47499163 0,475437 0,47435883 0,47370117 0,47281707 0,47372429 0,47287648 0,47400302 0,47556063 0,47517845 0,47593115 0,47595672 0,47693075 0,47990405 0,47702912 0,47646767 0,47643149 0,47786475 0,47577853 0,47806219 0,4775023 0,47835029 0,47919827 0,48055778 0,48172249 0,48003663]]

Почти то же самое с изображением собаки выше. Здесь что-то не так. Мне нужна помощь. Это мой полный код:

https://github.com/lanlehoang67/PerceptronDogCatClassification/blob/master/perceptron.py

Это набор данных:

https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data

Спасибо, что прочитали это.

1 Ответ

0 голосов
/ 29 апреля 2019

Модели Perceptron не соответствуют требованиям классификации изображений. Ваши данные не являются линейно разделимыми и многомерными, с теоретической точки зрения простой алгоритм Perceptron не имеет оснований для хорошей работы. Обычно для классификации изображений используются сверточные нейронные сети или, по крайней мере, многослойный персептрон (даже если он не очень производительный).

Если вы знали об этом и задали вопрос о самом коде, я могу углубиться в ваш код.

...