深度学习 --- stanford cs231 编程作业(assignment1,Q3: softmax classifier)

stanford cs231 编程作业(assignment1,Q3: softmax classifier

        softmax classifier和svm classifier的assignment绝大多部分都是重复的,这里只捡几个重点。

1,softmax_loss_naive函数,尤其是dW部分

1,1 正向传递

第i张图的在所有分类下的得分:

S=X_{i}W

softmax概率,其中C是总类别,y[i]是样本 i 的真实标签:

P(k=y_{i})=\frac{e^{S[k]}}{\sum_{j=1}^{c}e^{S[j]}}=\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}}

第i张图的softmax损失函数:

L_{i}=-log(P(k=y_{i}))

所有样本softmax的加权和:

L=\frac{1}{N}\sum_{i=1}^{N}L_{i}+Reg

Reg=\lambda R(W)=\lambda W^{2}

1,2 反向传递(需区分正确分类与其他分类)

1,2,1 对正确分类S[y[i]]而言:

\frac{\partial L}{\partial W}=\frac{\partial L}{\partial L_{i}}\cdot \frac{\partial L_{i}}{\partial P(k=y_{i})}\cdot \frac{\partial P(k=y_{i})}{\partial S[y[i]]}\cdot \frac{\partial S[y[i]]}{\partial W}

其中:

\frac{\partial L}{\partial L_{i}}=1/N\sum_{i=1}^{N}

\frac{\partial L_{i}}{\partial P(k=y_{i})}=-\frac{1}{P(k=y_{i})}

\frac{\partial P(k=y_{i})}{\partial S[y[i]]}=\frac{\partial (\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}})}{\partial S[y[i]]}=\frac{e^{S[y[i]]}\cdot \sum_{j=1}^{c}e^{S[j]}-e^{S[y[i]]}\cdot e^{S[y[i]]}}{(\sum_{j=1}^{c}e^{S[j]})^{2}}=\frac{e^{S[y[i]]}(\sum_{j=1}^{c}e^{S[j]}-e^{S[y[i]]})}{(\sum_{j=1}^{c}e^{S[j]})^{2}}=\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}}\cdot \frac{\sum_{j=1}^{c}e^{S[j]}-e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}}=\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}}\cdot (1-\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}})=P(k=y_{i})\cdot (1-P(k=y_{i}))

\frac{\partial S[y[i]]}{\partial W}=X_{i}

整合后: 

\frac{\partial L}{\partial W}=\frac{\partial L}{\partial L_{i}}\cdot \frac{\partial L_{i}}{\partial P(k=y_{i})}\cdot \frac{\partial P(k=y_{i})}{\partial S[y[i]]}\cdot \frac{\partial S[y[i]]}{\partial W}=1/N\sum_{i=1}^{N}\cdot -\frac{1}{P(k=y_{i})}\cdot P(k=y_{i})\cdot (1-P(k=y_{i}))\cdot X_{i}=1/N\sum_{i=1}^{N}(P(k=y_{i})-1)X_{i}

Tips:商函数的导数

(\frac{f}{g})'=\frac{f'g-fg'}{g^{2}}

1,2,2 对其他分类S[j],j\neq y_{i}而言:

\frac{\partial L}{\partial W}=\frac{\partial L}{\partial L_{i}}\cdot \frac{\partial L_{i}}{\partial P(k=y_{i})}\cdot \frac{\partial P(k=y_{i})}{\partial S[j]}\cdot \frac{\partial S[j]}{\partial W}

其中:

\frac{\partial L}{\partial L_{i}}=1/N\sum_{i=1}^{N}

\frac{\partial L_{i}}{\partial P(k=y_{i})}=-\frac{1}{P(k=y_{i})}

\frac{\partial P(k=y_{i})}{\partial S[j]}=\frac{\partial (\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}})}{\partial S[y[i]]}=\frac{0\cdot \sum_{j=1}^{c}e^{S[j]}-e^{S[y[i]]}\cdot e^{S[j]}}{(\sum_{j=1}^{c}e^{S[j]})^{2}}=\frac{-e^{S[y[i]]}\cdot e^{S[j]}}{(\sum_{j=1}^{c}e^{S[j]})^{2}}=-\frac{e^{S[y[i]]}}{\sum_{j=1}^{c}e^{S[j]}}\cdot \frac{e^{S[j]}}{\sum_{j=1}^{c}e^{S[j]}}=-P(k=y_{i})\cdot P(k=j)

\frac{\partial S[y[i]]}{\partial W}=X_{i}

整合后: 

\frac{\partial L}{\partial W}=\frac{\partial L}{\partial L_{i}}\cdot \frac{\partial L_{i}}{\partial P(k=y_{i})}\cdot \frac{\partial P(k=y_{i})}{\partial S[j]}\cdot \frac{\partial S[j]}{\partial W}=1/N\sum_{i=1}^{N}\cdot -\frac{1}{P(k=y_{i})}\cdot -P(k=y_{i})\cdot P(k=j)\cdot X_{i}=1/N\sum_{i=1}^{N}P(k=j)X_{i}

2,学习率(learning rate)与正则化约束的系数(regularization strength)

2,1 初次尝试

计算结果:

观察:

        根据初次尝试的计算结果得出,当lr=1e-6时和reg=1e3时,验证集的准确率最高接近40%的准确率。

2,2 基于初次尝试的结果重新选择lr和reg

       

         在lr=1e-6时和reg=1e3的附近分别取了几个值,得到如下结果:

观察:

        从上面的结果来看当lr在e-6这个数量级上,且reg在e2这个数量级上时,accuracy是高的。

2,3 最后一次尝试

        因为按照官方的要求,只要验证集的正确类能够达到35%就够了。但基于上面的结果似乎还能再逼近一下极限。

 这次,lr的调整就限制在了e-6。reg的值域基本上是在5e2~1e3之间浮动。

实验结果:

观察:

        总的正确率都很高,最大值出现在lr=2e-6,reg=7e2。 

思考题:

每一类所对应的权重矩阵W的可视化: 

 

可参考课件,每个W矩阵都是一个和图像同等大小的特征:


3,Python code

3,1 softmax function(code里面有较为详细的注释)

from builtins import range
import numpy as np
from random import shuffle
from past.builtins import xrange
import ipdbdef softmax_loss_naive(W, X, y, reg):"""Softmax loss function, naive implementation (with loops)Inputs have dimension D, there are C classes, and we operate on minibatchesof N examples.Inputs:- W: A numpy array of shape (D, C) containing weights.- X: A numpy array of shape (N, D) containing a minibatch of data.- y: A numpy array of shape (N,) containing training labels; y[i] = c meansthat X[i] has label c, where 0 <= c < C.- reg: (float) regularization strengthReturns a tuple of:- loss as single float- gradient with respect to weights W; an array of same shape as W"""# Initialize the loss and gradient to zero.loss = 0.0dW = np.zeros_like(W)############################################################################## TODO: Compute the softmax loss and its gradient using explicit loops.     ## Store the loss in loss and the gradient in dW. If you are not careful     ## here, it is easy to run into numeric instability. Don't forget the        ## regularization!                                                           ############################################################################### *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****num_samples = X.shape[0]num_classes = W.shape[1]for i in range(num_samples): Xi=X[i,:]#求每张图的logitslogits=Xi@W#当logit很大时,指数函数e^x会变得非常大,这很容易导致计算结果超出当前类型的最大值。#因此,在计算exp之前要对原始数据logits做如下处理。logits_shifted = logits-np.max(logits)exp_logits =np.exp(logits_shifted)#求logits向量的指数#指数化后再归一化得到概率sum_exp=np.sum(exp_logits)P=exp_logits/sum_exp#取出正确类的概率correct_class_score=P[y[i]]#正确类概率的负自然对数Li=-np.log(correct_class_score)#sum of all samplesloss+=Li#Calc grad#矩阵W共有D行,C列,所以每列表示一个分类,因此在计算dW时应按列选择。for j in range(num_classes):if j == y[i]:dW[:,j]+=(P[j]-1)*Xielse:dW[:,j]+=P[j]*Xi# Avgloss/=num_samplesdW/=num_samples# +Regloss+=reg*np.sum(W*W)dW+=2*reg*W# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****return loss, dWdef softmax_loss_vectorized(W, X, y, reg):"""Softmax loss function, vectorized version.Inputs and outputs are the same as softmax_loss_naive."""# Initialize the loss and gradient to zero.loss = 0.0dW = np.zeros_like(W)############################################################################## TODO: Compute the softmax loss and its gradient using no explicit loops.  ## Store the loss in loss and the gradient in dW. If you are not careful     ## here, it is easy to run into numeric instability. Don't forget the        ## regularization!                                                           ############################################################################### *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****num_samples = X.shape[0]num_classes = W.shape[1]logits=X@W #NxD,DxC=NxClogits_shifted = logits-np.max(logits,axis=1,keepdims=True)# NxC矩阵 - 按行(类)取出最大值exp_logits =np.exp(logits_shifted)#NxCsum_exp=np.sum(exp_logits,axis=1,keepdims=True)# 按行(类)求和,得到一个列向量,Nx1P=exp_logits/sum_exp# 按列计算得到NxC矩阵correct_class_score=P[range(num_samples),y]#找到每行正确类的概率,得到一个列向量L=-np.log(correct_class_score)#对正确类的概率进行进一步处理,结果依然是一个列向量loss+=np.sum(L)#列向量所有元素的和#Calc grad'''输入:矩阵P=NxC和矩阵X=NxD输出:矩阵dW=DxC对输入矩阵P而言,P=NxC,每行是一张图的c类的概率,共N张图。而每张图的dW中的全部列(一列表示一类)都是由P[j]*Xi或(P[j]-1)*Xi决定的。详细来说,第一张图对dW第一列的贡献为P[j]*X1或(P[j]-1)*X1。第二张图对dW第一列的贡献也是P[j]*X2或(P[j]-1)*X2。第n张图对dW第一列的贡献也是P[j]*Xn或(P[j]-1)*Xn。依此类推,全部图像对dW第一列的贡献为N个P[j]*Xi或(P[j]-1)*Xi的线性组合。另一方面,计算结果dW应该是一个DxC的矩阵,而X的维度是NxD。所以,矩阵乘法的顺序只能是X'xP。其中上面提到的Xi为矩阵X'的第i列,故而前面的线性组合是对矩阵X各列的操作。根据矩阵的乘法,X'xP=dW的每一列,都是基于P的某一列中的所有元素为权重去计算的。具体来说,X'xP的第一列就是以P的第一列中的元素为权重去计算的。其中第一列中的第一个元素就是第一张图的P[j]或P[j]-1,第一列中的第二个元素就是第二张图的P[j]或P[j]-1,总共有多少张图,第一列就有多少个元素。他们分别乘以X1,X2,...Xn.得到了第一列的结果。'''P[np.arange(num_samples), y] -= 1 #提取了每个样本(即每行)正确类别的概率,然后减去1,得到P[j]-1,其他类别保持P[j]不变dW=X.T@P# Avgloss/=num_samplesdW/=num_samples# +Regloss+=reg*np.sum(W*W)dW+=2*reg*W# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****return loss, dW

  (全文完) 

--- 作者,松下J27

 参考文献(鸣谢): 

1,Stanford University CS231n: Deep Learning for Computer Vision

2,Assignment 1

3,cs231n/assignment1/svm.ipynb at master · mantasu/cs231n · GitHub

4,CS231/assignment1/svm.ipynb at master · MahanFathi/CS231 · GitHub

(配图与本文无关)

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

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

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

相关文章

力扣爆刷第151天之TOP100五连刷(回文子串、DFS、旋转数组二分查找)

力扣爆刷第151天之TOP100五连刷&#xff08;回文子串、DFS、旋转数组二分查找&#xff09; 文章目录 力扣爆刷第151天之TOP100五连刷&#xff08;回文子串、DFS、旋转数组二分查找&#xff09;一、5. 最长回文子串二、102. 二叉树的层序遍历三、33. 搜索旋转排序数组四、200. 岛…

JS 实现Date日期格式的本地化

为了更好的更新多语言日期的显示&#xff0c;所以希望实现日期的本地化格式显示要求&#xff0c;常规的特殊字符型格式化无法满足显示要求&#xff0c;这里整理了几种我思考实现的本地化实现功能。 通过多方查找&#xff0c;总结了实现的思路主要有如下三个方向&#xff1a; 官…

【鸿蒙 HarmonyOS】Swiper组件

一、背景 项目中通常会遇到图片轮播&#xff0c;内容轮播的场景&#xff1b;如&#xff1a;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 二、源码地址 ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/harmony-os-next-swi…

Nginx与Gateway

Nginx与Gateway Nginx 基本介绍 Nginx 是一款轻量级的高性能 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它由俄罗斯的 Igor Sysoev 所开发&#xff0c;最初供俄罗斯大型的门户网站及搜索引擎 Rambler 使用。 Nginx 的特点在于其占用…

gma 2.0.10 (2024.06.16) | GmaGIS V0.0.0a4 更新日志

安装 gma 2.0.10 pip install gma2.0.10网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

AtCoder Beginner Contest 358 A~E(F,G更新中...)

A.Welcome to AtCoder Land 题意 给出两个字符串 S , T S, T S,T&#xff0c;请你判断是否满足&#xff1a; 字符串 S S S为AtCoder 字符串 T T T为Land 分析 输入后判断即可 代码 #include<bits/stdc.h> using namespace std; void solve() {string s, t;cin &g…

学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用

最近在学习opencv的使用&#xff0c;在参照书籍《OpenCV3编程入门》实现SURF时遇到不少问题&#xff0c;下面做归纳总结。 错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?createSUR…

51单片机实验05 -点阵

目录 一&#xff0c;熟悉矩阵led小灯 1&#xff0c;点亮矩阵的一只led 2&#xff0c;点亮矩阵的一排led 3&#xff0c;点亮矩阵的全部led static 关键字 unsigned 关键字 4&#xff0c;点阵的静态显示 2&#xff09;心形矩阵显示代码 3&#xff09;效果 二&#xff0c;课…

模仿qsort实现一个通用的冒泡排序

目录 前言 模仿 排序整型数组 排序结构体数组 排序字符数组 前言 qsort在前面我们讲到底层逻辑是快速排序的方式&#xff0c;是不是可以发现有了qsort来进行排序的话&#xff0c;就更加的方便快捷&#xff0c;我们在使用的时候 一方面&#xff0c;代码量会大大的减少 另一…

北京多商入驻app开发项目的主要优势及功能

多商入驻app开发项目的定义 随着电子支付技术的不断成熟&#xff0c;全国各地的消费者通过网络在线上购物的频率越来越高&#xff0c;为此&#xff0c;多商入驻app开发项目应用而生。各商家也纷纷开始申请入驻商城平台&#xff0c;开设自己的店铺。 图片来源&#xff1a;unspl…

【CT】LeetCode手撕—121. 买卖股票的最佳时机

目录 题目1- 思路2- 实现⭐121. 买卖股票的最佳时机——题解思路 2- ACM实现 题目 原题连接&#xff1a;121. 买卖股票的最佳时机 1- 思路 模式识别 模式1&#xff1a;只能某一天买入 ——> 买卖一次 ——> dp 一次的最大利润 动规五部曲 1.定义dp数组&#xff0c;确…

数据结构之线性表(2)

顺序表中的动态存储 上文我们了解到了顺序表中的静态顺序表的相关操作&#xff0c;今天我们来学习动态顺序表的知识。 为什么会存在动态顺序表呢&#xff1f;&#xff1f; 原因&#xff1a;静态顺序表给定的数据容量固定&#xff0c;多了浪费&#xff0c;少了不够用。 首先我…

【Python深度学习】——信息量|熵

【Python深度学习】——信息量|熵 假设1. 信息量1.1 含义1.2 信息量的公式: 2. 熵Entropy2. 含义2.2 熵的计算公式:2.3 熵的作用 假设 例子&#xff1a;掷硬币 假设我们有一个公平的硬币。这个硬币有两个面&#xff1a;正面&#xff08;H&#xff09;和反面&#xff08;T&…

一. 做一个前后端分离的电商项目(技术栈 : springboot+mybatis-plus+vue) 的前期准备

前期准备 ---- 项目创建和配置 一.创建springboot项目二.项目前期准备工作1. 修改springboot和jdk版本号2.Web请求处理(1) 添加web依赖(2) 测试是否能够成功访问(3) 修改端口号(4) 创建数据库 3. 连接数据库(1) 添加依赖(2)配置application.properties文件(3)添加包扫描 Mapper…

Validation校验

文章目录 Validation校验作用依赖坐标UserController接收客户端注册用户请求的方法请求参数封装实体User的结构校验分组 Validation校验 作用 服务端接收前端传递的请求从参数的时候&#xff0c;可以对请求参数进行自动校验。 场景&#xff1a;通过postman向服务端发送一个注…

《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…

修改yarn、npm、pnpm为国内镜像源

国内由于网络的原因&#xff0c;使用官方的npm、yarn、pnpm访问下载依赖库会很慢&#xff0c;有时候还会出现无法访问的情况&#xff0c;这时候就需要我们给npm、yarn、pnpm换一个国内的镜像源的&#xff0c;一般的我们可以将镜像换成淘宝的源&#xff0c;由于平时比较常用到的…

用飞书写博客,并自动部署

feishu-vitepress 用飞书写博客,并自动部署 目前的静态博客如vitepress&#xff0c;主要是用markdown来写内容。markdown虽然可读性比较好&#xff0c;但是在文章中贴图片有点麻烦&#xff0c;需要先保存图片到asset目录下&#xff0c;再在markdown中写图片地址。 平时工作主要…

优化查询性能:DolphinDB 时间类型数据比较规则详解

在数据库中&#xff0c;时间是一种常见的数据类型。在处理时间数据时&#xff0c;比较操作是非常常见的需求。然而&#xff0c;在不同的场景下&#xff0c;对时间类型数据进行比较时应用的规则不同。本文将从 DolphinDB 支持的时间类型开始&#xff0c;由浅入深分别介绍时间类型…