深度学习 --- 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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学