【Python 代码】CS231n中Softmax线性分类器、非线性分类器对比举例(含python绘图显示结果)

  1 #CS231n中线性、非线性分类器举例(Softmax)
  2 #注意其中反向传播的计算
  3
  4 # -*- coding: utf-8 -*-
  5 import numpy as np
  6 import matplotlib.pyplot as plt
  7 N = 100 # number of points per class
  8 D = 2 # dimensionality
  9 K = 3 # number of classes
 10 X = np.zeros((N*K,D)) # data matrix (each row = single example)
 11 y = np.zeros(N*K, dtype=‘uint8‘) # class labels
 12 for j in xrange(K):
 13   ix = range(N*j,N*(j+1))
 14   r = np.linspace(0.0,1,N) # radius
 15   t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.2 # theta
 16   X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
 17   y[ix] = j
 18 # lets visualize the data:
 19 plt.xlim([-1, 1])
 20 plt.ylim([-1, 1])
 21 plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
 22 plt.show()
 23
 24
 25
 26 # initialize parameters randomly
 27 # 线性分类器
 28 W = 0.01 * np.random.randn(D,K)
 29 b = np.zeros((1,K))
 30
 31 # some hyperparameters
 32 step_size = 1e-0
 33 reg = 1e-3 # regularization strength
 34
 35 # gradient descent loop
 36 num_examples = X.shape[0]
 37 for i in xrange(200):
 38
 39   # evaluate class scores, [N x K]
 40   scores = np.dot(X, W) + b
 41
 42   # compute the class probabilities
 43   exp_scores = np.exp(scores)
 44   probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]
 45
 46   # compute the loss: average cross-entropy loss and regularization
 47   corect_logprobs = -np.log(probs[range(num_examples),y])
 48   data_loss = np.sum(corect_logprobs)/num_examples
 49   reg_loss = 0.5*reg*np.sum(W*W)
 50   loss = data_loss + reg_loss
 51   if i % 10 == 0:
 52     print "iteration %d: loss %f" % (i, loss)
 53
 54   # compute the gradient on scores
 55   dscores = probs
 56   dscores[range(num_examples),y] -= 1
 57   dscores /= num_examples
 58
 59   # backpropate the gradient to the parameters (W,b)
 60   dW = np.dot(X.T, dscores)
 61   db = np.sum(dscores, axis=0, keepdims=True)
 62
 63   dW += reg*W # regularization gradient
 64
 65   # perform a parameter update
 66   W += -step_size * dW
 67   b += -step_size * db
 68
 69   # evaluate training set accuracy
 70 scores = np.dot(X, W) + b
 71 predicted_class = np.argmax(scores, axis=1)
 72 print ‘training accuracy: %.2f‘ % (np.mean(predicted_class == y))
 73
 74 # plot the resulting classifier
 75 h = 0.02
 76 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
 77 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
 78 xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
 79                      np.arange(y_min, y_max, h))
 80 Z = np.dot(np.c_[xx.ravel(), yy.ravel()], W) + b
 81 Z = np.argmax(Z, axis=1)
 82 Z = Z.reshape(xx.shape)
 83 fig = plt.figure()
 84 plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
 85 plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
 86 plt.xlim(xx.min(), xx.max())
 87 plt.ylim(yy.min(), yy.max())
 88
 89 ## initialize parameters randomly
 90 #  含一个隐层的非线性分类器 使用ReLU
 91 h = 100 # size of hidden layer
 92 W = 0.01 * np.random.randn(D,h)
 93 b = np.zeros((1,h))
 94 W2 = 0.01 * np.random.randn(h,K)
 95 b2 = np.zeros((1,K))
 96
 97 # some hyperparameters
 98 step_size = 1e-0
 99 reg = 1e-3 # regularization strength
100
101 # gradient descent loop
102 num_examples = X.shape[0]
103 for i in xrange(10000):
104
105   # evaluate class scores, [N x K]
106   hidden_layer = np.maximum(0, np.dot(X, W) + b) # note, ReLU activation
107   scores = np.dot(hidden_layer, W2) + b2
108
109   # compute the class probabilities
110   exp_scores = np.exp(scores)
111   probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]
112
113   # compute the loss: average cross-entropy loss and regularization
114   corect_logprobs = -np.log(probs[range(num_examples),y])
115   data_loss = np.sum(corect_logprobs)/num_examples
116   reg_loss = 0.5*reg*np.sum(W*W) + 0.5*reg*np.sum(W2*W2)
117   loss = data_loss + reg_loss
118   if i % 1000 == 0:
119     print "iteration %d: loss %f" % (i, loss)
120
121   # compute the gradient on scores
122   dscores = probs
123   dscores[range(num_examples),y] -= 1
124   dscores /= num_examples
125
126   # backpropate the gradient to the parameters
127   # first backprop into parameters W2 and b2
128   dW2 = np.dot(hidden_layer.T, dscores)
129   db2 = np.sum(dscores, axis=0, keepdims=True)
130   # next backprop into hidden layer
131   dhidden = np.dot(dscores, W2.T)
132   # backprop the ReLU non-linearity
133   dhidden[hidden_layer <= 0] = 0
134   # finally into W,b
135   dW = np.dot(X.T, dhidden)
136   db = np.sum(dhidden, axis=0, keepdims=True)
137
138   # add regularization gradient contribution
139   dW2 += reg * W2
140   dW += reg * W
141
142   # perform a parameter update
143   W += -step_size * dW
144   b += -step_size * db
145   W2 += -step_size * dW2
146   b2 += -step_size * db2
147 # evaluate training set accuracy
148 hidden_layer = np.maximum(0, np.dot(X, W) + b)
149 scores = np.dot(hidden_layer, W2) + b2
150 predicted_class = np.argmax(scores, axis=1)
151 print ‘training accuracy: %.2f‘ % (np.mean(predicted_class == y))
152 # plot the resulting classifier
153 h = 0.02
154 x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
155 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
156 xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
157                      np.arange(y_min, y_max, h))
158 Z = np.dot(np.maximum(0, np.dot(np.c_[xx.ravel(), yy.ravel()], W) + b), W2) + b2
159 Z = np.argmax(Z, axis=1)
160 Z = Z.reshape(xx.shape)
161 fig = plt.figure()
162 plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral, alpha=0.8)
163 plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
164 plt.xlim(xx.min(), xx.max())
165 plt.ylim(yy.min(), yy.max())

运行结果

时间: 2024-11-07 07:53:11

【Python 代码】CS231n中Softmax线性分类器、非线性分类器对比举例(含python绘图显示结果)的相关文章

Python代码样例列表

├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│      NFA引擎,Python正则测试工具应用示例.py│      Python datetime计时程序的实现方法.py│      python du熊学斐波那契实现.py│      python lambda实现求素数的简短代码.py│      Python localtime()方法计算今天是一年中第几周.py│      Python math方法算24点代码详解.py│      Pyth

随机森林入门攻略(内含R、Python代码)

随机森林入门攻略(内含R.Python代码) 简介 近年来,随机森林模型在界内的关注度与受欢迎程度有着显著的提升,这多半归功于它可以快速地被应用到几乎任何的数据科学问题中去,从而使人们能够高效快捷地获得第一组基准测试结果.在各种各样的问题中,随机森林一次又一次地展示出令人难以置信的强大,而与此同时它又是如此的方便实用. 需要大家注意的是,在上文中特别提到的是第一组测试结果,而非所有的结果,这是因为随机森林方法固然也有自己的局限性.在这篇文章中,我们将向你介绍运用随机森林构建预测模型时最令人感兴趣

[转] Python 代码性能优化技巧

选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率.如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下

Python 代码性能优化技巧(转)

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(

【专栏】Python在DevOps中的应用

互联网时代,只有能够快速试验新想法,并在第一时间,安全.可靠的交付业务价值,才能保持竞争力.DevOps推崇的自动化构建/测试/部署,以及系统度量等技术实践,是互联网时代必不可少的. 大家好,我是余洪春,当然很多人更熟悉的是我的网名"抚琴煮酒". 我在电子商务网站和大型CDN系统运维已工作10多年,在Linux集群.自动化运维.系统安全及高并发高流量网站架构设计等方面进行了深入的研究,在大量一线实践中积累了丰富的经验. 同时,我坚持文档记录,是51CTO和ChinaUnix等知名社区的

Python&MySQL操作过程中遇到的编码问题

对于Python字符编码的理解 之前整理了一部分,这次主要是设计到数据库操作的. 下面是一些编码方面的概念和原理,以条目方式整理: CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; DEFAULT CHARSET是设置默认字符编码集,也就是数据在库内从存储编码,我的理解是在存储这个层面上的,如果SQL命令是以gbk方式传输数据的(cur.execute('SET NAMES ut

简单分类器的python代码实现

本文是stanford大学课程:Convolutional Neural Networks for Visual Recognition 的一些笔记与第一次作业.主要内容为简单(多类)分类器的实现:KNN, SVM, softmax. softmax与SVM的一点区别,其中一张PPT说明: KNN部分框架都给出,只需要补充L2距离的实现: 1 import numpy as np 2 3 class KNearestNeighbor: 4 """ a kNN classifi

Softmax Regression及Python代码

Softmax Regression是逻辑回归在多分类问题上的推广,主要用于处理多分类问题,其中任意两个类别之间都是线性可分的. 假设有$k$个类别,每个类别的参数向量为${\theta}_j $,那么对于每个样本,其所属类别的概率为: \[P({{y}_{i}}|X,{{\theta }_{j}})=\frac{{{e}^{{{\theta }_{j}}X}}}{\sum\limits_{l=1}^{k}{{{e}^{{{\theta }_{l}}X}}}}\] 相比如逻辑回归的损失函数,So

如何从python代码中直接访问Android的Service

在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接访问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也同样可以在Python中封装同样的C++代码,这篇文