吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分

导入相关库,读取数据

因为这次的数据是mat文件,需要使用scipy库中的loadmat进行读取数据。

通过对数据类型的分析,发现是字典类型,查看该字典的键,可以发现又X,y等关键字。

import numpy as np
import scipy.io as sio
from scipy.optimize import minimize
from sklearn.preprocessing import OneHotEncoder#读取数据
path = "./ex4data1.mat"
data = sio.loadmat(path)
# print(type(data))
# print(data.keys())
X = data.get("X")
Y = data.get("y").flatten()
# X = np.insert(X,0,values=1,axis=1)
# print(Y.shape)
# print(Y)

one-hot编码

在之前没有涉及神经网络的方向传播等时,可以直接将Y降维。

而在神经网络中需要对Y进行编码,使每一个y值都是一个10维的向量

#one-hot编码
encoder = OneHotEncoder(sparse=False)
Y_onehot = encoder.fit_transform(Y.reshape(-1,1))

随机初始化

当使用高级优化算法或者梯度下降算法时,需要对\Theta向量进行赋值。

第一种想法是全部设为0,在逻辑回归中,是完全被允许的,但在训练神经网络时,这种初始值起不到任何作用。因为这会导致第二层激活项的值完全相同(因为前一层的权重相同),这个问题称为对称权重问题。

为了解决这个问题,我们采用随机初始化的方法,也就是将每一个\Theta _{ij}^{(l)}都初始化为一个范围在[-\varepsilon ,\varepsilon ]中的一个随机数。

#初始化参数
input_size = 400
hidden_size = 25
num_labels = 10
lamda = 1size = (input_size+1)*hidden_size+(hidden_size+1)*num_labels
params = np.random.uniform(-1.2,1.2,size)

序列化

因为到后面优化的时候fun和jac参数要求代价函数和梯度的第一个参数必须为一维向量,所以这里需要序列化。

#序列化
def serialize(theta1,theta2):return np.r_[theta1.flatten(),theta2.flatten()]
def deserialize(params):return params[:(input_size+1)*hidden_size].reshape(hidden_size,input_size+1),params[(input_size+1)*hidden_size:].reshape(num_labels,hidden_size+1)theta1,theta2 = deserialize(params)

前向传播

同上一题一致的前向传播

#前向传播
def feed_forward(params,X):theta1, theta2 = deserialize(params)a1 = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)z2 = a1 @ theta1.Ta2 = 1/(1+np.exp(-z2))a2 = np.insert(a2,0,values=1,axis=1)z3 = a2 @ theta2.Th = 1/(1+np.exp(-z3))return a1,z2,a2,z3,h

代价函数

\theta _{0}不需要正则化

公式如下:

#代价函数
def cost_func(params,X,Y,lamda):theta1, theta2 = deserialize(params)a1,z2, a2, z3, h = feed_forward(params,X)m = len(X)cost = -np.sum(Y * np.log(h) + (1-Y) * np.log(1-h))/mreg = (np.sum(np.power(theta1[:,1:],2)) + np.sum(np.power(theta2[:,1:],2)))* lamda/(2*m)return reg+cost

反向传播

相关公式如下:

#反向传播
def sigmoid_gradient(z):return 1/(1+np.exp(-z))*(1-1/(1+np.exp(-z)))def gradientReg(params,X,Y,lamda=1):theta1, theta2 = deserialize(params)m = len(X)a1, z2, a2, z3, h = feed_forward(params,X)delta3 = h - Ydelta2 = delta3 @ theta2[:,1:] * sigmoid_gradient(z2)Delta2 = delta3.T @ a2 / mDelta1 = delta2.T @ a1 / mtheta1[:, 0] = 0theta2[:, 0] = 0regDelta1 = Delta1 + (lamda / m) * theta1regDelta2 = Delta2 + (lamda / m) * theta2return serialize(regDelta1,regDelta2)

优化

fmin = minimize(fun=cost_func,x0=params,args=(X,Y_onehot,lamda),method="TNC",jac=gradientReg,options={'maxiter': 400})

预测

a1,z2,a2,z3,h = feed_forward(fmin.x,X)
y_pred = np.argmax(h,axis=1)
y_pred = y_pred + 1
acc = np.mean(y_pred==Y)
print(acc)

准确率达到了98.64%

---------------------------------------------------------------------------------------------------------------------------------

可以先将数据可视化,展示手写数字。

def one_image(X):pick_one = np.random.randint(5000)image = X[pick_one,:]fig,ax = plt.subplots()ax.imshow(image.reshape(20,20).T,cmap="gray_r")plt.xticks([])plt.yticks([])plt.show()one_image(X)
def more_image(X):pick_more = np.random.choice(len(X),100)images = X[pick_more,:]fig,ax = plt.subplots(nrows=10,ncols=10, figsize=(8, 8), sharex=True, sharey=True)for i in range(10):for j in range(10):ax[i,j].imshow(images[10*i+j].reshape(20,20).T,cmap="gray_r")plt.xticks([])plt.yticks([])plt.show()
more_image(X)

最后可以使用上面写出的函数将隐藏层可视化。

thetafinal1, thetafinal2 = deserialize(fmin.x)
hidden_layer = thetafinal1[:, 1:] 
more_image(hidden_layer)

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

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

相关文章

类和对象【下】

一、类的默认成员函数 默认成员函数从名字就告诉我们何为默认成员函数,即:用户没有实现,编译器默认自动实现的函数。 这时你不禁一喜,还有这好事,编译器给我打工,那么,我们今天都来了解一下都有…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区,更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器,采用先进的技术和设计,为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

锅总详解开源组织之ASF

ASF是什么?ASF孵化的顶级项目有哪些?ASF顶级项目商用化有哪些?涉及的版权是什么?应用案例有哪些?衍生项目及其关联是什么?希望本文能帮您解答这些疑惑! 一、ASF简介 Apache Software Foundati…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx(yum安装和源码安装) 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx(发音为“engine X”)是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器使用。它被广泛应用于高流量…

程序员面试中的“八股文”:是助力还是阻力?

“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…

使用 ChatGPT 检测媒体偏见的潜力和局限性

概述 随着数字时代的到来,信息瞬间传遍全球,但其中也不乏各种偏见。媒体偏见",即对某些观点的选择性报道,会影响人们对某一事件或问题的看法,并对公众舆论产生重大影响。事实上,许多人都认为主要媒体…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增,是一种通过应用合理且随机的变换(例如图像位移、旋转)来增加训练集多样性的技术。让有限的数据产生等价于更多数…

现在有什么赛道可以干到退休?

最近,一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传,也不知道是真是假,好巧不巧今天刷热点的时候又看到一条这样的热点:现在有什么赛道可以干到退休? 点进去看了几条热评,第一条热评说的…

自动化测试概念篇

目录 一、自动化 1.1 自动化概念 1.2 自动化分类 1.3 自动化测试金字塔 二、web自动化测试 2.1 驱动 2.2 安装驱动管理 三、selenium 3.1 ⼀个简单的web自动化示例 3.2 selenium驱动浏览器的工作原理 一、自动化 1.1 自动化概念 在生活中: 自动洒水机&am…

为什么说脱离决策的数据分析都是无用功

如果你问我数据分析师最重要的能力是什么,我的回答是数据驱动决策,这是数据分析师最值钱的能力,没有之一。 因为数据的价值在于挖掘,与业务和市场进行关联,找到机会点。抛开这个,数据本身一文不值&#xf…

deployment

一.deployment rc和rs控制器都是控制pod的副本数量的,但是,他们两个有个缺点,就是在部署新版本pod或者回滚代码的时候,需要先apply资源清单,然后再删除现有pod,通过资源控制,重新拉取新的pod来实…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展,网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市,网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站,作为杭州的重要交通枢纽,网约车管理显得尤为重要。近日,沧穹科技郑重宣告已助力…

昇思25天学习打卡营第XX天|Pix2Pix实现图像转换

Pix2Pix是一种基于条件生成对抗网络(cGAN)的图像转换模型,由Isola等人在2017年提出。它能够实现多种图像到图像的转换任务,如从草图到彩色图像、从白天到夜晚的场景变换等。与传统专用机器学习方法不同,Pix2Pix提供了一…

Java抽象类和抽象方法

以下文章只是自己十分粗浅的理解,和简单的使用方法,没有很深度的学习理解 Java的抽象类和抽象方法都是使用abstract关键字进行修饰。 抽象类 声明格式:" abstract 权限修饰符 class 类名 {...} " 抽象方法 声明格式:“…

Seata 入门与实战

一、什么是 Seata Seata 是一款开源的分布式事务解决方式,致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式事务解决方案。 二、Seata 组成 事务协调者(Transacti…

数据结构 - 红黑树

文章目录 前言一、红黑树介绍1、红黑树的概念2、红黑树的性质 二、实现红黑树1、基本框架2、插入3、删除4、查找5、测试红黑树6、红黑树代码 三、红黑树性能四、AVL树和红黑树的差别 前言 红黑树是一种二叉搜索树,所以学习前需要学会基本的二叉搜索树,并…

OnlyOffice在线部署

部署服务环境:Centos7.6 curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash 安装yum-utils工具 yum install yum-utils 添加nginx.repo源(Nginx官网有最新版,直接copy即可) vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx st…

Stable Diffusion 使用详解(4)---- 制作情景文本

目录 背景 制作流程 绘制底图 书写提示词 选底模 常规参数设置 controlNet 处理 Candy controlNet 设置 Depth controlNet 设置 输出效果 改进 适当修改提示词 适当修改controlNet 适当修改底模 背景 制作情景文本,将文本较好的融入背景图片。首先要…

c->c++(三):stl

本文主要探讨c的stl相关知识:模版,容器,泛型算法,萃取特化,智能指针等。 模版 模板typename和class均可定义 模板参数可是类型,还可是值 模板编译根据调用实参类型推导参数类型 编译器用值的类型…

以西门子winCC为代表的组态界面,还是有很大提升空间的。

组态界面向来都是功能为主,美观和体验性为辅的,这也导致了国内的一些跟随者如法炮制,而且很多操作的工程师也是认可这重模式,不过现在一些新的组态软件可是支持精美的定制化界面,还有3D交互效果,这就是确实…