在Python中使用Perceptron进行狗猫分类

时间:2019-04-29 08:57:02

标签: python machine-learning neural-network classification perceptron

嗨,我想使用Perceptron对猫和狗进行分类,但是我遇到了一些错误 首先,我从训练集中拍摄了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

这是我的sigmoid函数,总是返回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 :(得分:0)

感知器模型在图像分类上不起作用。从理论上讲,您的数据不是线性可分离的并且是高维的,简单的Perceptron算法没有理由表现良好。通常,使用卷积神经网络对图像或至少是多层感知器进行分类(即使它们也不是很有效)。

如果您意识到了这一点,并且正在询问有关代码本身的问题,那么我可以更深入地了解您的代码。