Привет, ребята. Я хочу классифицировать собак и кошек, используя Перцептрон, но у меня есть некоторые ошибки
Сначала я беру 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
Спасибо, что прочитали это.