一个图像分类器如果用 Python 写出来的样子会是像这样的:
def classify_image(image):
# some magic processes here
return class_label
因此目标很简单,就是利用一系列的算法,把上面所谓的 magic processes 解开,最后实现目标识别的效果。传统的方式是我们人为的用很多条件约束去规范和描述一个物体属性的特征,然而这个方法既没办法普及,更没办法提升效率,因此我们使用“数据”去规范数据本身:
写出来的程式就像这个样子:
def train(images, labels): # to memorize all data and labels
# maching learning would be processed here
return model
def predict(model, test_images): # to predict the label of the most similar training image
# use model to predict labels
return test_labels
利用不同标尺之间的差值来比对图像
import numpy as np
class NearestNeighbor:
def __init__(self):
pass
# X is N*D where each row is an example we wish to predict label for
def train(self, X, y):
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
num_test = X.shape[0]
# lets make sure that the output matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for I in xrange(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
但是当我们在使用 K-Nearest 方法去辨识物体的时候,一般不挑临近只差“一个像素单位”的距离,距离比一还要大的话结果出来会更为平滑。不过这个方法到了现在已经没有被用在实际应用上了,其中的坏处很多,包含了:
拿着张图当举例,虽然是同一个人的照片被动了不同的手脚,但是 K-Nearest Neighbor 结果出来的确实一样的。
有两个方法可以计算这个所谓“Distance Matrix”
在 L1 的这个 case 里面,用这个方法判定的数据归类的边界会更趋向于贴近坐标系的轴来分割所属区域,而 L2 的话相对来说于坐标系的关联度没那么大,所以比较不会有这种情况。
Hyperparameter
在机器学习里面可能会有很多这种参数,他们不是通过重复的动作被“训练”出来的,而是根据设计者(我们人)的经验总结出来的一个可能会让整个效果更好的参数。因此我们一般设定他们之前会问自己两个问题:
以下几种方式可以设定 Hyperparameter(简称 HP)
K-Nearest Neighbors 方法总结
线性分类器 Linear Classification
这就是现在主流被广泛应用到 CNN的方法, f(x, W) = Wx + b。
一个图像信息被看作是一个“图片的长”*“图片的宽”*“光的三原色的量”的三维矩阵,每一个像素点作为一个信号源放入到 x 的位置,经过一个权重 W 把 x 的重要性凸显出来,加上一个独立的修正量 b ,最后得出一个值用来评分。就像下面这张图所显示的意思。
然而,线性分类器在一个类别里面只能学习一个模板,例如一个类是用来分辨汽车的,就不能再训练它来分辨动物。如果这种情况出现的话,那新加入的动物图像数据就会和已有的汽车数据宗和起来,最后得出一个他们共同的四不像答案,一般来说是不好的。
缺点
当遇到高维度向量的时候,线性分类器就会失去原有厉害的分类魔力。
每次只要遇到可以分布在不同区域的数据的时候,例如上面的例子,没有一张图里面的数据分布是可以靠直接用一条线切开左右两边数据达到分类效果的,那么线性分类器就会陷入难题。
下节链接:卷积神经网络 + 机器视觉: L3_Loss Functions and Optimization (斯坦福课堂)