在开始之前,首先声明本文是作为一个初学者的学习笔记,在学习CSDN博主「何宽」的原创文章,原文链接:https://blog.csdn.net/u013733326/article/details/79639509 【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第二周作业 - 具有神经网络思维的Logistic回归时,碰到一些问题,所以做了总结,方便自己之后碰到问题可以回头查阅。如有不妥的地方欢迎大家指正,如果大佬不喜欢我可以给他删掉。
——————————————————————————————————————————————————————————
大佬上传的的资料在百度网盘,提取码:2u3w 。点此处下载:[百度网盘]。(https://pan.baidu.com/s/1I4MBm7QwRGuQDp-IZc9P1Q&shfl=sharepset)
——————————————————————————————————————————————————————————
一、我们首先进行训练所需要的数据的准备
1.
在这个加载数据集的脚本之中,请注意修改加载数据集的地址,并且地址中要用这个斜杠:/而不可以用这个:\
import numpy as np
import h5py
def load_dataset():
train_dataset = h5py.File('D:/python__work/cats/datasets/train_catvnoncat.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels
test_dataset = h5py.File('D:/python__work/cats/datasets/test_catvnoncat.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels
classes = np.array(test_dataset["list_classes"][:]) # the list of classes
train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))
return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
2、引用各个需要的库
numpy :是用Python进行科学计算的基本软件包。
h5py:是与H5文件中存储的数据集进行交互的常用软件包。
matplotlib:是一个著名的库,用于在Python中绘制图表。
lr_utils :在本文的资料包里,一个加载资料包里面的数据的简单功能的库。
import numpy as np
import h5py
import matplotlib.pyplot as plt
from lr_utils import load_dataset
3、我们使用资料中自带的脚本,将数据集导入进来,下面是查看第26张图像和y集合的代码。其中y集合是判断是否是猫的正确答案。
问题:按照大佬的程序我的图片没有显示出来。
结果:加了一行plt.show()以后就ok了。
train_set_x_orig , train_set_y , test_set_x_orig , test_set_y , classes = load_dataset()
index = 25
plt.imshow(train_set_x_orig[index])
plt.show() #如果没有这一行,不会显示图片的哦
运行结果如下:
4、接下来我们查看一些想要知道的参数,例如:Y的内容与格式,图片信息是以怎样的形式保存在train_set_x_orig之中。
m_train = train_set_y.shape[1]
m_test = test_set_y.shape[1]
mum_px = train_set_x_orig.shape[1]
mum_py = train_set_x_orig.shape[2]
print("train_set_y=" + str(train_set_y.shape)) #如果想要查看Y的格式,可以打印一下
print(train_set_y) #如果想要查看Y的内容,可以打印一下
print(train_set_x_orig.shape) #通过查看train_set_x_orig的shape可以发现这个东西有4个维度分别是209 64 64 3。应该是209个64*64*3的图片
print('The number of the pictures in training set are ' + str(m_train))
print('The number of the pictures in testing set are ' + str(m_train))
print('The size of every picture is ' + str(mum_px) + '*' + str(mum_py) + '*3')
运行结果如下:
我们可以看出在train_set_x_orig的shape中保存了,209个64* 64*3的图片。
5、为了方便处理,加快运算,我们不能将图片信息作为3个rgb矩阵进行运算,而应该将它保存成为209个64* 64*3维的向量,组成矩阵进行运算。
#我们通过.reshape(x,y)函数来进行降维,其中train_set_x_orig.shape[0]代表有209行,-1代表自动生成列数,应该是209个64*64*3列
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
#查看一下降维后矩阵的形式
print(train_set_x_flatten.shape)
print(test_set_x_flatten.shape)
结果如下:
我们可以看到转置后的矩阵每一列保存着原来的一张图片对应的64* 64*3的rgb矩阵内的元素。
6、为了表示彩色图像,必须为每个像素指定红色,绿色和蓝色通道(RGB),因此像素值实际上是从0到255范围内的三个数字的向量。机器学习中一个常见的预处理步骤是对数据集进行居中和标准化,这意味着可以减去每个示例中整个numpy数组的平均值,然后将每个示例除以整个numpy数组的标准偏差。但对于图片数据集,它更简单,更方便,几乎可以将数据集的每一行除以255(像素通道的最大值),因为在RGB中不存在比255大的数据,所以我们可以放心的除以255,让标准化的数据位于[0,1]之间,现在标准化我们的数据集:
train_set_x = train_set_x_flatten / 255
test_set_x = test_set_x_flatten / 255
——————————————————————————————————————————————————————————
这样我们需要准备的数据就已经准备完成啦,接下来就进行神经网络的搭建了。
——————————————————————————————————————————————————————————
二、建立神经网络
其大的步骤有三步:
定义模型结构(例如输入特征的数量)
初始化模型的参数
循环:
3.1 计算当前损失(正向传播)
3.2 计算当前梯度(反向传播)
3.3 更新参数(梯度下降)
1.构建sigmoid函数
def sigmoid(z):
"""
参数:
任意的标量或者numpy数组
返回:
s = sigmoid(z)
"""
s = 1 / (1 + np.exp(-z))
return s
#测试sigmoi函数功能
print(str(sigmoid(0)))
print(sigmoid(