Theano是一个Python库,专门用于定义、优化、求值数学表达式,效率高,适用于多维数组。特别适合做机器学习。一般来说,使用时需要安装python和numpy.

首先回顾一下机器学习的东西,定义一个模型(函数)f(x;w) x为输入,w为模型参数,然后定义一个损失函数c(f),通过数据驱动在一堆模型函数中选择最优的函数就是训练training的过程,在机器学习中训练一般采用梯度下降法gradient descent.

使用theano来搭建机器学习(深度学习)框架,有以下优点:

1、 theano能够自动计算梯度

2、只需要两步骤就能搭建框架,定义函数和计算梯度。

一、 定义函数

  1. 步骤 0 宣告使用theano import theano
    步骤 1 定义输入 x=theano.tensor.scalar()
    步骤 2 定义输出 y=2*x
    步骤3 定义fuction f = theano.function([x],y)
    步骤 4 调用函数 print f(-2)

步骤1 定义输入变量

a = theano.tensor.scalar()

b =theano.tensor.matrix()

  1. 简化 import theano.tensor as T

步骤2 定义输出变量 需要和输入变量的关系

x1=T.matrix()

x2=T.matrix()

y1=x1*x2

y2=T.dot(x1,x2) #矩阵乘法

步骤3 申明函数

f= theano.function([x],y)

函数输入必须是list 带[]

example:

  1. import theano
  2. import theano.tensor as T
  3.  
  4. a= T.matrix()
  5. b= T.matrix()
  6. c = a*b
  7. d = T.dot(a,b)
  8. F1= theano.function([a,b],c)
  9. F2= theano.function([a,b],d)
    A=[[1,2],[3,4]]
  10. B=[[2,4],[6,8]] #2*2矩阵
  11. C=[[1,2],[3,4],[5,6]] #3*2矩阵
  12. print F1(A,B)
  13. print F2(C,B)

二、计算梯度

计算 dy/dx ,直接调用g=T.grad(y,x) y必须是一个标量 scalar

和梯度有关的三个例子:

example1 :标量对标量的导数

  1. x= T.scalar('x')
  2. y = x**2
  3. g = T.grad(y,x)
  4. f= theano.function([x],y)
  5. f_prime=theano.function([x],g)
  6. print f(-2)
  7. print f_prime(-2)

example2 : 标量对向量的导数

  1. x1= T.scalar()
  2. x2= T.scalar()
  3. y = x1*x2
  4. g = T.grad(y,[x1,x2])
  5. f= theano.function([x1,x2],y)
  6. f_prime=theano.function([x1,x2],g)
  7. print f(2,4)
  8. print f_prime(2,4)

example3 : 标量对矩阵的导数

  1. A= T.matrix()
  2. B= T.matrix()
  3. C=A*B #不是矩阵乘法,是对于位置相乘
  4. D=T.sum(C)
  5. g=T.grad(D,A) #注意D是求和 所以肯定是一个标量 但g是一个矩阵
  6. y_prime=theano.function([A,B],g)
  7. A=[[1,2],[3,4]]
  8. B=[[2,4],[6,8]]
  9. print y_prime(A,B)

搭建神经网络

1 单个神经元

假设w b 已知。y=neuron(x;w,b)

  1. import theano
  2. import theano.tensor as T
  3. import random
  4. import numpy as np
  5.  
  6. x = T.vector()
  7. w = T.vector()
  8. b = T.scalar()
  9.  
  10. z= T.dot(w,x)+b
  11. y= 1/(1+T.exp(-z))
  12.  
  13. neuron =theano.function(
  14. inputs=[x,w,b],
  15. outputs=[y]
  16. )
  17.  
  18. w = [-1,1]
  19. b=0
  20. for i in range(100):
  21. x = [random.random(),random.random()]
  22. print x
  23. print neuron(x,w,b)

但是运行出现错误 'TensorType(float32, vector) cannot store accurately value [0.4079584242156499, 0.7781482896772725], it would be represented as [ 0.40795842  0.77814829]. If you do not mind this precision loss, you can: 1) explicitly convert your data to a numpy array of dtype float32, or 2) set "allow_input_downcast=True" when calling "function".',

因此我们按照第一种方法,转换成a numpy array of dtype float32,将上述21行代码替换如下:

  1. x=np.asarray([random.random(),random.random()], dtype = np.float32)
  2.  
  3. 运行结果如下

[array(0.3996952772140503, dtype=float32)]
[ 0.12659253 0.45289889]
[array(0.5808603763580322, dtype=float32)]
[ 0.96148008 0.70698273]
[array(0.43671688437461853, dtype=float32)]

  1. w,b应该也是参数 ,上述函数改为neuron(x),model 参数 wb 应该用shared variables,改进的代码
  1. import theano
  2. import theano.tensor as T
  3. import random
  4. import numpy as np
  5.  
  6. x = T.vector()
  7. # share variables 参数!有值
  8. w = theano.shared(np.array([1.,1.]))
  9. b = theano.shared(0.)
  10.  
  11. z= T.dot(w,x)+b
  12. y= 1/(1+T.exp(-z))
  13.  
  14. neuron =theano.function(
  15. inputs=[x], # x 作为输入
  16. outputs=y
  17. )
  18.  
  19. w.set_value([0.1, 0.1]) #修改值
  20. for i in range(100):
  21. #x = [random.random(),random.random()]
  22. x=np.asarray([random.random(),random.random()], dtype = np.float32)
  23. print x
  24. print w.get_value() #得到值
  25. print neuron(x)
  1.  

2  训练 training

定义一个损失函数C  计算C对每一个wi的偏导数 和b的偏导数

  1. 梯度下降 w1 = w1 -n*dc/dw1
  2.  
  3. 常规:
  1. dw, db =gradient(x,y_hat)
    w.set_value(w.get_value()-0.1*dw)
    b.set_value(b.get_value()-0.1*db)
    改进:
  1. gradient = theano.function(
    inputs=[x,y_hat],
    updates=[(w,w-0.1*dw),(b,b-0.1*db)]
  1.  

Theano入门神经网络(一)的更多相关文章

  1. Theano入门神经网络(四)

    这一部分主要介绍用Theano 实现softmax函数. 在多分类任务中经常用到softmax函数,首先上几个投影片解释一下 假设目标输出是y_hat ,激活函数后的Relu y 一个是1.2 一个是 ...

  2. Theano入门神经网络(三)

    附录一个:Keras学习随笔 http://blog.csdn.net/niuwei22007/article/details/49045909 参考 <Python Machine Learn ...

  3. Theano入门神经网络(二) 实现一个XOR门

    与非门的图片如下 示意图 详细解释: 1 定义变量的代码,包括了输入.权值.输出等.其中激活函数采用的是sigmod函数 # -*- coding: utf-8 -*- __author__ = 'A ...

  4. Theano入门——CIFAR-10和CIFAR-100数据集

    Theano入门——CIFAR-10和CIFAR-100数据集 1.CIFAR-10数据集介绍 CIFAR-10数据集包含60000个32*32的彩色图像,共有10类.有50000个训练图像和1000 ...

  5. Theano入门笔记2:scan函数等

    1.Theano中的scan函数 目前先弱弱的认为:相当于symbolic的for循环吧,或者说计算图上的for循环,也可以用来替代repeat-until. 与scan相比,scan_checkpo ...

  6. Theano入门

    由于自己的一个小项目需要Theano部分的开源代码,所以学习一下并记录入门的经典网站. 入门中文博客:https://blog.csdn.net/hjimce/article/details/4680 ...

  7. Theano入门笔记1:Theano中的Graph Structure

    译自:http://deeplearning.net/software/theano/extending/graphstructures.html#graphstructures 理解Theano计算 ...

  8. Theano深度学习结构分析

    Reference:Theano入门三部曲 http://deeplearning.net/tutorial/logreg.html  (Softmax回归) http://deeplearning. ...

  9. 关于深度学习框架 TensorFlow、Theano 和 Keras

    [TensorFlow] ——( https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/) 1.TensorFlow是啥 ...

随机推荐

  1. mysql 备份软件 Xtrabackup 的 xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info 文件区别

    今天在操作 innobackupex 的时候,执行 change master to 的时候发现  xtrabackup_binlog_pos_innodb   xtrabackup_binlog_i ...

  2. redis(二)高级用法

    redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...

  3. 据说每个大牛、小牛都应该有自己的库——Ajax

    蹉跎到今天终于要写Ajax部分了,平时工作中除了选择器我用jQuery的最多的就是ajax,所以这部分在自己的框架中必不可少. XMLHttpRequest 我以为对每个使用过Ajax的人来说XMLH ...

  4. 虚拟化平台cloudstack(2)——安装(上)

    vmware workstation安装ubuntu server12.04 这个其实没什么说的了,下软件,安装,一顿下一步,OK. 安装完成后,为ubuntu server 12.04安装桌面. 使 ...

  5. sigar

    从http://sourceforge.net/projects/sigar/files/sigar/1.6/hyperic-sigar-1.6.4.zip/download下载sigar, 参照了h ...

  6. WebViewJavascriptBridge的暂时理解

    直接从项目里复制了一份关于WebViewJavascriptBridge使用的代码,注释部分是自己暂时的理解.孟哥说,callHandler类似于jq里的trigger, registerHandle ...

  7. IBatisNet:让insert操作返回新增记录的主键值

    项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目 ...

  8. iOS 获取键盘相关信息

    一,在需要的地方添加监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onKeyboardWil ...

  9. Java-数组练习2

    2.找出如下数组中最大的元素和最小的元素,a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}} int[][] i={{3,2,6},{6,8,2,10},{5},{12, ...

  10. NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储

    返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...