吴恩达《机器学习》学习笔记十一——神经网络代码

吴恩达《机器学习》学习笔记十一——神经网络代码

  • 数据准备
  • 神经网络结构与代价函数·
  • 初始化设置
  • 反向传播算法
  • 训练网络与验证

课程链接:https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118

数据集链接:https://pan.baidu.com/s/1ZkB_RW9ehEV_w6ryZT64Ag
提取码:8utg

这次笔记,我们将再次处理手写数字数据集,第八次笔记是使用的多分类逻辑回归算法,这次使用反向传播的前馈神经网络。 我们将通过反向传播算法实现神经网络成本函数和梯度计算的非正则化和正则化版本。 我们还将实现随机权重初始化和使用网络进行预测的方法。

由于使用的数据集和上次代码练习是相同的,我们将重新使用代码来加载数据。

数据准备

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat
data = loadmat('ex4data1.mat')
data

在这里插入图片描述
由于我们以后需要这些(并将经常使用它们),我们先来创建一些有用的变量。

X = data['X']
y = data['y']X.shape, y.shape #看下维度

在这里插入图片描述
我们也需要对我们的y标签进行一次one-hot 编码。 one-hot 编码将类标签n(k类)转换为长度为k的向量,其中索引n为“hot”(1),而其余为0。 Scikitlearn有一个内置的实用程序,我们可以使用这个。

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
y_onehot.shape

在这里插入图片描述
one-hot编码后的y会变成如下图这种形式:
在这里插入图片描述
对应的类别位置设置为1,其余位置全部是0。

看一下变换前后的标签尺寸:

y[0], y_onehot[0,:]

在这里插入图片描述

神经网络结构与代价函数·

我们要为此练习构建的神经网络具有与我们的实例数据**(400 +偏置单元)大小匹配的输入层,25个单位的隐藏层(带有偏置单元的26个),以及一个输出层, 10个单位对应我们的一个one-hot编码类标签**。 其网络结构如下图所示,其中输入层有400+1个神经元,隐藏层有25+1个神经元,输出层有10个神经元:
在这里插入图片描述
我们需要实现的第一件是评估一组给定的网络参数的损失的代价函数。神经网络的代价函数若不带正则项就是如下所示的表达式:
在这里插入图片描述
带正则项的话表达式就会变成:
在这里插入图片描述
先定义一下sigmoid函数:

def sigmoid(z):return 1 / (1 + np.exp(-z))

如果要计算代价函数则需要前向传播来计算预测结果h(x),所以要先定义前向传播的函数:

def forward_propagate(X, theta1, theta2):# INPUT:参数值theta,数据X# OUTPUT:当前参数值下前项传播结果# TODO:根据参数和输入的数据计算前项传播结果# STEP1:获取样本个数m = X.shape[0]# STEP2:实现神经网络正向传播 a1 =np.insert(X, 0, values=np.ones(m), axis=1) #给X矩阵插入一行1元素z2 =a1 * theta1.Ta2 =np.insert(sigmoid(z2), 0, values=np.ones(m), axis=1)  #注意插入1元素z3 = a2 * theta2.Th = sigmoid(z3)return a1, z2, a2, z3, h
def cost(params, input_size, hidden_size, num_labels, X, y, lamda):# INPUT:神经网络参数,输入层维度,隐藏层维度,训练数据及标签,正则化参数# OUTPUT:当前参数值下的代价函数# TODO:根据上面的公式计算代价函数# STEP1:获取样本个数m = X.shape[0]# STEP2:将矩阵X,y转换为numpy型矩阵X =np.matrix(X)y =np.matrix(y)# STEP3:从params中获取神经网络参数,并按照输入层维度和隐藏层维度重新定义参数的维度theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, (input_size + 1))))theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, (hidden_size + 1))))# STEP4:调用前面写好的前项传播函数a1, z2, a2, z3, h = forward_propagate(X, theta1, theta2)# STEP5:初始化代价函数J = 0# STEP6:根据公式计算代价函数for i in range(m):  #遍历每个样本first_term =np.multiply(-y[i,:], np.log(h[i,:]))second_term = np.multiply((1 - y[i,:]), np.log(1 - h[i,:]))J += np.sum(first_term - second_term)J = J / m# STEP7:计算代价函数的正则化部分J += (float(lamda) / (2 * m)) * (np.sum(np.power(theta1[:,1:], 2)) + np.sum(np.power(theta2[:,1:], 2)))return J

初始化设置

将网络的层数、神经元数目、正则化系数、参数等一些变量进行初始化设置。

# 初始化设置
input_size = 400
hidden_size = 25
num_labels = 10
lamda = 1# 随机初始化完整网络参数大小的参数数组
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 0.25m = X.shape[0]
X = np.matrix(X)
y = np.matrix(y)# 将参数数组解开为每个层的参数矩阵
theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, (input_size + 1))))
theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, (hidden_size + 1))))theta1.shape, theta2.shape

在这里插入图片描述
这边显示的是theta1和theta2的维度,要结合与输入X的维度理解。

a1, z2, a2, z3, h = forward_propagate(X, theta1, theta2)
a1.shape, z2.shape, a2.shape, z3.shape, h.shape

在这里插入图片描述
观察一下这些中间变量的维度。

代价函数在计算假设矩阵h之后,应用代价函数来计算y和h之间的总误差。

cost(params, input_size, hidden_size, num_labels, X, y_onehot, lamda)

在这里插入图片描述
这是初始时刻用随机设置的参数计算得到的初始代价函数值。

反向传播算法

接下来是反向传播算法。 反向传播参数更新计算将减少训练数据上的网络误差。 我们需要的第一件事是计算我们之前创建的Sigmoid函数的梯度的函数。

def sigmoid_gradient(z):return np.multiply(sigmoid(z), (1 - sigmoid(z)))

它所作的工作如下面这幅图所示,后面的计算中会经常使用到这个函数,所以提前写出来:
在这里插入图片描述

现在我们准备好实施反向传播来计算梯度。 由于反向传播所需的计算是代价函数中所需的计算过程,我们实际上将扩展代价函数以执行反向传播并返回代价和梯度。梯度的计算过程如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def backprop(params, input_size, hidden_size, num_labels, X, y, lamda):# INPUT:神经网络参数,输入层维度,隐藏层维度,训练数据及标签,正则化参数# OUTPUT:当前参数值下的代价函数# TODO:根据上面的公式计算代价函数# STEP1:获取样本个数m = X.shape[0]# STEP2:将矩阵X,y转换为numpy型矩阵X = np.matrix(X)y = np.matrix(y)# STEP3:从params中获取神经网络参数,并按照输入层维度和隐藏层维度重新定义参数的维度theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, (input_size + 1))))theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, (hidden_size + 1))))# STEP4:调用前面写好的前项传播函数a1, z2, a2, z3, h = forward_propagate(X, theta1, theta2)# STEP5:初始化J = 0delta1 = np.zeros(theta1.shape)delta2 = np.zeros(theta2.shape)# STEP6:计算代价函数(调用函数)for i in range(m):  #遍历每个样本first_term =np.multiply(-y[i,:], np.log(h[i,:]))second_term = np.multiply((1 - y[i,:]), np.log(1 - h[i,:]))J += np.sum(first_term - second_term)J = J / m# STEP7:实现反向传播(这里用到的公式请参考原版作业PDF的第5页)for t in range(m):  #遍历每个样本a1t = a1[t,:]  # (1, 401)z2t = z2[t,:]  # (1, 25)a2t = a2[t,:]  # (1, 26)ht = h[t,:]  # (1, 10)yt = y[t,:]  # (1, 10)d3t = ht - ytz2t = np.insert(z2t, 0, values=np.ones(1)) # (1, 26) d2t = np.multiply((theta2.T * d3t.T).T, sigmoid_gradient(z2t))  # (1, 26)delta1 = delta1 + (d2t[:,1:]).T * a1tdelta2 = delta2 + d3t.T * a2t# STEP8:加入正则化delta1[:,1:] = delta1[:,1:] + (theta1[:,1:] * lamda) / mdelta2[:,1:] =  delta2[:,1:] + (theta2[:,1:] * lamda) / m  # STEP9:将梯度矩阵转换为单个数组grad = np.concatenate((np.ravel(delta1), np.ravel(delta2)))return J, grad

反向传播计算最难的部分(除了理解为什么我们正在做所有这些计算)是获得正确矩阵维度。 顺便说一下,你容易混淆了A * B与np.multiply(A,B)使用。 基本上前者是矩阵乘法,后者是元素乘法(除非A或B是标量值,在这种情况下没关系)。 无论如何,让我们测试一下,以确保函数返回我们期望的。

J, grad = backprop(params, input_size, hidden_size, num_labels, X, y_onehot, lamda)
J, grad.shape

在这里插入图片描述
参数的数量应该为40125+2610=10285个,验证无误。

训练网络与验证

我们终于准备好训练我们的网络,并用它进行预测。 这与以往的具有多类逻辑回归的练习大致相似。

from scipy.optimize import minimize# minimize the objective function
fmin = minimize(fun=backprop, x0=params, args=(input_size, hidden_size, num_labels, X, y_onehot, lamda), method='TNC', jac=True, options={'maxiter': 250})
fmin

在这里插入图片描述
用训练好的参数来进行预测:

X = np.matrix(X)
theta1 = np.matrix(np.reshape(fmin.x[:hidden_size * (input_size + 1)], (hidden_size, (input_size + 1))))
theta2 = np.matrix(np.reshape(fmin.x[hidden_size * (input_size + 1):], (num_labels, (hidden_size + 1))))a1, z2, a2, z3, h = forward_propagate(X, theta1, theta2)
y_pred = np.array(np.argmax(h, axis=1) + 1)
y_pred

最后再计算一下准确率:

correct = [1 if a == b else 0 for (a, b) in zip(y_pred, y)]
accuracy = (sum(map(int, correct)) / float(len(correct)))
print ('accuracy = {0}%'.format(accuracy * 100))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国科研人员发明单晶体管逻辑结构新原理

▲随着晶体管不断缩小特征尺寸,集成电路的性能得以持续提升。然而在超小器件尺寸下,硅材料的物理极限导致了功耗的大幅提升,难以进一步持续减小晶体管的特征尺寸。来源:文汇网通过引入层状半导体,并依据其特性设计新型…

Java 内存模型

1、并发模型编程的分类 在并发模型编程中,我们需要解决两个关键问题:线程之间如何通信以及线程之间如何同步。线程之间的通信包括两种:共享内存和消息传递。 Java并发采用的是共享内存模型。 2、Java内存模型的抽象 Java内存模型的主要目标是…

PyTorch框架学习一——PyTorch的安装(CPU版本)

PyTorch框架学习一——PyTorch的安装(CPU版本)PyTorch简介PyTorch的安装(CPU版)机器学习/深度学习领域的学习都是需要理论和实践相结合的,而它们的实践都需要借助于一个框架来实现,PyTorch在学术界目前处于…

你的大脑在自动驾驶,而你一无所知

来源:果壳想象一下,你的大脑里有着两个小人,它们在不停地打架,试图夺取控制你行动的权力。当然,这两个小人并不是你善意和邪恶的念头。那它们是什么?在很多人看来,这两者就是我们的意识和无意识…

常用的损失函数

来自 机器学习成长之路公众号 本文将常用的损失函数分为了两大类:分类和回归。然后又分别对这两类进行了细分和讲解,其中回归中包含了一种不太常见的损失函数:平均偏差误差,可以用来确定模型中存在正偏差还是负偏差。 从学习任务…

吴恩达《机器学习》学习笔记十一——应用机器学习的建议

吴恩达《机器学习》学习笔记十一——应用机器学习的建议一、训练完模型后下一步要做什么二、评估算法与模型选择1.训练集与测试集2.训练/测试步骤3.模型选择4.数据集新的划分——验证集的加入三、偏差与方差1.偏差与方差的理解2.正则化和偏差方差的关系3.学习曲线四、决定接下来…

为什么说深耕AI领域绕不开知识图谱?

来源:AI科技大本营“所有在 AI 领域深耕的人,最终都会发现语义鸿沟仍是一个非常具有挑战性的问题,这最终还需要借助知识图谱等技术,来帮助将整体的 AI 认知取得新进展。”在 5 月 26 日的 CTA 峰会机器学习专场,Hulu 首…

机器学习中的相似性度量总结

来自 机器学习算法那些事公众号 在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。 目录 1. 欧氏距离 …

吴恩达《机器学习》学习笔记十二——机器学习系统

吴恩达《机器学习》学习笔记十二——机器学习系统一、设计机器学习系统的思想1.快速实现绘制学习曲线——寻找重点优化的方向2.误差分析3.数值估计二、偏斜类问题(类别不均衡)三、查准率P与召回率R——代替准确率的评估指标四、查准率与召回率的权衡——…

增强现实:一场正在到来的医疗革命

来源: 资本实验室图像化可以让医生的诊断、决策和治疗更加准确,可以说是医疗史上非常重要的一项技术突破。近几年,通讯技术的发展推动了空间计算的快速商业化。在医疗领域,增强现实(AR)、虚拟现实&#xff…

吴恩达《机器学习》学习笔记十三——机器学习系统(补充)

这次笔记是对笔记十二的补充,之前讨论了评价指标,这次主要是补充机器学习系统设计中另一个重要的方面,用来训练的数据有多少的问题。 笔记十二地址:https://blog.csdn.net/qq_40467656/article/details/107602209 之前曾说过不要…

全球CMOS图像传感器厂商最新排名:黑马杀出

来源:半导体行业观察近期,台湾地区的Yuanta Research发布报告,介绍了其对CMOS图像传感器(CIS)市场的看法,以及到2022年的前景预期。从该研究报告可以看出,2018年全球CMOS图像传感器的市场规模为137亿美元,其…

吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进一、任务介绍二、代码实现1.准备数据2.代价函数3.梯度计算4.带有正则化的代价函数和梯度计算5.拟合数据6.创建多项式特征7.准备多项式回归数据8.绘制学习曲线𝜆0𝜆1&…

刘锋 吕乃基:互联网中心化与去中心化之争

前言:本文发表在2019年5月《中国社会科学报》上,主要从神经学角度分析互联网的发育过程,并对云计算和区块链为代表的中心化与去中心化技术趋势进行了探讨。当前,学术界和产业界对互联网的未来发展出现了分歧。随着谷歌、亚马逊、F…

iOS-BMK标注覆盖物

在iOS开发中,地图算是一个比较重要的模块。我们常用的地图有高德地图,百度地图,谷歌地图,对于中国而言,苹果公司已经不再使用谷歌地图,官方使用的是高德地图。下面将讲述一下百度地图开发过程中的一些小的知…

PyTorch框架学习二——基本数据结构(张量)

PyTorch框架学习二——基本数据结构(张量)一、什么是张量?二、Tensor与Variable(PyTorch中)1.Variable2.Tensor三、Tensor的创建1.直接创建Tensor(1)torch.tensor()(2)to…

十年空缺一朝回归,百度正式任命王海峰出任CTO

来源:机器之心百度要回归技术初心了吗?自 2010 年李一男卸任百度 CTO 之后,百度对这一职位就再无公开任命,一空就是 10 年。而今天上午李彦宏突然发出的一纸职位调令,让这个空缺多年的百度 CTO 之位有了新的掌舵手。就…

Windows下卸载TensorFlow

激活tensorflow:activate tensorflow输入:pip uninstall tensorflowProceed(y/n):y如果是gpu版本: 激活tensorflow:activate tensorflow-gpu输入:pip uninstall tensorflow-gpuProceed&#xf…

PyTorch框架学习三——张量操作

PyTorch框架学习三——张量操作一、拼接1.torch.cat()2.torch.stack()二、切分1.torch.chunk()2.torch.split()三、索引1.torch.index_select()2.torch.masked_select()四、变换1.torch.reshape()2.torch.transpace()3.torch.t()4.torch.squeeze()5.torch.unsqueeze()一、拼接 …

'chcp' 不是内部或外部命令,也不是可运行的程序

在cmd窗口中输入activate tensorflow时报错chcp 不是内部或外部命令,也不是可运行的程序 添加两个环境变量即可解决: 将Anaconda的安装地址添加到环境变量“PATH”,如果没有可以新建一个,我的安装地址是“D:\Anaconda”&#xf…