在开始之前,首先声明本文是作为一个初学者的学习笔记,在学习CSDN博主「何宽」的原创文章,原文链接:https://blog.csdn.net/u013733326/article/details/79702148 【【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第三周作业时,碰到一些问题,所以做了总结,方便自己之后碰到问题可以回头查阅。如有不妥的地方欢迎大家指正,如果大佬不喜欢我可以给他删掉。
——————————————————————————————————————————————————————————
大佬上传的的资料在百度网盘,提取码:qifu 。点此处下载:[百度网盘]。(https://pan.baidu.com/s/12VnFvaQf16J0RV1n1xsRvg&shfl=sharepset)
——————————————————————————————————————————————————————————
本次作业要做的目标内容:
构建具有单隐藏层的2类分类神经网络。
使用具有非线性激活功能激活函数,例如tanh。
计算交叉熵损失(损失函数)。
实现向前和向后传播。
——————————————————————————————————————————————————————————
准备软件包:
numpy:是用Python进行科学计算的基本软件包。
sklearn:为数据挖掘和数据分析提供的简单高效的工具。
matplotlib :是一个用于在Python中绘制图表的库。
testCases:提供了一些测试示例来评估函数的正确性,参见下载的资料。
planar_utils :提供了在这个任务中使用的各种有用的功能,参见下载的资料。
import numpy as np
import matplotlib.pyplot as plt
from testCases import *
import sklearn
import sklearn.datasets
import sklearn.linear_model
from planar_utils import plot_decision_boundary, sigmoid, load_planar_dataset, load_extra_datasets
np.random.seed(1)#准备一个随机数的种子
——————————————————————————————————————————————————————————
加载和查看数据集:
np.random.seed(1)#准备一个随机数的种子
#加载数据集
X, Y = load_planar_dataset()
#绘制可视化图像,X是2*n矩阵,y是颜色,s是数据的数量,cmap代表按照y不同,用不同颜色分开
plt.scatter(X[0, :] , X[1, :] , c = np.squeeze(Y) , s = 40 , cmap = plt.cm.Spectral)
plt.show()#老是忘记这一行,没有他看不到图啊
运行结果如下:
——————————————————————————————————————————————————————————
查看数据的大小:
shape_X = X.shape
shape_Y = Y.shape
m = Y.shape[1]
print ("X的维度为:" + str(shape_X))
print ("Y的维度为:" + str(shape_Y))
print ("数据集里面的数据有:" + str(m) + "个")
运行结果如下:
X的维度为:(2, 400)
Y的维度为:(1, 400)
数据集里面的数据有:400个
——————————————————————————————————————————————————————————
查看简单的Logistic回归的分类效果:
使用sklearn的内置函数来做到这一点, 运行下面的代码来训练数据集上的逻辑回归分类器:
clf = sklearn.linear_model.LogisticRegressionCV()
clf.fit(X.T,Y.T)
会有如下显示:
d:\ProgramData\Anaconda3\lib\site-packages\sklearn\utils\validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
y = column_or_1d(y, warn=True)
d:\ProgramData\Anaconda3\lib\site-packages\sklearn\model_selection\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.
warnings.warn(CV_WARNING, FutureWarning)
我们可以把逻辑回归分类器的分类绘制出来:
#绘制决策边界 , 此处做了修改,将Y进行了向量化 lambda函数的功能就是实现一个 : 之前是输入 : 之后是输出的函数
plot_decision_boundary(lambda x: clf.predict(x), X, np.squeeze(Y))
plt.title("Logistic Regression") #图标题
plt.show()#别忘记显示一下
LR_predictions = clf.predict(X.T) #预测结果
"""
关于预测准确性的式子来源:
首先LR_predictions是预测结果(只有0和1)
np.dot(Y, LR_predictions)就是真实值Y与预测值的内积(每个元素相乘加起来)
只有真实值和预测值都为1时,才有用,因为其他其他情况都为0,对结果没影响
这个np.dot(Y, LR_predictions)就是预测正确并且结果是1的那部分
同理np.dot(1 - Y,1 - LR_predictions)是预测正确并且结果是0的那部分
最后加起来求和除以总的样本就是正确率
"""
print ("逻辑回归的准确性: %d " % float((np.dot(Y, LR_predictions) +
np.dot(1 - Y,1 - LR_predictions)) / float(Y.size) * 100) +
"% " + "(正确标记的数据点所占的百分比)")
运行结果如下:
逻辑回归的准确性: 47 % (正确标记的数据点所占的百分比)
——————————————————————————————————————————————————————————
搭建神经网络:
构建神经网络的步骤:
定义神经网络结构(输入单元的数量,隐藏单元的数量等)。
初始化模型的参数
循环:
实施前向传播
计算损失
实现向后传播
更新参数(梯度下降)
我们要它们合并到一个nn_model() 函数中,当我们构建好了nn_model()并学习了正确的参数,我们就可以预测新的数据。
1、定义神经网络结构
n_x: 输入层的数量
n_h: 隐藏层的数量(这里设置为4)
n_y: 输出层的数量
def layer_sizes(X , Y):
"""
参数:
X - 输入数据集,维度为n_x * m
Y - 标签,维度为 1 * m
返回:
n_x - 输入层的数量
n_h - 隐藏层的数量
n_y - 输出层的数量
"""
n_x = X.shape[0]
n_h = 4
n_y = Y.shape[0]
return (n_x , n_h , n_y)
进行测试:
print("=========================测试layer_sizes&