Theano基础(二)

来源:互联网 发布:mud游戏编程吧 编辑:程序博客网 时间:2024/05/21 09:07
Theano基础(二)

    Theano是Python的一个Deep  Learning 开源包,也可以很方便地利用它来做科学计算。我打算边学边记录一下。


    本节参考:http://deeplearning.net/software/theano/tutorial/examples.html#logistic-function


    这一小节我们利用Theano做logistic回归,在此之前我们先了解一些Theano的知识。 对于logistic回归,忘记了推荐看一下Andrew Ng的教程,逻辑回归一章:http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=MachineLearning

    

     基础准备:

     上一节中(http://blog.csdn.net/lihaoweicsdn/article/details/49329557)

     我们利用theano创建了一个函数,完成两个矩阵相加的功能。这一节我们要来学习更多关于theano的知识。

     1.theano支持多输入多输出,请见下例:

import theano import theano.tensor as T x = T.dmatrices('x')y = T.dmatrices('y')x_add_y = x+yx_sub_y = x-yf = theano.function([x,y],[x_add_y,x_sub_y])print f([[1,1]],[[1,1] ])  ##结果:[array([[ 2.,  2.]]), array([[ 0.,  0.]])]

    2.指定输入变量默认值

      这时候我们要用到theano的Param 指定默认值

import theano import theano.tensor as T from theano import Paramx = T.dmatrices('x')s = 1 / (1 + T.exp(-x))logistic = theano.function([ Param(x,default = [[1]]) ],s)
      这里我们一直用的dmatrices 大家也可以随意用其他的,比如 dscalars等,依据需求而定。这里我们新出现了T.exp()  在tensor中,内置了很多常见的函数,比如abs() tanh() arcsin() ......

    3.使用共享变量

      这时要用到theano中的shared  共享变量能被多个函数所共用。

      在下例中 accumulator 函数中,updates 用来更新共享变量。函数完成的功能:记录函数被调用的次数。次数记录在共享变量state中。对于下面的f函数。state的值一直是0 但计算z时state的值暂时由r替换(由givens实现)   这一部分暂时做了解即可。


import theano import theano.tensor as T from theano import Paramfrom theano import sharedstate = shared(0)  #创建共享变量,初始值为0inc = T.iscalar('inc') #32-bits 整型##输入变量: inc 输出:上一次的state 值  更新: state = state + inc accumulator = theano.function([inc], state, updates=[(state, state+<span style="font-family:SimSun;">1</span>)])r = T.scalar(dtype = state.dtype) #替换量 须与state 同类型z = inc + statef = theano.function([inc,r],z,givens=[(state,r)])
  
   4.生成随机数

import theano import theano.tensor as T from theano import Paramfrom theano import sharedfrom theano.tensor.shared_randomstreams import RandomStreamssrng = RandomStreams(seed=234)rv_u = srng.uniform((2,2))##均匀分布 2*2 matrixrv_n = srng.normal((2,2)) ##正态分布 2*2 matrixf = theano.function([], rv_u)  ##<span style="font-family:SimSun;">每次调用随机值都不一样</span>g = theano.function([], rv_n, no_default_updates=True)    #<span style="font-family:SimSun;">每次调用随机值都一样,类似于numpy中生成随机数</span>nearly_zeros = theano.function([], rv_u + rv_u - 2 * rv_u)
  
   5.numpy.random 生成随机数

   请参考:http://www.mamicode.com/info-detail-507676.html




   实例练习:logistic 回归

   算法过程:

            1.创建两类样本数据

            2.初始化 w 和 b

            3.计算logistic值 (大于0.5即认为是1类)

            4.损失函数(对数项+权值控制项)

            5.计算损失函数对w和b的梯度

                                  for  i = 1 到 训练次数:

                 计算损失函数值;

                 更新w 和 b

            最后:预测,计算logistic值(大于0.5即认为是1类)

  

import numpyimport theanoimport theano.tensor as Trng = numpy.randomN = 400 ##样本数量feats = 784 ##每个样本的特征维数##随机生成样本,样本类别{0,1}D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2))training_steps = 10000 #迭代次数# Declare Theano symbolic variablesx = T.fmatrix("x")y = T.fvector("y")# 初始化w 和 bw = theano.shared(rng.randn(feats), name="w")b = theano.shared(0., name="b")print("Initial model:")# 打印初始w 和 b#print(w.get_value())   #print(b.get_value())# Construct Theano expression graphp_1 = 1 / (1 + T.exp(-T.dot(x, w) - b))   # Probability that target = 1prediction = p_1 > 0.5                    # The prediction thresholdedxent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # Cross-entropy loss functioncost = xent.mean() + 0.01 * (w ** 2).sum()# The cost to minimizegw, gb = T.grad(cost, [w, b])             # Compute the gradient of the cost                                          # (we shall return to this in a                                          # following section of this tutorial)# Compiletrain = theano.function(          inputs=[x,y],          outputs=[prediction, xent],          updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb)))                    predict = theano.function(inputs=[x], outputs=prediction)# Trainfor i in range(training_steps):    pred, err = train(D[0], D[1])print("Final model:")print(w.get_value())print(b.get_value())print("target values for D:")print(D[1])print("prediction on D:")print(predict(D[0]))


    


0 0
原创粉丝点击