(主要是记录自己的学习轨迹,顺便可以为需要的提供一些需要,仅供参考)

主要实现代码和使用.py文件:

1)主要代码部分实现流程:

1.获取数据

2.初始化参数(w1,b1,w2,b2返回参数)

3.向前传播 (返回预测值A2,cache用于存储向后传播所用数据)

4.计算成本函数(返回cost)

5.向后传播(返回grads梯度)

6.梯度下降(更新参数,返回参数)

7.集成方法(返回参数)

8.进行预测

import numpy as np
import matplotlib.pyplot as plt#绘图
import sklearn#数据挖掘和数据分析的工具
import sklearn.datasets
import sklearn.linear_model
from testCases import *
from planar_utils import plot_decision_boundary,sigmoid,load_planar_dataset,load_extra_datasets
#加载二分类数据集
X,Y=load_planar_dataset()#X2维数据集,特征矩阵(n_x,m)(每一列是样本的特征向量),Y(1,m)样本标签
plt.scatter(X[0,:],X[1,:],c=np.squeeze(Y),s=40,cmap=plt.cm.Spectral)#可视化数据,Y(1,m),使用np.squeeze,变为含m个元素的一维数组
plt.show()
shape_X=np.shape(X)#(2,400)
shape_Y=np.shape(Y)#(1,400
m_train=X.shape[1]
print("shape_X:"+str(shape_X),"shape_Y:"+str(shape_Y),"m_train:"+str(m_train))#训练logstic回归分类
clf=sklearn.linear_model.LogisticRegressionCV()
clf.fit(X.T,Y.T)
#绘制逻辑回归决策边界
plot_decision_boundary(lambda x:clf.predict(x),X,np.squeeze(Y))
plt.title("Logistic Regression")
plt.show()
#打印准确率
LR_predictions=clf.predict(X.T)#训练集的预测值
print("accuracy of logistic regression:%d" %float((np.dot(Y,LR_predictions)+np.dot(1-Y,1-LR_predictions))/float(Y.size)*100)+"%"+"(percentage of correctly labelled datapoints)")#计算准确率
#神经网络模型:1)网络模型2)初始化参数3)向前传播4)cost成本函数5)反向传播学习参数6)预测结果
#定义网络结构(n_x输入层单元数,n_h隐藏层单元数,n_y输出层单元数,二分类输出层一个单元)
def layer_sizes(X,Y):n_x=X.shape[0]n_h=4n_y=Y.shape[0]return n_x,n_h,n_y
#仅用于评估函数
x_assess,y_assess=layer_sizes_test_case()#x(5,3)y(2,3)
(n_x,n_h,n_y)=layer_sizes(x_assess,y_assess)#n_x=5,n_h=4,n_y=2
print("n_x:"+str(n_x))
print("n_h:"+str(n_h))
print("n_y:"+str(n_y))
#初始化参数
def initialize_parameters(n_x,n_h,n_y):np.random.seed(2)#指定随机数产生开始的位置W1=np.random.rand(n_h,n_x)*0.01b1=np.zeros((n_h,1))W2=np.random.rand(n_y,n_h)*0.01b2=np.zeros((n_y,1))*0.01assert(W1.shape==(n_h,n_x))#当W1的shape不是给定的shape时,会提前报错提醒(为了保证W1的shape)assert (b1.shape == (n_h, 1))assert (W2.shape == (n_y,n_h))assert (b2.shape == (n_y, 1))parameters={"W1":W1,"W2":W2,"b1":b1,"b2":b2}return parameters
#用于评估函数
n_x,n_h,n_y=initialize_parameters_test_case()
parameters=initialize_parameters(n_x,n_h,n_y)
print("W1:"+str(parameters["W1"]))
print("b1:"+str(parameters["b1"]))
print("W2:"+str(parameters["W2"]))
print("b2:"+str(parameters["b2"]))
#向前传播
def forward_propagation(X,parameters):W1=parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]Z1=np.dot(W1,X)+b1A1=np.tanh(Z1)#非线性函数Z2=np.dot(W2,A1)+b2A2=sigmoid(Z2)#用于二分分类assert(A2.shape==(1,X.shape[1]))cache={"Z1":Z1,"A1": A1,"Z2": Z2,"A2": A2}#在反向传播时会用到return A2,cache
#用于测试
X_assess,parameters=forward_propagation_test_case()
A2,cache=forward_propagation(X_assess,parameters)
print("A2:"+str(A2))
print(np.mean(cache["Z1"]),np.mean(cache["A1"]),np.mean(cache["Z2"]),np.mean(cache["A2"]))
#计算成本函数
def compute_cost(A2,Y,parameters):m=Y.shape[1]logprobs=np.multiply(Y,np.log(A2))+np.multiply((1-Y),np.log(1-A2))cost=-np.sum(logprobs)/m#cost = -np.mean(Y * np.log(A2) + (1 - Y) * np.log(1 - A2))cost=np.squeeze(cost)#确保cost维数是我们需要的assert (isinstance(cost,float))return cost
#用于测试
A2,Y,parameters=compute_cost_test_case()
cost=compute_cost(A2,Y,parameters)
print("cost:"+str(cost))
#向后传播
def backward_propagation(parameters,cache,X,Y):m=X.shape[1]W1=parameters["W1"]W2=parameters["W2"]A1=cache["A1"]A2=cache["A2"]dZ2=A2-YdW2=np.dot(dZ2,A1.T)/mdb2=np.sum(dZ2,axis=1,keepdims=True)/mdZ1=np.dot(W2.T,dZ2)*(1-np.power(A1,2))dW1=np.dot(dZ1,X.T)/mdb1=np.sum(dZ1,axis=1,keepdims=True)/mgrads={"dW1":dW1,"db1": db1,"dW2": dW2,"db2": db2,}return grads
#用于测试
parameters, cache, X_assess, Y_assess = backward_propagation_test_case()
grads = backward_propagation(parameters, cache, X_assess, Y_assess)
print("dW1 = " + str(grads["dW1"]))
print("db1 = " + str(grads["db1"]))
print("dW2 = " + str(grads["dW2"]))
print("db2 = " + str(grads["db2"]))
#梯度下降更新w1,w2,b1,b2参数
def update_parameters(parameters,grads,learing_rate=2.0):W1 = parameters["W1"]W2 = parameters["W2"]b1=parameters["b1"]b2=parameters["b2"]dW1=grads["dW1"]dW2=grads["dW2"]db1=grads["db1"]db2=grads["db2"]W1=W1-learing_rate*dW1W2 = W2 - learing_rate * dW2b1 = b1 - learing_rate * db1b2 = b2 - learing_rate * db2parameters={"W1":W1,"W2":W2,"b1":b1,"b2":b2}return parameters
#用于测试
parameters,grads=update_parameters_test_case()
parameters=update_parameters(parameters,grads)
print("W1:"+str(parameters["W1"]))
print("b1:"+str(parameters["b1"]))
print("W2:"+str(parameters["W2"]))
print("b2:"+str(parameters["b2"]))
#集成所有方法
def nn_model(X,Y,n_h,num_iterations=1000,print_cost=False):np.random.seed(3)n_x=layer_sizes(X,Y)[0]n_y=layer_sizes(X,Y)[2]parameters=initialize_parameters(n_x,n_h,n_y)W1=parameters["W1"]W2 = parameters["W2"]b1 = parameters["b1"]b2 = parameters["b2"]for i in range(0,num_iterations):A2,cache=forward_propagation(X,parameters)cost=compute_cost(A2,Y,parameters)grads=backward_propagation(parameters,cache,X,Y)parameters=update_parameters(parameters,grads)if print_cost and i%1000==0:print("cost after iteration %i:%f"%(i,cost))return parameters
#用于测试
X_assess,Y_assess=nn_model_test_case()
parameters=nn_model(X_assess,Y_assess,4,num_iterations=10000,print_cost=True)
print("W1:"+str(parameters["W1"]))
print("b1:"+str(parameters["b1"]))
print("W2:"+str(parameters["W2"]))
print("b2:"+str(parameters["b2"]))
#预测结果
def predict(parameters,X):A2,cache=forward_propagation(X,parameters)predictions=(A2>0.5)return predictions
#用于测试
parameters,X_assess=predict_test_case()
predictions=predict(parameters,X)
print("predictions mean="+str(np.mean(predictions)))
#隐藏层4个单元的模型
Y=load_planar_dataset()[1]
parameters=nn_model(X,Y,n_h=4,num_iterations=10000,print_cost=True)
#画决策边界
plot_decision_boundary(lambda  x:predict(parameters,x.T),X,np.squeeze(Y))
plt.title("decision boundary for hidden layer size"+str(4))
plt.show()
#计算精确度
predictions=predict(parameters,X)
print("Accuracy:%d"%float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)+"%")
#隐藏层单元数不同的情况下
plt.figure(figsize=(16,32))
hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50] #不同的隐层单元数
for i,n_h in enumerate(hidden_layer_sizes):plt.subplot(5,2,i+1)plt.title("hiddem layer of size %d"% n_h)parameters=nn_model(X,Y,n_h,num_iterations=5000)plot_decision_boundary(lambda  x:predict(parameters,x.T),X,np.squeeze(Y))predictions=predict(parameters,X)accuracy=float((np.dot(Y,predictions.T)+np.dot(1-Y,1-predictions.T))/float(Y.size)*100)print("Accuracy for {}hidden units:{}%".format(n_h,accuracy))
plt.show()
#更换数据集
noisy_circles, noisy_moons, blobs, gaussian_quantiles, no_structure = load_extra_datasets()
datasets={"noisy_circles":noisy_circles,"noisy_moons":noisy_moons,"blobs":blobs,"gaussian_quantiles":gaussian_quantiles
}
dataset="noisy_moons"#此处可更改为不同数据集
#选择noisy-moons数据集
X,Y=datasets[dataset]
X,Y=X.T,Y.reshape(1,Y.shape[0])#x为(n-x,m),y为(1,m)
#对标签Y进行处理,进行2分类0/1
if dataset=="noisy_moons":Y=Y%2
#可视化数据集
plt.scatter(X[0, :], X[1, :], c=np.squeeze(Y), s=40, cmap=plt.cm.Spectral)
plt.show()
#noisy-circles数据集下,不同隐层单元数
plt.figure(figsize=(16, 32))
hidden_layer_sizes = [1, 2, 3, 4, 5, 20, 50]
for i, n_h in enumerate(hidden_layer_sizes):plt.subplot(5, 2, i+1)plt.title('Hidden Layer of size %d' % n_h)parameters = nn_model(X, Y, n_h, num_iterations = 5000)plot_decision_boundary(lambda x: predict(parameters, x.T), X,np.squeeze(Y))predictions = predict(parameters, X)accuracy = float((np.dot(Y,predictions.T) + np.dot(1-Y,1-predictions.T))/float(Y.size)*100)print ("Accuracy for {} hidden units: {} %".format(n_h, accuracy))
plt.show()
'''
实验结论:当隐层为5左右准确率最高在学习率为1.0,1.2,1.5,2.0下,精确度影响不大noisy-circle,noisy-moons,blobs数据集下,不同隐层单元,noisy-moons数据集准确率更高
'''

testCases.py和planar_utils.py代码在下列网址下载:(免费的)

https://blog.csdn.net/sdu_hao/article/details/84728245#commentsedit

吴恩达 神经网络和深度学习 第一课 第三周 (代码)planar data classify相关推荐

  1. 吴恩达 神经网络和深度学习 第一课 第四周(代码和库)

    参考博客(主代码):https://blog.csdn.net/u013733326/article/details/79767169 下面是需要的库文件代码:testCases,dnn_utils_ ...

  2. 吴恩达 神经网络和深度学习 第一课 第一周(笔记,代码,数据集)

    推荐博客: https://blog.csdn.net/qq_25436597/article/details/78847831(这个博客上面是coursera的题目) https://blog.cs ...

  3. 吴恩达神经网络与深度学习——深度神经网络

    吴恩达神经网络与深度学习--深度神经网络 深度神经网络 符号 前向传播 矩阵维度 m个样本 为什么使用深层表示 搭建深层神经网络块 正向传播和反向传播 前向和反向传播 前向传播 反向传播 参数和超参数 ...

  4. 吴恩达神经网络和深度学习

    [前言] 在学习了深度学习和神经网络之后,为什么我要以博客的形式来做笔记?这CSDN有那么多的优秀文章,我自己写的都比不上 别人的我写的真的有意义吗,为什么我要浪费大量的时间去做这项工作?我相信一句话 ...

  5. 吴恩达神经网络与深度学习——浅层神经网络

    吴恩达神经网络与深度学习--浅层神经网络 神经网络概述 神经网络表示 计算神经网络的输出 m个样本的向量化 for loop 向量化 向量化实现的解释 激活函数 sigmoid tanh函数 ReLu ...

  6. 吴恩达神经网络和深度学习-学习笔记-28-端到端的深度学习(end-to-end deep learning )

    深度学习最令人振奋的最新动态之一,就是端到端深度学习end-to-end deep learning的兴起. 什么是"端到端深度学习" 以前有一些数据处理系统或学习系统,它们需要多 ...

  7. 吴恩达神经网络和深度学习-学习笔记-23-快速搭建你的第一个系统原型,然后迭代

    如果你正在开发全新的机器学习应用,你应该尽快建立你的第一个系统原型 (quick and dirty),然后快速迭代. 下面以语音识别系统为例: 一开始,我们有许多选择,不同的方向向前推进,而且每个方 ...

  8. 吴恩达-神经网络和深度学习课程-学习心得(一)

    前言: 陆陆续续学完了吴恩达老师在网易云课堂上开设的深度学习工程师微专业的部分内容(01.神经网络与深度学习,04.卷积神经网络,02.改善深层神经网络),在进一步应用实践之前,对之前的学习的内容做个 ...

  9. 吴恩达神经网络和深度学习-学习笔记-38-使用开源的方案+迁移学习+数据增强data augmentation

    使用别人的开源成果 想要用现成的网络,最好在网络上找到开源的实现,这要比从头开始实现快得多. 比如:直接在Google上搜索resnets github,找到合适的后点击下载会得到URL,然后在cmd ...

最新文章

  1. UA MATH523A 实分析1 度量空间 概念与定理总结
  2. boost::coroutine2模块实现解析器的测试程序
  3. jsp连接mysql显示404,SpringBoot+jsp项目启动出现404的解决方法
  4. Google Chrome浏览器可能在您不知情的情况下破坏了您的测试
  5. BZOJ 1491: [NOI2007]社交网络( floyd )
  6. 2017.7.13 维修数列 思考记录
  7. springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
  8. 洛阳php编程培训,洛阳PHP开发培训分享提高PHP开发效率的四个编程习惯
  9. BaseServlet 继承 httpServlet
  10. codevs1080线段树练习
  11. Mapreduce和Yarn概念,参数优化,作用,原理,MapReduce计数器 Counter,MapReduce 多job串联之ControlledJob(来自学习资料)...
  12. textarea字数实时统计方案
  13. system函数的详细使用
  14. 入门金融风控【贷款违约预测】
  15. 由开启coredump引起的对shell的深入探究
  16. PC式微WP龟速增长:微软或整合三大系统
  17. ACM图论+数据结构杂题总结
  18. 关于OC数据类型的资料整理
  19. lawson算法_案例研究:Lawson合并后整合架构的新方法
  20. Word 2007 学习中的问题

热门文章

  1. stimulsoft入门教程:分层报表(下)
  2. java显示目录文件列表和删除目录
  3. Jeesite 客户端验证Jquery Validate及服务器端验证
  4. jQuery插件素材网站
  5. App热补丁动态修复技术介绍
  6. 【7集iCore3基础视频】7-2 iCore3原理图介绍
  7. startssl申请免费ssl证书
  8. [模拟] hdu 4452 Running Rabbits
  9. java中return的作用
  10. 基于heartbeatV2版本的ha-gui工具对httpd做高可用集群(1)