我正在尝试使用python的scikit-learn软件包中提供的机器学习算法来预测涂鸦图像集中的涂鸦名称。
由于我是机器学习的完整入门者,所以我还不了解神经网络如何工作。我想尝试使用scikit-learn的算法。
我已经借助名为quickdraw的api下载了(猫和吉他的)doodle。
然后我使用以下代码加载图像
import numpy as np
from PIL import Image
import random
#To hold image arrays
images = []
#0-cat, 1-guitar
target = []
#5000 images of cats and guitar each
for i in range(5000):
#cat images are named like cat0.png, cat1.png ...
img = Image.open('data/cats/cat'+str(i)+'.png')
img = np.array(img)
img = img.flatten()
images.append(img)
target.append(0)
#guitar images are named like guitar0.png, guitar1.png ...
img = Image.open('data/guitars/guitar'+str(i)+'.png')
img = np.array(img)
img = img.flatten()
images.append(img)
target.append(1)
random.shuffle(images)
random.shuffle(target)
然后我应用了算法:-
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(images,target,test_size=0.2, random_state=0)
from sklearn.naive_bayes import GaussianNB
GB = GaussianNB()
GB.fit(X_train,y_train)
print(GB.score(X_test,y_test))
运行上面的代码(也使用其他算法,例如SVM,MLP)后,我的系统冻结。我已经强制关机才能恢复原状。我不确定为什么会这样。
我尝试通过更改来减少要加载的图片数量
for i in range(5000):
到
for i in range(1000):
但是我只能得到大约50%的准确度
答案 0 :(得分:1)
首先,如果我可以这样说:
由于我是机器学习的完整入门者,所以我不了解神经网络的工作原理。我想尝试使用scikit-learn的算法。
一般来说,这不是学习ML的好方法,我强烈建议您至少开始学习基础知识,否则,您将根本无法分辨正在发生的事情(这不是您可以尝试解决的问题)它)。
回到问题所在,对原始图像应用朴素贝叶斯方法并不是一个好策略:问题是图像的每个像素都是一个功能,对于图像,您可以获得很高的数值轻松确定尺寸(也假设每个像素都独立于其相邻像素,这不是您想要的)。 NB通常用于文档,在wikipedia上查看此示例可能会帮助您进一步了解算法。
简而言之,NB归结为计算联合条件概率,归结为计算特征(在维基百科示例中为 words )的共现概率。在您的情况下 pixels 可以归结为计算出一个庞大的事件矩阵,您需要用它们来构造NB模型。
现在,如果您的矩阵是由一组文档中的所有单词组成的,那么这在时间和空间上都会变得非常昂贵(O(n ^ 2)/ 2),其中n是功能的数量;而是想象一下,矩阵是由训练集中的所有像素组成的,就像您在示例中所做的那样……爆炸确实非常快。
这就是为什么将数据集切割为1000张图像后PC不会耗尽内存的原因。 希望对您有所帮助。