Andrew NG老师给的不是一张张的数据图片,是以h5的格式存储的图片作为数据集
# 导入h5py库,Python带的库
import h5py
# 导入训练的原始数据,使用h5py.File的方法
train_data = h5py.File('datasets/train_catvnoncat.h5','r')
test_data = h5py.File('datasets/test_catvnoncat.h5','r')
h5文件的格式类似字典,数据由键和值组成。
# 含有三个键值,必须得遍历才能打印出每个键
for key in train_data.keys():
print(key)
打印结果如下:
list_classes
train_set_x
train_set_y
说明这个数据包里包含三个键,通过三个键存储训练集,测试集以及标签
list_classes: | 类别的标签,即是猫还是不是猫 |
---|---|
train_set_x: | 输入的图片 |
train_set_y: | 对输入图片的分类 |
首先我们要弄清楚这个数据包里的数据形式,可以通过字典的形式查看数据,通过np.shape
来打印出数据的维度以便观察。代码如下:
train_data['train_set_x'].shape
输出结果:(209, 64, 64, 3)
输出结果表示训练集含有209张图片,每张图片的像素为64*64,每个像素点含有RGB三原色。
再来看看训练集的标签的维度:
train_data['train_set_y'].shape
输出结果:(209,)
输出结果表示:
- 标签的输出为209,每个样本对应一个0或1的输出值
- 此处输出的是元组类型,是一个包含209个元素的数组
同理测试集的维度如下:
test_data['test_set_x'].shape
test_data['test_set_y'].shape
测试集数据的维度:(50, 64, 64, 3)
测试集标签的维度:(50,)
我们已经成功清楚了该数据包里数据的结构组成,但是现在数据还存在原始的h5文件属性里,里面的数据带键和值很麻烦,所以我们直接取出来用变量存取,现在取出来的是原始的数据,后面我们还要对数据进行处理。
# 取出训练集 测试集数据
train_data_org = train_data['train_set_x'][:]
train_labels_org = train_data['train_set_y'][:]
test_data_org = test_data['test_set_x'][:]
test_labels_org = test_data['test_set_y'][:]
原始的数据其实是一张张图片,我们现在可以查看图片里面都是些什么,举一个例子,我们现在对其中一张图片进行索引展示:
import matplotlib.pyplot as plt
%matplotlib inline
# 显示训练集里的第178张图片,刚好它是一只猫,图片模糊的原因是像素太低
plt.imshow(train_data_org[177])
输出显示如下,太巧了它正好是一只猫:
Tips:
- 输入
%matplotlib inline
命令的意思是可以在线显示图片,因为我们在后面做完相关算法之后经常会显示一些图片来观察算法的性能,这样以后不用每次打印图片就使用 plt.imshow()
命令来显示图片,一般在Jupyter环境里才需要加入这个指令。
通过对逻辑回归问题里公式的推导我们确定了训练集的维度,标签的维度,以及参数的维度,推导过程如下:
但是数据包里提供的训练集和标签的维度与我们目标的维度不同,所以我们接下来要对数据的维度进行处理,维度关系如下:
程序处理如下:
# 数据维度的处理
# 取出的是维度里的第一个数,也就是样本格式
m_train = train_data_org.shape[0] #获取训练集的样本个数
m_test = test_data_org.shape[0] #获取测试集的样本个数
# 原始数据做维度的处理,64*64*3合并
train_data_tran = train_data_org.reshape(m_train,-1).T
test_data_tran = test_data_org.reshape(m_test,-1).T
print(train_data_tran.shape)
print(test_data_tran.shape)
调整后训练集的维度:(12288, 209)
调整后测试集的维度:(12288<