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

news2024/11/30 0:33:42

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的可视化: 


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 ipdb

def 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 minibatches
    of 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 means
      that X[i] has label c, where 0 <= c < C.
    - reg: (float) regularization strength

    Returns 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.0
    dW = 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,:]
      #求每张图的logits
      logits=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 samples
      loss+=Li

      #Calc grad
      #矩阵W共有D行,C列,所以每列表示一个分类,因此在计算dW时应按列选择。
      for j in range(num_classes):
        if j == y[i]:
          dW[:,j]+=(P[j]-1)*Xi
        else:
          dW[:,j]+=P[j]*Xi


    # Avg
    loss/=num_samples
    dW/=num_samples

    # +Reg
    loss+=reg*np.sum(W*W)
    dW+=2*reg*W

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW


def 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.0
    dW = 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=NxC
    logits_shifted = logits-np.max(logits,axis=1,keepdims=True)# NxC矩阵 - 按行(类)取出最大值
    exp_logits =np.exp(logits_shifted)#NxC
    sum_exp=np.sum(exp_logits,axis=1,keepdims=True)# 按行(类)求和,得到一个列向量,Nx1
    P=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

    # Avg
    loss/=num_samples
    dW/=num_samples

    # +Reg
    loss+=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.coloradmin.cn/o/1815445.html

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

相关文章

物业抄表与收费系统的现代化解决方案

1.系统简述 物业抄表与收费系统是当代物业管理方法不可或缺的一部分&#xff0c;它通过自动化的形式&#xff0c;高效地管理方法电力能源使用数据&#xff0c;提升收费标准高效率&#xff0c;降低人为失误&#xff0c;同时提供数据统计分析适用。该系统不但优化了物业企业的日…

人脸识别之--计算余弦相似度-android

余弦相似度是比对两个向量是否一致&#xff0c;余弦相似度是通过计算两个向量的夹角余弦值来衡量它们之间的相似度&#xff0c;算出来的值可以直接用作相似度的分数。 公式&#xff1a; 余弦相似度和欧式距离经常用来人脸识别特征对比。 其中&#xff1a; 1、余弦相似度是通…

vue富文本wangeditor加@人功能(vue2 vue3都可以)

依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…

python中字典的创建

1.字典的概念 字典是一种存储键值对的结构。 在python中能够根据键&#xff08;key&#xff09;来快速找到值&#xff08;value&#xff09; 根据key能够快速的找到value&#xff08;一对一的映射关系&#xff09; 在python的字典中&#xff0c;可以同时包含很多个键值对&am…

江协科技STM32学习- 2安装Keil5-MDK

本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩…

基于小波脊线的一维时间序列信号分解方法(MATLAB R2018A)

信号分解技术是把一个复杂信号分解为若干含有时频信息的简单信号&#xff0c;研可通过分解后的简单信号来读取和分析复杂信号的有效特征。因此&#xff0c;信号分解技术对分析结果的影响是不言而喻的。 傅里叶分解是早期常用的信号分解方法&#xff0c;最初被用于分析热过程&a…

这些代码是APP自动化插件开发的关键!

在移动互联网高速发展的今天&#xff0c;APP的自动化插件开发成为了提升应用功能性和用户体验的重要手段。 而在这一过程中&#xff0c;五段源代码的巧妙运用往往能够起到事半功倍的效果&#xff0c;本文将为您科普分享这五段关键的源代码&#xff0c;帮助您更好地理解和应用自…

SJ708-II安全帽垂直间距配带高度测量仪

一、主要用途 依据GB/T2811-2007和GB/T2812-2006最新国家标准研发&#xff0c;主要用于安全帽垂直间距和配带高度试验&#xff0c;是安全帽生产企业办理生产许可证以及LA(劳安)认证&#xff0c;监督检测单位&#xff0c;科研机构必备安全帽检测设备。 二、仪器特征 1、采用铝…

3dmax材质高清参数设置图

3ds Max是一款在设计领域内非常受推崇的软件&#xff0c;以其强大的建模功能和丰富的材质库而知名。设计师可以通过调整材质的参数来制作出更加真实的渲染效果。本文将介绍一些技巧&#xff0c;教您如何通过简单的调整来优化3ds Max中的材质设置&#xff0c;从而增强作品的视觉…

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了&#xff0c;也能够执行代码了&#xff0c;但是代码错了该如何调试呢&#xff1f;Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序&#xff1a; 但是我们尝试…

机器学习笔记 - 用于3D数据分类、分割的Point Net的网络实现

上一篇,我们大致了解了Point Net的原理,这里我们要进行一下实现。 机器学习笔记 - 用于3D数据分类、分割的Point Net简述-CSDN博客文章浏览阅读3次。在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transforme…

Swift 中更现代化的调试日志系统趣谈(一)

概述 昨天凌晨苹果刚刚发布了 WWDC2024 一系列新视频,这标志着苹果开发的一只脚已迈入人工智能(Apple Intelligence)的崭新时代。即便如此,我相信不少秃头码农们还在使用一些“远古简陋”的调试方法来剖析 2142 年的代码。 不过别担心,这一切将在小伙伴们学完本系列博文后…

Redis的一点入门了解

Redis NoSql概述 1、单机MySQL的时代 90年代&#xff0c;一个网站的访问量一般不会太大&#xff0c;单个数据库完全足够应付&#xff0c;技术上更多的会去使用静态页面html&#xff0c;对此服务器压根没多少压力&#xff1b; 但即使在这样的情况下&#xff0c;也会存在着一些…

doc 和 docx 文件的区别

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

几行代码实现多对多网格视图

当我们希望实现如下图所示效果如何实现呢: 我们可以使用Vis.js,vis.js Vis Network Examples Vis.js 是一个支持多种网络可视化的库,使用简单,功能强大。 以下是具体实现例子 不带箭头的: <!DOCTYPE html> <html> <head><meta charset="utf…

Windows 系统下 JDK 1.8 与 17 版本的相互切换

目录 一、当前本机已安装的 JDK 版本&#xff1a;1.8 二、下载 JDK 17 三、修改系统配置&#xff0c;将 JDK 版本切换为 17 1、新建 JAVA17_HOME 2、编辑 Path 3、验证是否切换成功 4、之后想再切换成 JDK 1.8 一、当前本机已安装的 JDK 版本&#xff1a;1.8 二、下载 J…

pyecharts画水球图

水波图图是一种适合于展现单个百分比数据的图表类型 from pyecharts.charts import Grid,Liquid from pyecharts.commons.utils import JsCodel1 (Liquid()#设置数据系列名称及数据.add("lq",[0.7,0.6,0.25],center["60%","50%"],color[blue,ye…

图像处理与视觉感知复习--空间域图像增强

文章目录 图像增强直方图空间滤波器 图像增强 图像增强 { 处理方法 { 空间域方法 { 点处理 ( 变换 ) 模板处理 ( 滤波 ) 频域方法 处理策略 { 全局处理 局部处理 处理对象 { 灰度图像 彩色图像 图像增强 \begin{cases} 处理方法 \begin{cases} 空间域方法 \begin{cases} 点处理…

Hadoop 2.0:主流开源云架构(三)

目录 四、Hadoop 2.0体系架构&#xff08;一&#xff09;Hadoop 2.0公共组件Common&#xff08;二&#xff09;分布式文件系统HDFS&#xff08;三&#xff09;分布式操作系统Yarn&#xff08;四&#xff09;Hadoop 2.0安全机制简介 四、Hadoop 2.0体系架构 &#xff08;一&…

查分易分班查询系统怎么做?

分班查询一直是让许多老师头疼的问题。一到开学季&#xff0c;办公桌上就堆满了学生的资料和分班表。要将这些信息一一录入系统&#xff0c;然后发布给学生和家长极其浪费时间和精力&#xff0c;而且很容易出错。每当分班结果公布时&#xff0c;家长和学生急切地想要知道自己的…