机器学习:SVM、softmax、Dropout及最大池化max_pool介绍

一、利用线性SVM进行分类

train_data: (train_num, 3072)

训练流程

  1. 初始化权重W: (3072, 10) 梯度dW: (3072, 10)
  2. train_data和权重相乘得到score(10,)对应每个类别的分数
    2.1 对于每个score中的分数i,如果是正确的类别对应的score跳过
    2.2 如果是其他的类别,计算margin=score[i]-correct_score+1
    2.3 如果其他的margin大于零则loss+=margin; dW[:, i]+=X[i].T; dW[:, correct]-=X[i].T
  3. 得到平均的lossloss /= num_train; loss += 0.5 * reg * np.sum(W * W)
  4. 得到最终的梯度dW /= num_train; dW += reg * W

向量化上述过程

scores = X.dot(W) # (num_train, num_class)
# 之前的correct类的下标是一个一个获取的,这里直接作为列向量
correct_class_scores = scores[range(num_train), list(y)].reshape(-1,1) #(num_train, 1)
# score和correct相减的时候会进行广播,这里要注意正确类别的margin也变成了1,而在上面的流程中是不计算的
margins = np.maximum(0, scores - correct_class_scores +1) # (num_train, num_class)
# 将正确类别的margin置为0
margins[range(num_train), list(y)] = 0
loss = np.sum(margins) / num_train + 0.5 * reg * np.sum(W * W)# 用coeff_mat和训练数据矩阵相乘来得到梯度
coeff_mat = np.zeros((num_train, num_classes))
# 那些需要更新参数的位置的系数就是1,上面的流程中是dW[:, i]+=X[i].T,这里系数为1,然后下面再进行矩阵相乘,效果一样
coeff_mat[margins > 0] = 1
coeff_mat[range(num_train), list(y)] = 0
# 正确类别的梯度的是其他类别之和
coeff_mat[range(num_train), list(y)] = -np.sum(coeff_mat, axis=1)dW = (X.T).dot(coeff_mat)
dW = dW/num_train + reg*W

问题

为什么在梯度检查的时候会出现个别较大的差错? 因为svm loss不是完全可导的,就像relu函数在0附近一样,越靠近0,分析梯度和数值梯度的差就越多。

将参数W进行可视化的结果是什么样的? W: (3072, 10), 重新reshape到(32, 32, 3, 10)最后的10代表10个分类器,前面的就是每个分类器可视化的结果,它像是每个类别的所有图像的一个模板(取了平均值,因为只有数值相近的时候平方才最大),如果某个类别的分数较高,那么它就越接近这个类图片的模板。

二、使用softmax进行分类

大体上和线性svm分类差不多,只是loss函数不一样。

使用循环来计算softmax的loss和梯度

# 第i个数据
for i in xrange(num_train):scores = X[i].dot(W)shift_scores = scores - max(scores)# 这条数据计算出来的损失loss_i = - shift_scores[y[i]] + np.log(sum(np.exp(shift_scores)))loss += loss_i# 对于这条数据得到的score,每个类别的score都计算导数# 单个的score计算导数相当于更新这个类别对应的那个分类器的导数所以有[:, j]for j in xrange(num_classes):softmax_output = np.exp(shift_scores[j])/sum(np.exp(shift_scores))# 如果这个类别是正确的类别if j == y[i]:dW[:,j] += (-1 + softmax_output) *X[i] else: dW[:,j] += softmax_output *X[i] loss /= num_train 
loss +=  0.5* reg * np.sum(W * W)
dW = dW/num_train + reg* W 

使用矩阵来计算softmax的loss和梯度

num_classes = W.shape[1]
num_train = X.shape[0]
# 计算得到每个训练数据每个类别的score
scores = X.dot(W) # (num_train, 10)
# 下面的reshape是为了让计算得到的max在和score相减的时候进行广播,每行的max都是一样的
shift_scores = scores - np.max(scores, axis = 1).reshape(-1,1) # (num_train, 10)
# 下面的reshape是为了能够进行广播
softmax_output = np.exp(shift_scores)/np.sum(np.exp(shift_scores), axis = 1).reshape(-1,1) # (num_train, 10)
loss = -np.sum(np.log(softmax_output[range(num_train), list(y)])) # 正确类别的占比的负数
loss /= num_train 
loss +=  0.5* reg * np.sum(W * W)dS = softmax_output.copy()
# 正确类别的减一,其他的直接和X矩阵相乘
dS[range(num_train), list(y)] += -1
dW = (X.T).dot(dS)
dW = dW/num_train + reg* W 

其他问题

在刚初始化的时候,为什么希望计算出来的loss接近-log(0.1)? 因为刚初始化的时候,每个类别的概率都应该相同,所以正确类别的概率应该是0.1,那么loss就应该是-log(0.1)。

三、Dropout

Dropout(Improving neural networks by preventing co-adaptation of feature detectors)是一个regularization技术,随机让某些神经元进行失效来获得更好的效果。

Dropout前向传播

def dropout_forward(x, dropout_param):"""Inputs:- x: 输入的数据,可以是任何的shape- dropout_param: dict包含如下的键:- p: dropout概率,每个神经元被失活的概率- mode: 'test'/'train'如果是'test'则不进行失活- seed: 随机数生成种子,这个是为了梯度检验用,正常使用中不应该指定这个参数Outputs:- out: 输出数据shape同x- cache: (dropout_param, mask) 在'train'mode中,mask作用于输入x得到输出,在'test'mode中mask为None"""p, mode = dropout['p'], dropout_param['mode']if 'seed' in deopout_param:np.random.seed(dropout_param['seed'])mask = Noneout = Noneif mode == 'train':# 注意/(1-p) 前向传播的时候均值得稳定mask = (np.random.rand(*x.shape)>=p)/(1-p)out = x*maskelif mode == 'test':out = xcache = (dropout_param, mask)out = out.astype(x.dtype, copy=False)return out, cache

Dropout反向传播

def dropout_backward(dout, cache):"""Inputs:- dout: 反向传播回来的导数- cache: (dropout_param, mask)Output:- dx: 导数"""dropout_param, mask = cachemode = dropout_param['mode']dx = Noneif mode == 'train':# dloss/dx = dloss/dout * dout/dx = dloss/dout * mask# 被失活的神经元的mask处为0,其余为1dx = dout * maskelif mode == 'test':dx = doutreturn dx

Dropout的作用

Dropout可以有效地抑制过拟合,一般来说神经元失活的概率越大在训练集上和在验证集上的区别就越小,但是较大的失活概率会导致神经网络的容量下降,更难拟合数据。

四、最大池化max_pool

最大池化前向传播

在前向传播的过程中注意保存中间数据,为了反向传播的时候方便计算。

def max_pool_forward_naive(x, pool_param):"""MaxPool前向传播的一个简单实现版本Inputs:- x: (N, C, H, W)- pool_param: 包含最大池化参数的字典- 'pool_height': 池化区域的高度- 'pool_width': 池化区域的宽度- 'stride': 相邻池化区域的距离Returns:- out: 输出的数据- cache: (x, pool_param)"""out = NoneN, C, H, W = x.shapeHH, WW, stride = pool_param['pool_height'], pool_param['pool_width']H_out = (H-HH)/stride+1W_out = (W-WW)/stride+1out = np.zeros((N, C, H_out, W_out))# 先确定每个做最大池化的区域for i in xrange(H_out):for j in xrange(W_out):# 取出这个区域的数据x_masked = x[:, :, i*stride:i*stride+HH, j*stride:j*stride+WW] # (N, C, HH, WW)# 取最大值 (N, C)out[:, :, i, j] = np.max(x_masked, axis=(2,3))cache = (x, pool_param)return out, cache

最大池化反向传播

def max_pool_backward_naive(dout, cache):"""MaxPool反向传播的一个简单版本Inputs:- dout: 反向传播过来的导数- cache: (x, pool_param)Returns:- dx: 导数"""dx = Nonex, pool_param = cacheN, C, H, W = x.shapeHH, WW, stride = pool_param['pool_height'], pool_param['pool_width'], pool_param['stride']H_out = (H-HH)/stride+1W_out = (W-WW)/stride+1# 最大值处的导数能够进行传播,其余的地方导数为0dx = np.zeros_like(x)# 先确定之前池化的每个区域for i in xrange(H_out):for j in xrange(W_out):# 取出池化这个区域的数据x_masked = x[:, :, i*stride:i*stride+HH, j*stride:j*stride+WW] # (N, C, HH, WW)# 取得最大值 (N,C)max_x_masked = np.max(x_masked, axis=(2,3))# 得到最大值的mask (N, C, HH, WW) 最大值为1 其余为0temp_binary_mask = (x_masked == (max_x_masked)[:,:,None,None])# 最大值处的导数能够进行传播,其余的地方导数为0dx[:, :, i*stride:i*stride+HH, j*stride:j*stride+WW] += temp_binary_mask * (dout[:,:,i,j])[:,:,None,None]

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

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

相关文章

【GAMES101】Lecture 20 颜色

目录 光 颜色 加色系统 CIE RGB颜色匹配实验 颜色空间 CIE XYZ颜色空间 HSV颜色空间(Hue-Saturation-Value) CIELAB空间 减色系统:CMYK 光 光是由不同波长的光波组成的,其中可见光的波长范围在400nm到700nm 用谱功率密度(Spectral…

Low 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程(附链接)https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开 DVWA 靶场并登录,找到反射型 XSS 页面(笔者这里是 Low 级别) 先…

图像处理之《鲁棒图像隐写术:隐藏频率系数中的信息》论文精读

一、文章摘要 隐写术是一种将秘密信息隐藏到公共多媒体对象中而不会引起第三方怀疑的技术。然而,大多数现有的工作不能提供良好的抗有损JPEG压缩鲁棒性,同时保持相对较大的嵌入容量。提出了一种基于可逆神经网络的端到端鲁棒隐写系统。该方法将秘密信息…

SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配

文章目录 2.6 WebMvc场景下的自动装配原理2.6.1 WebMvcAutoConfiguration2.6.2 Servlet容器的装配2.6.2.1 EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow2.6.2.2 BeanPostProcessorsRegistrar(后置处理器的注册器)2.6.2.3 两个定制器的注册 2.6.3 DispatcherServlet的装配2…

医学搜题神器找答案? #知识分享#职场发展

大学生必备的搜题工具,专业课本习题、电子版教材、考研资料、英语四六级等考试题目也能一并搜索,每道题目都有详细的讲解,每个都堪称大学神器。 1.题小聪 这是一个公众号 它支持文本搜索、扫码搜书、拍照搜索,不会的题目直接对…

幻兽帕鲁PalWorld服务器2024年配置选择

幻兽帕鲁PalWorld是一款备受期待的虚拟游戏,其独特的幻兽系统和丰富的世界观吸引了大量玩家。然而,随着游戏日益受到关注,服务器的配置选择成为了关键问题。2024年,随着技术不断发展,玩家对于游戏体验的需求也在不断提…

[word] word自定义编号格式怎么设置 #经验分享#职场发展#职场发展

word自定义编号格式怎么设置 在Word文档的编辑中,经常会给段落添加编号,但是在编号的使用过程中我们会遇到很多问题,今天给大家分享word自定义编号格式怎么设置,希望能帮到您! 1.如何自定义编号格式? 点击…

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由

NAS如何成为生产力?使用绿联DX4600 Pro搭建图床并实现创作自由 哈喽小伙伴们好,我是Stark-C~ 关注我的小伙伴都知道,我之前有分享过我的创作过程与工具,其中介绍了我个人其实一直都是使用Markdown的编辑器来进行图文创作的。 我…

数据存储的端序(大端序和小端序)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码,离了指针是很难办到的。 2、因为VB/VBA里,用Long来表示指针,而32位(包括64位兼容的)计算机里4字节整数的处理,是最快的方式! 3、要想用指针来处理数据,…

leetcode 153

153 寻找旋转排序数组中的最小值 这道题,如果我们熟悉数组 api,可以直接用 Arrays.sort()秒杀,这个方法使用了双轴快速排序算法。 解法1如下: class Solution {public int findMin(int[] nums) {Arrays.sort(nums);return nums…

如何在 Mac 上恢复永久删除的文件:有效方法

您是否错误地从 Mac 中删除了某个文件,并且确信它已经永远消失了?好吧,你可能错了。即使您认为已永久删除计算机上的数据,仍有可能将其恢复。 在本文中,您将了解如何在 Mac 上恢复永久删除的文件,并了解增…

基于微信小程序的校园失物招领小程序

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【Web】小白友好的Java内存马基础学习笔记

目录 简介 文件马与内存马的比较 文件马原理 内存马原理 内存马使用场景 内存马分类 内存马注入方式 这篇文章主要是概念性的,具体技术细节不做探究,重点在祛魅。 简介 内存马(Memory Shellcode)是一种恶意攻击技术&…

Open CASCADE学习|扫掠

目录 1、BRepPrimAPI_MakePrism Draw Test Harness: C++: 2、BRepPrimAPI_MakeRevol Draw Test Harness: C++: 3、BRepOffsetAPI_MakePipeShell Draw Test Harness: C++: Draw Test Harness: C++: Draw Test Harness: C++:​ 锥度弯曲管 ​ 参考文献:…

【后端高频面试题--Mybatis篇】

🚀 作者 :“码上有前” 🚀 文章简介 :后端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 后端高频面试题--Mybatis篇 什么是Mybatis?Mybatis的优缺点?Mybatis的特点…

学习总结12

# [NOIP2005 普及组] 采药 ## 题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说&#xff1a…

大水仙花数求解

输入位数,求解水仙花数。暴力求解,位数如果太多,会超时。 思路: (1)11333355和33331155看上去是不一样的两个数,但是它们又一样,因为相同数字出现的次数一样。 (2&…

云卷云舒:如何持续降低云数据库的成本?

数据库在云计算领域内是一个利润空间较大的产品体系,但是如果成本控制策略控制、市场推广不达预期,很有可能出现“负效益”,本文就谈谈个人看法,从云计算服务提供商的角度。 一、首先是技术手段方面 弹性伸缩:快速地…

windows系统 集成开发环境 IntelliJ IDEA的配置maven步骤

在 Windows 系统上配置 IntelliJ IDEA 以使用 Maven 需要遵循几个步骤。Maven 是一个流行的项目管理和构建自动化工具,它可以帮助开发者管理项目的依赖、构建和部署。IntelliJ IDEA 提供了对 Maven 的内置支持,使得配置过程变得相对简单。以下是详细的配…

存储服务器主要运用在哪些方面

存储服务器是一种专门为数据存储设计的一款服务器设备,是为存储设备、存储系统或者存储的解决方案。存储服务器一般是由硬件设备、存储软件、操作系统和网络连接组成的,主要用来存储大量的数据,如图片、视频和文件等内容。 在数据管理方面&am…