【发布时间】:2020-07-13 01:06:06
【问题描述】:
我的逻辑回归代码对 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()
【问题讨论】:
-
为什么不使用 scikit-learn ?
-
我是机器学习的新手,所以想从头开始编写逻辑回归,所以我猜使用 scikit learn 没有任何意义。如果我错了,请纠正我
-
Scikit-learn 逻辑回归实现比你的实现效率更高,所以它应该比你的实现更快。
标签: python numpy machine-learning neural-network logistic-regression