使用深度学习(逻辑回归)处理图像识别的问题

标签:#图像处理##深度学习# 时间:2018/09/23 14:24:04 作者:小木

由于Honor Code政策,这里将抹去作业中需要学生填写的代码,只是翻译一下处理的逻辑。

使用神经网络的逻辑回归处理中等大小数据集

这个作业是识别图像是否是一只猫的问题。Cousera提供了一个训练集(209个图片)和一个测试集(50个图片),每个图片是64×64大小的图片,每个像素是由RGB三个通道的数值表示。这些数据集是以H5文件(参考H5文件简介和使用)的形式提供。

用到了如下的Python包:

numpy:Python中进行科学计算的基础包
h5py:处理H5格式文件的通用的包
matplotlib:Python中的画图工具
PIL和Scipy:用来测试模型的包

步骤一:载入数据
官方提供了lr_utils来读取训练集和测试集,这个是已经写好的,不用我们管了(细节可看:https://github.com/amarsic1990/Deep-learning/blob/master/lr_utils.py)

在载入数据之后,官方展示了其中的一个图片:

# Example of a picture
index = 25
plt.imshow(train_set_x_orig[index])
print ("y = " + str(train_set_y[:, index]) + ", it's a '" + classes[np.squeeze(train_set_y[:, index])].decode("utf-8") +  "' picture.")

步骤二:对数据预处理

首先需要定义一些变量供后面使用,这里需要提供三个变量:训练集数量(m_train)、测试集数量(m_test)和像素数量(其实就是每个图像的长和宽了,num_px)。这些变量都可以通过之前读取的数据获得。其实大家可以print(train_set_x_orig.shape)就可以看到训练集是什么样的,它是一个高维数组(209,64,64,3),就是209个图片,每个图片有64×64个像素组成,每个像素有3个通道值组成。

但是注意,这样的高维数据是很难处理的,这里需要把这些高维的数组给“压平”,每一幅图可以使用一个列向量表示(使用列向量表示数据有很多说法,比说部分语言列向量比行向量快,线代中列向量的表示更加优雅简洁等)。那么最终一个图片就是一个(1,num_px × num_px × 3=12288)这样一个列向量。测试集和训练集也会随之而变化。

在numpy中压平一个数组可以使用数组的flatten方法,也可以使用reshape方法。在作业中压平数组的方法是用了一个技巧,即将(a,b,c,d)形式的数组压平成(b × c × d, a)格式可以是使用如下方式:

X_flatten = X.reshape(X.shape[0], -1).T      # X.T is the transpose of X

reshape中-1的含义是在给定了另一个维度之后,让numpy帮助我们决定剩下的列(行)的元素的内容,官方文档强调了,数组转换前后必须是相容的。如果给定了一个维度的参数是-1的话,那么将根据数组的长度和剩下的维度来推断这个维度的值是多少。

# Reshape the training and test examples

### START CODE HERE ### (≈ 2 lines of code)
train_set_x_flatten = 自己想,很简单
test_set_x_flatten =  自己想,很简单
### END CODE HERE ###

print ("train_set_x_flatten shape: " + str(train_set_x_flatten.shape))
print ("train_set_y shape: " + str(train_set_y.shape))
print ("test_set_x_flatten shape: " + str(test_set_x_flatten.shape))
print ("test_set_y shape: " + str(test_set_y.shape))
print ("sanity check after reshaping: " + str(train_set_x_flatten[0:5,0]))

压平后的数据也得到了。我们知道,使用RGB三个通道表示彩色图像的时候,每个像素是一个三维的向量,且向量中元素的值的范围是[0,255]。

机器学习中一个通用的预处理步骤是数据的中心化和标准化。也就是用你的数据减去数据的均值,然后再除以标准差。但是对于图片数据来说,最简单有效的方法是将每个数值除以最大值255即可。

所以标准化数据就是如下操作:

train_set_x = train_set_x_flatten/255.
test_set_x = test_set_x_flatten/255.

总结一下,对于新数据的预处理步骤主要包括:
1、找出数据的维度,并确认好维度的问题
2、对数据的维度进行重新塑造
3、标准化数据集

3、一般学习算法的架构

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送