Как сделать так, чтобы моя логистика c регрессия работала быстрее? - PullRequest
0 голосов
/ 01 апреля 2020

Мой логист c Код регрессии занимает полчаса на 1000 итераций для 1000 изображений. Как сделать это быстрее. После 6000 итераций я получил точность примерно 75%. Но это заняло 3+ часа. Код уже векторизован, но все же он медленный

from PIL import Image
import numpy as np
import cv2
import os
import pickle
import sys
np.set_printoptions(threshold=sys.maxsize)
p1=open("p1.pickle","rb")
p2=open("p2.pickle","rb")
al=0.4
iteration=6000
def prep_data():
    a=cv2.imread(r"D:\New folder\New folder\cd\001cat.jpg")
    a=cv2.resize(a,(200,200))
    a=np.reshape(a,[120000,1])
    Y=np.ones((1))
    for im in os.listdir(r"D:\New folder\New folder\cd"):
        b=cv2.imread("D:\\New folder\\New folder\\cd\\" + im)
        if im[3]=='c':
            Y=np.hstack((Y,[1]))
        else:
            Y=np.hstack((Y,[0]))
        b=cv2.resize(b,(200,200))
        b=np.reshape(b,[120000,1])
        a=np.hstack((a,b))
    Y=Y.reshape(1,Y.shape[0])
    return(a,Y.shape[0],Y)
def sigmoid(x):
    return(1/(1+np.exp(-x)))
##X,ccount,Y=prep_data()
##pickle.dump([X,ccount,Y],p1)
X,ccount,Y=pickle.load(p1)
W=np.zeros(120000).reshape(120000,1)
b=0
def learn():
    global W,X,b
    for x in range(iteration):
        print("iteration "+str(x))
        Z=np.dot(W.T,X)+b
        A=sigmoid(Z)
        dZ=A-Y
        dW=(1/(ccount))*np.dot(X,dZ.T)
        dB=(1/(ccount))*np.sum(dZ)
        W=W-al*dW
        b=b-al*dB
    return(W,b)
W,b=learn()
##W,b=pickle.load(p2)
##pickle.dump([W,b],p2)
I=cv2.imread("D:\\New folder\\test1\\10.jpg")
I=cv2.resize(I,(200,200))
I=np.reshape(I,[120000,1])
print(sigmoid(np.dot(W.T,I)+b))
p1.close()
p2.close()

1 Ответ

0 голосов
/ 01 апреля 2020

Я не думаю, что вы можете оптимизировать этот код, чтобы он стал намного быстрее, но это занимает слишком много времени, вероятно, из-за размера массивов, вы можете попробовать использовать библиотеки, которые уже имеют регрессию logisti c ( scikit-learn), это, вероятно, сэкономит вам много времени.

...