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

本文主要是介绍深度学习 --- 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

这篇关于深度学习 --- stanford cs231 编程作业(assignment1,Q3: softmax classifier)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056973

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?