吴恩达老师机器学习-ex4

news2024/12/27 14:42:03

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

导入相关库,读取数据

因为这次的数据是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 = 1

size = (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.T
    a2 = 1/(1+np.exp(-z2))
    a2 = np.insert(a2,0,values=1,axis=1)
    z3 = a2 @ theta2.T
    h = 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))/m
    reg = (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 - Y
    delta2 = delta3 @ theta2[:,1:] * sigmoid_gradient(z2)
    Delta2 = delta3.T @ a2 / m
    Delta1 = delta2.T @ a1 / m
    theta1[:, 0] = 0
    theta2[:, 0] = 0
    regDelta1 = Delta1 + (lamda / m) * theta1
    regDelta2 = Delta2 + (lamda / m) * theta2
    return 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.coloradmin.cn/o/1965162.html

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

相关文章

使用obsidian-webpage-export 插件,将 Obsidian 中的笔记导出为网页

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

2024下《网络工程师》案例简答题,刷这些就够了!

距离2024下半年软考已经越来越近了,不知道今年备考软考网络工程师的同学们开始准备了吗? 简答题一直是网工拿分的重点区域,对于许多考生来说,也往往是最具挑战性的部分。今天我就把那些重要的案例简答题类型整理汇总给大家&#x…

【Python学习手册(第四版)】学习笔记12-if语句(and、or、三元表达式)详解

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文较简单,对if语句的格式、示例、多路做了示例,以及真值测试(and、or等)介绍,最后介绍了三三元表达式…

M12电连接器的编码分类及应用领域分析

12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型,每种编码都有其特定的应用场景和功能: A编码:适用于传感器、直流电、1G以太网。 B编码:主要用于PROFIBUS总线系统。 C编码:适用于交流电。 D编码&#x…

十八次(虚拟主机与vue项目、samba磁盘映射、nfs共享)

1、虚拟主机搭建环境准备 将原有的nginx.conf文件备份 [rootserver ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak[rootserver ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf[rootserver ~]# grep -Ev "#|^$"…

视频编辑SDK,功能全面、包体小,支持高效灵活接入

如何在快节奏的市场环境中,快速制作出高质量、富有吸引力的视频内容,成为了众多企业面临的共同挑战。美摄科技,作为视频编辑技术的先行者,携其全面功能、小巧包体、高效灵活接入的视频编辑SDK,为企业视频创作带来了革命…

pytorch tensor的高级索引

1. 取索引的方式[[a,b,c...],[a,b,c...] ] 下面的例子对于这个x进行操作 全取x, print(x[:,:,:]) 第一个冒号代表0轴,第二个冒号代表1轴,第三个冒号代表2轴 第一个冒号可以选这类 第二个冒号可以选这类 第三个冒号可以选这类 2. 比较符号 idxx[:,0,:…

全麦饼:健康与美味的完美结合

在追求健康饮食的当下,全麦饼以其独特的魅力脱颖而出,成为了众多美食爱好者的新宠。食家巷全麦饼,顾名思义,主要由全麦面粉制作而成。与普通面粉相比,全麦面粉保留了小麦的麸皮、胚芽和胚乳,富含更多的膳食…

基于SpringBoot+Vue的热门网游推荐网站(带1w+文档)

基于SpringBootVue的热门网游推荐网站(带1w文档) 基于SpringBootVue的热门网游推荐网站(带1w文档) 本系统选用B/S结构开发,它是一个提供可以对热门网游推荐进行信息管理的系统,用户可以在该系统获取最新动态,可以结识更多的朋友,产…

Scrapy vs Beautifulsoup - 哪一个更适合您?

你是新手开发者还是经验丰富的开发者? 不管怎样,有一点是肯定的——网页爬虫对你来说可能很棘手! 因此,我们必须选择一个高效的工具来简化我们的工作。 你在权衡哪个更适合网页爬虫,Scrapy还是BeautifulSoup吗&…

基于alpha shapes的任意空间平面点云边缘提取(python)

1、背景介绍 基于alpha shapes提取二维平面点云边缘点,一般是将点云投影至xoy平面,利用x、y坐标根据alpha shapes判别准则即可实现边缘点识别。具体的原理,可以参考之前博客: 基于alpha shapes的点云边缘点提取(pytho…

Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址:https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP:192.168.56.118 信息收集 使用御剑对目标进行扫描 该靶标开启了21、80两个端口,21端口运行服务为ftp,其版本为 vsftpd 3.0.3 ,80端口运行服务为Apa…

飞塔fortigate怎么进入cli

好几个人问了好几次 捂脸 就右上角找到这个图标点进去

干货来喽:车载语音识别测试全面分析笔记!

从台架到实车的语音识别专项测试实战,笔记很详细哦,跟着了解学习起来! 一、语音识别原理及测试范围 1、语音识别的原理: ① 通过麦克风输入人的声音 ② 声学处理:处理掉杂音,噪音 ③ 特征处理:提取声音中…

花几千上万学习Java,真没必要!(三十七)

IO 流: 读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。 写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存…

【香橙派系列教程】(四)基于ARM-Linux架构的语音控制刷抖音项目

【四】基于ARM-Linux架构的语音控制刷抖音项目 文章目录 【四】基于ARM-Linux架构的语音控制刷抖音项目1.语音模块配置1.创建产品2.引脚配置3.词条定义4.添加控制5.发布版本6.烧录固件 2.编程实现语音和开发板通信3.手机接入Linux热拔插1.dmesg命令2.adb调试踩坑问题 3.总结 4.…

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha; Kaptcha是一个高度可配置的验证码生成工具,由Google开源。它通过一系列配置文件和插件,实现了将验证码字符串自动转换成图片流,并可以与session进行关联,从而在验证过程中使用&#…

如何快速进行视频截屏?5个软件帮助你快速截屏

如何快速进行视频截屏?5个软件帮助你快速截屏 截取视频屏幕是一项常见的任务,无论是为了制作教学视频、分享有趣的片段,还是保存重要的画面。以下是五款好用的软件,能够帮助你快速进行视频截屏。 迅捷视频转换器 这款软件不单…

EF8 code first 模式下去除自动生成表加s(复数形式)全网第一帖

前言: 今天下午一直在纠结这个问题,EF如果采用code first模式,进行迁移,他会表名自动给你加上s形成复数形式,搜了很久找到的觉方案有两种,其中实体类指定表名的方法是可行的,另外一种都是说 modelBuilder.…

昇思25天学习打卡营第XX天|LSTM+CRF序列标注

条件随机场(CRF)是一种用于序列预测的概率图模型,它考虑了序列中元素之间的相互依赖关系。与简单的多分类问题不同,CRF能够捕捉序列中标签的连贯性,如在命名实体识别中,一个词的标签往往依赖于它前面词的标…