#-*- coding: utf-8 -*-
import numpy as npdef softmax_loss_naive(W, X, y, reg):"""使用显式循环版本计算Softmax损失函数N表示:数据个数,D表示:数据维度,C:表示数据类别个数。Inputs:- W: 形状(D, C) numpy数组,表示分类器权重(参数).- X: 形状(N, D) numpy数组,表示训练数据.- y: 形状(N,) numpy数组,表示数据类标。其中 y[i] = c 意味着X[i]为第c类数据,c取值为[0,c)- reg: 正则化惩罚系数Returns  二元组(tuple):- loss,数据损失值- dW,权重W所对应的梯度,其形状和W相同"""# 初始化损失值与梯度.loss = 0.0  dW = np.zeros_like(W)#############################################################################        #  任务:使用显式循环实现softmax损失值loss及相应的梯度dW 。                 ##  温馨提示: 如果不慎,将很容易造成数值上溢。别忘了正则化哟。               ############################################################################### =============================================================================# 第一种# =============================================================================# num_train = X.shape[0]  # 获取训练样本数# num_class = W.shape[1]  # 获取分类总数# for i in range(num_train):  #     s = X[i].dot(W)  # (1, C) 每类的可能性#     scores = s - max(s)  # 关注最高分#     #使用指数函数,在不影响单调性的情况下,使相对得分更明显#     scores_E = np.exp(scores)  #     # 计算总得分#     Z = np.sum(scores_E)#     # 找到目标值#     score_target = scores_E[y[i]]#     # 计算出损失值#     loss += -np.log(score_target/Z)#     # 计算梯度值#     for j in range(num_class):#         if j == y[i]:#             dW[:, j] += -(1-scores_E[j]/Z)*X[i]#         else:#             dW[:, j] += X[i]*scores_E[j]/Z# # 使用平均损失,再引入正则化# loss = loss/num_train+0.5*reg*np.sum(W*W)# # 使用平均梯度,再引入正则化# dW = dW/num_train+reg*W# =============================================================================# 第二种# =============================================================================N = X.shape[0]  # 获取训练样本数C = W.shape[1]  # 获取分类总数result = X.dot(W)result -= np.max(result,axis=1,keepdims=True)#避免指数太大,导致计算太大,内存不够for i in range(N):# 计算函数值soft_max = np.exp(result[i][y[i]])/np.sum(np.exp(result[i]))# 计算出损失值loss += -np.log(soft_max)for j in range(C):if j==y[i]:dW[:,j] += -X[i].TdW[:,j] += (X[i].T * np.exp(result[i][j])) / (np.sum(np.exp(result[i])))loss/= Nloss += reg*np.sum(W*W)dW /= NdW += reg*2*W##############################################################################                           结束编码                                        ##############################################################################return loss, dWdef softmax_loss_vectorized(W, X, y, reg):"""Softmax损失函数,使用矢量计算版本.输入,输出格式与softmax_loss_naive相同"""# 初始化损失值与梯度loss = 0.0dW = np.zeros_like(W)############################################################################## 任务: 不使用显式循环计算softmax的损失值loss及其梯度dW.                    ## 温馨提示: 如果不慎,将很容易造成数值上溢。别忘了正则化哟。                ############################################################################### 训练样本数num_train = X.shape[0]# 计算函数值s = np.dot(X, W)# 关注最高分scores = s-np.max(s, axis=1, keepdims=True)# 使用指数函数来扩大相对比scores_E = np.exp(scores)# 求和得到总值Z = np.sum(scores_E, axis=1, keepdims=True)# 计算每一类的可能性prob = scores_E/Z# 真实标签标记y_trueClass = np.zeros_like(prob)y_trueClass[range(num_train), y] = 1.0# 计算损失值loss += -np.sum(y_trueClass*np.log(prob))/num_train+0.5*reg*np.sum(W*W)# 计算梯度dW += -np.dot(X.T, y_trueClass-prob)/num_train+reg*W##############################################################################                          结束编码                                         ##############################################################################return loss, dW

softmax.py

#-*- coding: utf-8 -*-import numpy as np
from random import shuffle
from softmax_loss import *class Softmax(object):def __init__(self):self.W = Nonedef train(self, X, y, learning_rate=1e-3, reg=1e-5, num_iters=100,batch_size=200, verbose=False):'''使用最小批量梯度下降算法训练Softmax分类器Parameters----------X : TYPE数据y : TYPE数据类标learning_rate : TYPE, optional学习率. The default is 1e-3.reg : TYPE, optional权重衰减因子. The default is 1e-5.num_iters : TYPE, optional迭代次数. The default is 100.batch_size : TYPE, optional批大小. The default is 200.verbose : TYPE, optional是否显示中间过程. The default is False.Returns-------loss_history : TYPEDESCRIPTION.'''# 获得训练数据及维度num_train, dim = X.shape# 我们的计数是从0开始,因此10分类任务其y的最大值为9num_classes = np.max(y) + 1# 如果没有权重if self.W is None:# 随机初始化 Wself.W = 0.001 * np.random.randn(dim, num_classes)# 储存每一轮的损失结果 Wloss_history = []for it in range(num_iters):X_batch = Noney_batch = None##########################################################################                             任务:                                     ##     从训练数据 X 中采样大小为batch_size的数据及其类标,               ##     并将采样数据及其类标分别存储在X_batch,y_batch中                  ##        X_batch的形状为  (dim,batch_size)                              ##        y_batch的形状为  (batch_size)                                  ##     提示: 可以使用np.random.choice函数生成indices.                    ##            重复采样要比非重复采样快许多                               ########################################################################### False表示不可以取相同数字indices = np.random.choice(num_train, batch_size, False)X_batch = X[indices, :]y_batch = y[indices]##########################################################################                       结束编码                                        ########################################################################### 计算损失及梯度loss, grad = self.loss(X_batch, y_batch, reg)loss_history.append(loss)# 更新参数##########################################################################                       任务:                                           ##               使用梯度及学习率更新权重                                ##########################################################################self.W = self.W - learning_rate*grad ##########################################################################                      结束编码                                         ##########################################################################if verbose and it % 500 == 0:print('迭代次数 %d / %d: loss %f' % (it, num_iters, loss))return loss_historydef predict(self, X):"""使用已训练好的权重预测数据类标Inputs:- X:数据形状 (N,D) .表示N条数据,每条数据有D维Returns:- y_pred:形状为(N,) 数据X的预测类标,y_pred是一个长度维N的一维数组,每一个元素是预测的类标整数"""y_pred = np.zeros(X.shape[0])############################################################################                         任务:                                           ##              执行预测类标任务,将结果储存在y_pred                       ############################################################################# 找到可能性最高的类别作为预测分类y_pred = np.argmax(X.dot(self.W), axis=1)    ############################################################################                           结束编码                                      ############################################################################return y_preddef loss(self, X_batch, y_batch, reg):"""Compute the loss function and its derivative. Subclasses will override this.Inputs:- X_batch: A numpy array of shape (N, D) containing a minibatch of Ndata points; each point has dimension D.- y_batch: A numpy array of shape (N,) containing labels for the minibatch.- reg: (float) regularization strength.Returns: A tuple containing:- loss as a single float- gradient with respect to self.W; an array of the same shape as W"""return softmax_loss_vectorized(self.W, X_batch, y_batch, reg)

Softmax分类器基本实现相关推荐

  1. 3.9 训练一个 Softmax 分类器-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.8 Softmax 回归 回到目录 3.10 深度学习框架 训练一个 Softmax 分类器 (Training a Softmax Classifier) 上一个视频中 ...

  2. 训练softmax分类器实例_CS224N NLP with Deep Learning(四):Window分类器与神经网络

    Softmax分类器 我们来回顾一下机器学习中的分类问题.首先定义一些符号,假设我们有训练集 ,其中 为输入, 为标签,共包括 个样本: 表示第 个样本,是一个 维的向量: 表示第 个样本的标签,它的 ...

  3. SVM与SoftMax分类器

    出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299  声明:版权所有,转载请注明出处,谢谢. 转给自己 1. 线性分类器 在深度 ...

  4. 深度学习与计算机视觉(二)线性SVM与Softmax分类器

    2.线性SVM与Softmax分类器 2.1 得分函数(score function) 2.1.1 线性分类器 2.1.2 理解线性分类器 2.2 损失函数 2.2.1 多类别支持向量机损失(Mult ...

  5. 深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器--在深度学习的视觉分类中的,这两个分类器的原理和比较

    作者: 寒小阳  时间:2015年11月.  出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299  声明:版权所有,转载请注明出 ...

  6. 深度学习系列--1.入坑模型: 线性回归,logistic 回归,softmax分类器

    惭愧啊,读研的时候学得正是模式识别:当看着书本上都是公式推导.博士师兄们也都在公式推导研究新算法的时候,排斥心理到了顶点,从此弃疗. 工作三年,重新捡起,因为更关注实际操作,所以选择了<pyth ...

  7. 训练softmax分类器实例_一个值得深思的问题?为什么验证集的loss会小于训练集的loss...

    编辑:zero 关注 搜罗最好玩的计算机视觉论文和应用,AI算法与图像处理 微信公众号,获得第一手计算机视觉相关信息 在本教程中,您将学习在训练自己的自定义深度神经网络时,验证损失可能低于训练损失的三 ...

  8. 04 Softmax分类器

    Softmax分类器   我们处理多分类问题时,使用 SVM 输出的是一个得分值,但是得分值最后比来比去不是很直观.那么我们能不能将得分值进行转换,转换成一个概率值,如果一个新数据样本到达,如果属于某 ...

  9. softmax 分类器

    1.从两个角度理解 (1)信息论中交叉熵 H(p,q)=−∑xp(x)log(q(x))=H(p)+DKL(p∣∣q)H(p,q)=-\sum_xp(x)log(q(x))=H(p)+D_{KL}(p ...

  10. 训练softmax分类器实例_作业:softmax.ipynb

    这个作业与svm.ipynb类似,要求: 为类Softmax分类器实现一个全向量化运算的损失函数 .类Softmax分类器定义在linear_classifier.py中,而损失函数实现在 softm ...

最新文章

  1. 票房破五十亿!用Python分析李焕英为啥能逆袭《唐探3》
  2. 基于知识图谱、认知推理、逻辑表达的认知图谱,则被越来越多的国内外学者和产业领袖认为是 “目前可以突破这一技术瓶颈的可行解决方案之一
  3. Scala的异常处理
  4. 机器学习面试——逻辑回归和线性回归
  5. thinkphp extend.php,【ThinkPHP5.1】如何引用extend的类库
  6. 近期 AI 领域,招聘招生信息汇总
  7. 数据的降维之特征选择及主成分分析
  8. UVA.12230.Crossing Rivers(期望)
  9. Kettle下载Redisinput插件查询Redis数据
  10. HTML5期末大作业:我的家乡网站设计——可以根据百度百科更换家乡适用多数我的家乡
  11. 小米手机修改imei教程_小米手机imei码和s/n码以及测试调试界面唤起代码
  12. 联想笔记本fn键linux,Linux 系统下笔记本电脑的 Fn 键失效
  13. java从学号中提取班级_如何实现表间查询并提取班级号
  14. 记录一个在latex中使文章段落中每行两端对齐的方法
  15. u盘怎么数据恢复?靠这四种解决方法
  16. java poi jar包下载_poi.jar下载-poi.jar包下载 (3.8/3.9/3.10)版--pc6下载站
  17. 正大集团oa系统服务器,正大oa服务器地址
  18. MySQL的默认用户名和密码的什么?
  19. 引用图标库到自己页面
  20. URAL 1348. Goat in the Garden 2[求点到线段的距离]

热门文章

  1. Java 手机号中间四位隐藏 MySQL函数手机号四位隐藏 Oracle手机号隐藏Java手机号码隐藏
  2. 服务器502错误的原因分析
  3. 利用ArcGIS对shp文件进行投影转换
  4. python表情库 emoji
  5. Unity Shader Fog雾气效果
  6. CCIE其实什么都不是
  7. 一篇弄懂LayoutInflater.from(context).inflate()
  8. 使用PowerShell获取Trustedinstaller权限
  9. amazeui modal处理
  10. 软件开发与过程管理——需求定义