zoukankan      html  css  js  c++  java
  • Python: Soft_max 分类器

    我们能够建立例如以下的loss function:

    Li=log(pyi)=logefyijefj

    L=1NiLi+12λklW2k,l

    以下我们推导loss对W,b的偏导数,我们能够先计算loss对f的偏导数,利用链式法则。我们能够得到:

    Lifk=Lipkpkfkpifk=pi(1pk)i=kpifk=pipkikLifk=1pyipyifk=(pk1{yi=k})

    进一步,由f=XW+b,可知fW=XT,fb=1,我们能够得到:

    ΔW=LW=1NLiW+λW=1NLippffW+λWΔb=Lb=1NLib=1NLippffbW=WαΔWb=bαΔb

    以下是用Python实现的soft max 分类器,基于Python 2.7.9, numpy, matplotlib.
    代码来源于斯坦福大学的课程: http://cs231n.github.io/neural-networks-case-study/
    基本是照搬过来,通过这个程序有助于了解python的语法。

    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 100  # number of points per class
    D = 2    # dimensionality
    K = 3    # number of classes
    X = np.zeros((N*K,D))    #data matrix (each row = single example)
    y = np.zeros(N*K, dtype='uint8')  # class labels
    
    for j in xrange(K):
      ix = range(N*j,N*(j+1))
      r = np.linspace(0.0,1,N)            # radius
      t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.2 # theta
      X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
      y[ix] = j
    
    # print y
    
    # lets visualize the data:
    plt.scatter(X[:,0], X[:,1], s=40, c=y, alpha=0.5)
    plt.show()
    #Train a Linear Classifier
    
    # initialize parameters randomly
    W = 0.01 * np.random.randn(D,K)
    b = np.zeros((1,K))
    
    # some hyperparameters
    step_size = 1e-0
    reg = 1e-3 # regularization strength
    
    # gradient descent loop
    num_examples = X.shape[0]
    
    for i in xrange(200):
    
      # evaluate class scores, [N x K]
      scores = np.dot(X, W) + b 
    
      # compute the class probabilities
      exp_scores = np.exp(scores)
      probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]
    
      # compute the loss: average cross-entropy loss and regularization
      corect_logprobs = -np.log(probs[range(num_examples),y])
      data_loss = np.sum(corect_logprobs)/num_examples
      reg_loss = 0.5*reg*np.sum(W*W)
      loss = data_loss + reg_loss
      if i % 10 == 0:
        print "iteration %d: loss %f" % (i, loss)
    
      # compute the gradient on scores
      dscores = probs
      dscores[range(num_examples),y] -= 1
      dscores /= num_examples
    
      # backpropate the gradient to the parameters (W,b)
      dW = np.dot(X.T, dscores)
      db = np.sum(dscores, axis=0, keepdims=True)
    
      dW += reg*W     #regularization gradient
    
      # perform a parameter update
      W += -step_size * dW
      b += -step_size * db
    
    # evaluate training set accuracy
    scores = np.dot(X, W) + b
    predicted_class = np.argmax(scores, axis=1)
    print 'training accuracy: %.2f' % (np.mean(predicted_class == y))
    

    生成的随机数据

    这里写图片描写叙述

    执行结果

    这里写图片描写叙述

  • 相关阅读:
    阿里云RDS的mysql数据库连接
    DRF框架400错误信息处理(视图集)
    关于百度Tongji Api的文档补充
    Python几种创建list的方法的效率对比
    手把手教你使用python复杂一点点的装饰器
    Python爬虫常用模块,BeautifulSoup笔记
    LSSS 构造过程
    微信网站应用扫码登陆
    分享一个自用的 Inno Setup 软件打包脚本
    彻底解决:请求被中止: 未能创建 SSL/TLS 安全通道
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7308746.html
Copyright © 2011-2022 走看看