在Google的Quickdraw数据集上应用机器学习算法

时间:2019-10-13 09:06:42

标签: python machine-learning scikit-learn

我正在尝试使用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%的准确度

1 个答案:

答案 0 :(得分:1)

首先,如果我可以这样说:

  

由于我是机器学习的完整入门者,所以我不了解神经网络的工作原理。我想尝试使用scikit-learn的算法。

一般来说,这不是学习ML的好方法,我强烈建议您至少开始学习基础知识,否则,您将根本无法分辨正在发生的事情(这不是您可以尝试解决的问题)它)。

回到问题所在,对原始图像应用朴素贝叶斯方法并不是一个好策略:问题是图像的每个像素都是一个功能,对于图像,您可以获得很高的数值轻松确定尺寸(也假设每个像素都独立于其相邻像素,这不是您想要的)。 NB通常用于文档,在wikipedia上查看此示例可能会帮助您进一步了解算法。

简而言之,NB归结为计算联合条件概率,归结为计算特征(在维基百科示例中为 words )的共现概率。在您的情况下 pixels 可以归结为计算出一个庞大的事件矩阵,您需要用它们来构造NB模型。

现在,如果您的矩阵是由一组文档中的所有单词组成的,那么这在时间和空间上都会变得非常昂贵(O(n ^ 2)/ 2),其中n是功能的数量;而是想象一下,矩阵是由训练集中的所有像素组成的,就像您在示例中所做的那样……爆炸确实非常快。

这就是为什么将数据集切割为1000张图像后PC不会耗尽内存的原因。 希望对您有所帮助。