具有神经网络思维的Logistic回归课后作业
前期准备:
- 下载吴恩达给的资料。该资料中应该包含 lr_utils.py 文件和datasets文件夹。注意lr_utils.py文件和datasets文件夹都应该与主要代码在同一级的文件夹下且同一级目录下。
实验过程
第一步:导入库
import numpy as np
import matplotlib.pyplot as plt
import h5py
from lr_utils import load_dataset
最后一句中的lr_utils 和load_dataset 都是下载的吴恩达老师的内容,只要从网上下载下来之后放到前面所说的指定位置即可。
第二步:前期实验
一、导入数据进入主程序
train_set_x_orig , train_set_y , test_set_x_orig , test_set_y , classes = load_dataset()
- train_set_x_orig :保存的是训练集里面的图像数据(本训练集有209张64x64的图像)。
- train_set_y_orig :保存的是训练集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)。
- test_set_x_orig :保存的是测试集里面的图像数据(本训练集有50张64x64的图像)。
- test_set_y_orig : 保存的是测试集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)。
- classes : 保存的是以bytes类型保存的两个字符串数据,数据为:[b’non-cat’ b’cat’]。
二、打开datasets文件夹中的测试图片
plt.imshow(train_set_x_orig[25])
plt.waitforbuttonpress()
只用plt.imshow()函数无法打开测试图片,需要加上下面的plt.waitforbuttonpress()函数
三、打印测试集和训练集中的图片信息
m_train = train_set_y.shape[1] #训练集里图片的数量。
m_test = test_set_y.shape[1] #测试集里图片的数量。
num_px = train_set_x_orig.shape[1] #训练、测试集里面的图片的宽度和高度(均为64x64)
shape[0]:表示矩阵的行数
shape[1]:表示矩阵的列数
因为 train_set_y.shape 保存的是训练集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)是由一维数组保存的,所以train_set_y.shape[1]可以用列数来计算图片的数量。同理test_set_y.shape[1]也用列数来计算测试集中的图片数量。
- 问题:为什么train_set_x_orig.shape[1] 可以表示图片的长宽,而把代码改成train_set_x_orig.shape[0]之后则输出的是图片的数量209。
- 解答:train_set_x_orig 是一个维度为(m_train,num_px,num_px,3)的数组,train_set_x_orig.shape[0]是数组中的m_train项,代表的是训练集里的图片数量,train_set_x_orig.shape[1]是数组中的num_px项,代表的是训练、测试集中的图片宽度和高度。
打印数据集和训练集中的图片数据:
print ("训练集的数量: m_train = " + str(m_train))
print ("测试集的数量 : m_test = " + str(m_test))
print ("每张图片的宽/高 : num_px = " + str(num_px))
print ("每张图片的大小 : (" + str(num_px) + ", " + str(num_px) + ", 3)")
print ("训练集_图片的维数 : " + str(train_set_x_orig.shape))
print ("训练集_标签的维数 : " + str(train_set_y.shape))
print ("测试集_图片的维数: " + str(test_set_x_orig.shape))
print ("测试集_标签的维数: " + str(test_set_y.shape))
输出结果:
四、降维
-
将(64,64,3)的numpy数组降维成(64x64x3 ,1) 之所以可以写成64x64x3的形式,是因为每个图片是由64x64个像素点组成,每个像素点由(R,G,B)原色构成。
-
降维代码:
#X_flatten = X.reshape(X.shape [0],-1).T #X.T是X的转置
#将训练集的维度降低并转置。
train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T
#将测试集的维度降低并转置。
test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T
- 降维解释: 降维是指在某些限定条件下,降低随机变量个数,得到一组“不相关”主变量的过程。 降维可进一步细分为变量选择和特征提取两大方法。(这个地方就把保存图片的三维数组转化成了一维数组)
- reshape函数: 这个函数的作用是在不改变数据内容的情况下,改变一个数组的格式。列如把3行4列数组改成2行6列数组,a = a.reshape((2,6))
- train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T: 这行代码中train_set_x_orig.shape[0]的值是50,可是为啥是50,-1是什么意思?
五、数学表达式
z
(
i
)
=
w
T
x
(
i
)
+
b
z^{(i)}=w^{T}x^{(i)}+b
z(i)=wTx(i)+b
y
^
(
i
)
=
a
(
i
)
=
s
i
g
m
o
i
d
(
z
(
i
)
)
\hat{y}^{(i)}=a^{(i)}=sigmoid(z^{(i)})
y^(i)=a(i)=sigmoid(z(i))
L
(
a
(
i
)
,
y
(
i
)
)
=
−
y
(
i
)
l
o
g
(
a
(
i
)
)
−
(
1
−
y
(
i
)
)
l
o
g
(
1
−
a
(
i
)
)
L(a^{(i)},y^{(i)})=-y^{(i)}log(a^{(i)})-(1-y^{(i)})log(1-a^{(i)})
L(a(i),y(i))=−y(i)log(a(i))−(1−y(i))log(1−a(i))