深度学习 --- 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,一经查实,立即删除!

相关文章

Reactor和epoll

Reactor模式和epoll都是与事件驱动的网络编程相关的术语&#xff0c;但它们属于不同的概念层面&#xff1a; Reactor模式 Reactor模式是一种事件驱动的编程模型&#xff0c;用于处理并发的I/O事件。这种模式使用一个或多个输入源&#xff08;如套接字&#xff09;&#xff0c…

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

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

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

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

vue中的路由拦截器的作用

在Vue.js中&#xff0c;我们通常使用vue-router来处理路由。而“路由拦截器”通常指的是在路由发生变化之前&#xff0c;根据某些条件来允许或阻止路由的跳转。这通常用于用户身份验证、数据加载或其他需要在导航发生之前执行的逻辑。 在vue-router中&#xff0c;我们可以使用…

【鸿蒙 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 的特点在于其占用…

多种异构数据的分析设计方案2:使用策略模式+函数式接口+MAP

多种异构数据的分析设计方案2&#xff1a;聊聊策略模式函数式接口MAP 定义 策略模式(Strategy Pattern): 定义并封装一系列算法类&#xff0c;并且这些类可以相互替换&#xff0c;可以在运行时根据需要选择不同的算法&#xff0c;而不需要修改客户端流程代码。 策略模式让算法…

质量小议39 -- 要多少饺子皮

试验、总结、调整&#xff1b; 基准、标量化、定制化。 包饺子&#xff0c;1斤肉&#xff0c;要多少饺子皮。 每次要包饺子总是要问这样的问题&#xff1a;皮少了馅没得处理&#xff0c;皮多了没地方放。 有没有一个好办法&#xff1f; 1. 影响饼子皮数量的原因有…

机房运维管理中的告警管理:构建高效IT故障管理体系

随着信息技术的迅猛发展&#xff0c;机房作为IT系统的核心&#xff0c;其运维管理的重要性日益凸显。其中&#xff0c;告警管理作为机房运维的关键环节&#xff0c;为用户提供了统一的全流程故障管理体系&#xff0c;确保网络故障的快速准确发现与处理。本文将深入探讨机房运维…

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版…

Dubbo入门与实践

Apache Dubbo是一款高性能的Java RPC框架&#xff0c;它提供了高效的服务发现和负载均衡机制。Dubbo适用于构建大规模的分布式系统&#xff0c;尤其是微服务架构。以下是Dubbo的入门指南和实践示例&#xff0c;帮助你开始使用Dubbo。 1. 环境准备 首先&#xff0c;确保你已经…

CAP和Base

CAP定理和BASE理论是分布式系统领域中两个重要的概念&#xff0c;它们分别描述了分布式系统设计中的一些基本限制和原则。 CAP定理 CAP定理&#xff0c;又称布鲁尔定理&#xff08;Brewer’s theorem&#xff09;&#xff0c;由计算机科学家埃里克布鲁尔&#xff08;Eric Bre…

oracle job

1. 定义 Job是一个可以被调度以在特定时间或按一定频率自动执行的数据库对象。Job通常用于执行预定的后台任务&#xff0c;如数据清理、统计信息更新、备份操作、数据导入导出、报告生成等。这些任务可以是任何可以在数据库环境中执行的操作&#xff0c;最常见的形式是调用存储…

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;代码量会大大的减少 另一…

bat处理批量文件重命名

遇到需要批量重命名文件的情况&#xff0c;许多博主文章有方法介绍&#xff0c;但可行的不多。&#xff08;主要是推荐专用工具&#xff0c;但这些工具还都是要收费的。&#xff09;下面把我的办法分享下。 总体概括是使用bat文件处理。 1、生成Excle文件 2、全选要重命名的所…

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

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

Ubuntu20.04环境下Baxter机器人开发环境搭建

Ubuntu20.04环境下Baxter机器人开发环境搭建 ubuntu20.04安装 略 安装ROS 略 Baxter机器人依赖安装 主目录创建工作空间&#xff0c;按以下步骤执行 mkdir -p ~/baxter_ws/src source /opt/ros/noetic/setup.bash cd ~/baxter_ws catkin_make catkin_make install s…