Softmax回归(使用theano)

  1 # coding:utf8
  2 import numpy as np
  3 import cPickle
  4 import theano
  5 import os
  6 import theano.tensor as T
  7
  8 class SoftMax:
  9     def __init__(self,MAXT=50,step=0.15,landa=0):
 10         self.MAXT = MAXT
 11         self.step = step
 12         self.landa = landa  #在此权重衰减项未能提升正确率
 13
 14     def load_theta(self,datapath):
 15         self.theta = cPickle.load(open(datapath,‘rb‘))
 16
 17     def process_train(self,data,label,typenum,batch_size=500):
 18         valuenum=data.shape[1]
 19         batches =  data.shape[0] / batch_size
 20         data = theano.shared(np.asarray(data,dtype=theano.config.floatX))
 21         label = T.cast(theano.shared(np.asarray(label,dtype=theano.config.floatX)), ‘int32‘)
 22         x = T.matrix(‘x‘)
 23         y = T.ivector(‘y‘)
 24         index = T.lscalar()
 25         theta =  theano.shared(value=0.001*np.zeros((valuenum,typenum),
 26             dtype=theano.config.floatX),
 27             name=‘theta‘,borrow=True)
 28         hx=T.nnet.softmax(T.dot(x,theta))
 29         cost =  -T.mean(T.log(hx)[T.arange(y.shape[0]), y]) +0.5*self.landa*T.sum(theta ** 2)  #权重衰减项
 30         g_theta = T.grad(cost, theta)
 31         updates = [(theta, theta - self.step * g_theta)]
 32         train_model = theano.function(
 33         inputs=[index],outputs=cost,updates=updates,givens={
 34             x: data[index * batch_size: (index + 1) * batch_size],
 35             y: label[index * batch_size: (index + 1) * batch_size]
 36         },allow_input_downcast=True
 37         )
 38         lastcostJ = np.inf
 39         stop = False
 40         epoch = 0
 41         costj=[]
 42         while (epoch < self.MAXT) and (not stop):
 43             epoch = epoch + 1
 44             for minibatch_index in xrange(batches):
 45                 costj.append(train_model(minibatch_index))
 46             if np.mean(costj)>=lastcostJ:
 47                 print "costJ is increasing !!!"
 48                 stop=True
 49             else:
 50                 lastcostJ=np.mean(costj)
 51                 print(( ‘epoch %i, minibatch %i/%i,averange cost is %f‘) %
 52                         (epoch,minibatch_index + 1,batches,lastcostJ))
 53         self.theta=theta
 54         if not os.path.exists(‘data/softmax.pkl‘):
 55             f= open("data/softmax.pkl",‘wb‘)
 56             cPickle.dump(self.theta.get_value(),f)
 57             f.close()
 58         return self.theta.get_value()
 59
 60     def process_test(self,data,label,batch_size=500):
 61         batches = label.shape[0] / batch_size
 62         data = theano.shared(np.asarray(data,dtype=theano.config.floatX))
 63         label = T.cast(theano.shared(np.asarray(label,dtype=theano.config.floatX)), ‘int32‘)
 64         x = T.matrix(‘x‘)
 65         y = T.ivector(‘y‘)
 66         index = T.lscalar()
 67         hx=T.nnet.softmax(T.dot(x,self.theta))
 68         predict = T.argmax(hx, axis=1)
 69         errors=T.mean(T.neq(predict, y))
 70         test_model = theano.function(
 71         inputs=[index],outputs=errors,givens={
 72             x: data[index * batch_size: (index + 1) * batch_size],
 73             y: label[index * batch_size: (index + 1) * batch_size]
 74         },allow_input_downcast=True
 75         )
 76         test_losses=[]
 77         for minibatch_index in xrange(batches):
 78             test_losses.append(test_model(minibatch_index))
 79         test_score = np.mean(test_losses)
 80         print(( ‘minibatch %i/%i, test error of model %f %%‘) %
 81               (minibatch_index + 1,batches,test_score * 100.))
 82
 83     def h(self,x):
 84         m = np.exp(np.dot(x,self.theta))
 85         sump = np.sum(m,axis=1)
 86         return m/sump
 87
 88     def predict(self,x):
 89         return np.argmax(self.h(x),axis=1)
 90
 91 if __name__ == ‘__main__‘:
 92     f = open(‘mnist.pkl‘, ‘rb‘)
 93     training_data, validation_data, test_data = cPickle.load(f)
 94     training_inputs = [np.reshape(x, 784) for x in training_data[0]]
 95     data = np.array(training_inputs)
 96     training_inputs = [np.reshape(x, 784) for x in validation_data[0]]
 97     vdata = np.array(training_inputs)
 98     f.close()
 99     softmax = SoftMax()
100     softmax.process_train(data,training_data[1],10)
101     softmax.process_test(vdata,validation_data[1])
102     #minibatch 20/20, test error of model 7.530000 %
时间: 2024-10-22 16:59:04

Softmax回归(使用theano)的相关文章

DeepLearning tutorial(1)Softmax回归原理简介+代码详解

DeepLearning tutorial(1)Softmax回归原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43157801 本文介绍Softmax回归算法,特别是详细解读其代码实现,基于python theano,代码来自:Classifying MNIST digits using Logistic Regression,参考UFLDL. 一.Softmax回归简介 关于算法的详

Softmax回归(Softmax Regression, K分类问题)

Softmax回归:K分类问题, 2分类的logistic回归的推广.其概率表示为: 对于一般训练集: 系统参数为: Softmax回归与Logistic回归的关系 当Softmax回归用于2分类问题,那么可以得到: 令θ=θ0-θ1,就得到了logistic回归.所以实际上logistic回归虽然有2个参数向量,但这2个参数向量可以退化到1个参数向量.推广到K个类别,那么就需要K-1个参数向量 参数求解 类似于logistic regression,求最大似然概率,有: 其中1{k=y}为真值

softmax回归(理论部分解释)

前面我们已经说了logistic回归,训练样本是,(且这里的是d维,下面模型公式的x是d+1维,其中多出来的一维是截距横为1,这里的y=±1也可以写成其他的值,这个无所谓不影响模型,只要是两类问题就可以),训练好这个模型中参数θ以后(或者是这个模型,这俩是一个模型),然后给入一个新的,我们就可以根据模型来预测对应label=1或0的概率了. 前面处理的是两类问题,我们想把这个两类问题扩展,即根据训练好的模型,给入一个新的,我们就可以根据模型来预测对应label=1,2,…k等多个值的概率.我们首

机器学习 —— 基础整理(五):线性回归;二项Logistic回归;Softmax回归;广义线性模型

本文简单整理了以下内容: (一)线性回归 (二)二分类:二项Logistic回归 (三)多分类:Softmax回归 (四)广义线性模型 二项Logistic回归是我去年入门机器学习时学的第一个模型,我觉得这个模型很适合用来入门(但是必须注意这个模型有很多很多很多很多可以展开的地方).比较有意思的是那时候还不会矩阵微积分,推导梯度时还是把矩阵全都展开求的(牛顿法要用的二阶梯度也是)... 下面的文字中,"Logistic回归"都表示用于二分类的二项Logistic回归. 首先约定一下记号

UFLDL教程笔记及练习答案三(Softmax回归与自我学习)

1:softmax回归 当p(y|x,theta)满足多项式分布,通过GLM对其进行建模就能得到htheta(x)关于theta的函数,将其称为softmax回归.教程中已经给了cost及gradient的求法.需要注意的是一般用最优化方法求解参数theta的时候,采用的是贝叶斯学派的思想,需要加上参数theta. 习题答案: (1) 数据加载------代码已给 (2) %% STEP 2: Implement softmaxCost   得到计算cost和gradient M = theta

Softmax回归

Reference:http://ufldl.stanford.edu/wiki/index.php/Softmax_regression 起源:Logistic的二类分类    Softmax回归是Logistic回归的泛化版本,用于解决线性多类(K类)的分类问题.Logistic回归可以看作是Softmax回归在K=2时的特例. ①如何从2类转化为K类? 解决方案是引入K组(W.b)参数,选择$max P(Y=j|x^{i},\theta,b)$作为最终分类即可. 由于存在K组参数,原来的$

ufldl学习笔记与编程作业:Softmax Regression(softmax回归)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ softmax回归其实是逻

机器学习之线性回归---logistic回归---softmax回归

1 摘要 本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识.前四节主要讲述了回归问题,回归属于有监督学习中的一种方法.该方法的核心思想是从连续型统计数据中得到数学模型,然后将该数学模型用于预测或者分类.该方法处理的数据可以是多维的. 讲义最初介绍了一个基本问题,然后引出了线性回归的解决方法,然后针对误差问题做了概率解释.之后介绍了logistic回归.最后上升到理论层次,提出了一般回归. 2 问题引入 这个例子来自http://www.cnblogs.com/LeftNot

DeepLearning之路(二)SoftMax回归

Softmax回归 1. softmax回归模型 softmax回归模型是logistic回归模型在多分类问题上的扩展(logistic回归解决的是二分类问题). 对于训练集,有. 对于给定的测试输入,我们相拥假设函数针对每一个类别j估算出概率值.也就是说,我们估计得每一种分类结果出现的概率.因此我们的假设函数将要输入一个维的向量来表示这个估计得概率值.假设函数形式如下: 其中是模型的参数.这一项对概率分布进行归一化,舍得所有概率之和为1. softmax回归的代价函数: 上述公式是logist

UFLDL教程(四)之Softmax回归

关于Andrew Ng的machine learning课程中,有一章专门讲解逻辑回归(Logistic回归),具体课程笔记见另一篇文章. 下面,对Logistic回归做一个简单的小结: 给定一个待分类样本x,利用Logistic回归模型判断该输入样本的类别,需要做的就是如下两步: ① 计算逻辑回归假设函数的取值hθ(x),其中n是样本的特征维度 ② 如果hθ(x)>=0.5,则x输入正类,否则,x属于负类 或者直接利用判别边界进行判断,即:如果θ'x>=0,则x输入正类,否则,x属于负类 所