今天和一位深度学习方面的教授聊了一聊,她还是让我系统的学习一下深度学习,我以前看了很多教程,都感觉看不下去,她给我推了教程和书和一些学习方法,我感觉我的热情又被燃起了。
图像分类
首先要弄清楚图像在计算机中是怎么被表示的。对于计算机来说,图像表示为一个大型的三维数字数组。在这个示例中,图像宽248像素,高400像素,并且有三个颜色通道(红绿蓝,简称RGB),因此,这个图像由 248 x 400 x 3 个数字组成,总共297600个数字。每个数字的范围从0(黑色)到255(白色)。这30万数字组合变成下图的猫
判定分类模型好坏标准的参数
- 视点变化 对象可以相对于观察点以多种方式定向。
- 比例变化
- 变形 许多物体不是刚体,会以极端的方式变形。
- 遮挡 对象可以被遮挡。有时,只有物体的一小部分(小至几个像素)是可见的。
- 照明条件 照明的效果在像素级别上非常明显。
- 背景杂乱 杂乱的背景会影响对象的识别
- 类别样本内部变化 对象类别内部通常相对广泛,例如椅子。这些对象内部有许多不同类型的对象,每种对象都有自己的外观。
一个好的图像分类模型必须保持所有变化的交叉积不变,同时保持对类间变化的敏感性。
算法撰写
数据驱动算法。用大量的数据集去训练模型。给每个类都提供大量的示例,然后开发学习算法,查看并了解这些数据的特征,这被称为数据驱动算法,因为它依赖于数据集。
四个类别的数据集,在实际中,类别中可能拥有数千万张图像
图像分类方法
我们完整的步骤可以如下:
- 输入:我们的输入由一组 N 个图像组成,每个图像都标有 K 个不同类中的一个。我们将此数据称为训练集。
- 学习:我们的任务是使用训练集来学习每个类的样子。我们将此步骤称为训练分类器或学习模型。
- 评估:最后,我们通过要求分类器预测一组以前从未见过的新图像的标签来评估分类器的质量。然后,我们将这些图像的真实标签与分类器预测的标签进行比较。我们希望很多预测与真实答案(我们称之为基本事实)一致。
最近邻分类器
这是最简单的分类器,与卷积神经网络无关,在实际应用中很少使用。
用CIFAR-10数据集,此数据集由 60,000 张高和宽为 32 像素的微小图像组成。每个图像都标有 10 个类之一(例如“飞机、汽车、鸟类等”)。将这 60000 张图像划分为训练集(50000张)和测试集(10000张)
原理:原理非常简单,给定两个图像,并将他们表示为矢量,算法会逐个像素地比较图像,并将所有差异相加
逐个像素比较,再将差异相加。假如两个图像相同,则结果为0,但是如果差别很大的话,结果将非常大
代码实现
首先实现数据库的下载与导入,打开数据库是这样的
那些没有后缀名的文件,其实都是用python的cpickle
库打包好的,这个库就是用来将python中的变量原封不动地存到本地使用的,当再次使用的时候,可以读取出来。
引入数据库
Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide
# flatten out all images to be one-dimensional
Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072
Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072
将图像拉伸为行
nn = NearestNeighbor() # create a Nearest Neighbor classifier class
nn.train(Xtr_rows, Ytr) # train the classifier on the training images and labels
Yte_predict = nn.predict(Xte_rows) # predict labels on the test images
# and now print the classification accuracy, which is the average number
# of examples that are correctly predicted (i.e. label matches)
print 'accuracy: %f' % ( np.mean(Yte_predict == Yte) )
主要代码
import numpy as np
class NearestNeighbor(object):
def __init__(self):
pass
def train(self, X, y):
""" X is N x D where each row is an example. Y is 1-dimension of size N """
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
""" X is N x D where each row is an example we wish to predict label for """
num_test = X.shape[0]
# lets make sure that the output type matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for i in range(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # get the index with smallest distance
Ypred[i] = self.ytr[min_index] # predict the label of the nearest example
return Ypred
如果运行此代码,分类器在 CIFAR-10 上仅达到 38.6%。
效果很不好,继续学。