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

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

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

1、 theano能够自动计算梯度

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

一、 定义函数

步骤 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()

简化  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:

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

二、计算梯度

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

和梯度有关的三个例子:

example1 :标量对标量的导数

 x= T.scalar('x')
y = x**2
g = T.grad(y,x)
f= theano.function([x],y)
f_prime=theano.function([x],g)
print f(-2)
print f_prime(-2)

example2 : 标量对向量的导数

x1= T.scalar()
x2= T.scalar()
y = x1*x2
g = T.grad(y,[x1,x2])
f= theano.function([x1,x2],y)
f_prime=theano.function([x1,x2],g)
print f(2,4)
print f_prime(2,4)

example3 : 标量对矩阵的导数

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

搭建神经网络

1 单个神经元

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

 import theano
import theano.tensor as T
import random
import numpy as np x = T.vector()
w = T.vector()
b = T.scalar() z= T.dot(w,x)+b
y= 1/(1+T.exp(-z)) neuron =theano.function(
inputs=[x,w,b],
outputs=[y]
) w = [-1,1]
b=0
for i in range(100):
x = [random.random(),random.random()]
print x
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行代码替换如下:

x=np.asarray([random.random(),random.random()], dtype = np.float32)

运行结果如下

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

w,b应该也是参数 ,上述函数改为neuron(x),model 参数 wb 应该用shared variables,改进的代码
 import theano
import theano.tensor as T
import random
import numpy as np x = T.vector()
# share variables 参数!有值
w = theano.shared(np.array([1.,1.]))
b = theano.shared(0.) z= T.dot(w,x)+b
y= 1/(1+T.exp(-z)) neuron =theano.function(
inputs=[x], # x 作为输入
outputs=y
) w.set_value([0.1, 0.1]) #修改值
for i in range(100):
#x = [random.random(),random.random()]
x=np.asarray([random.random(),random.random()], dtype = np.float32)
print x
print w.get_value() #得到值
print neuron(x)

2  训练 training

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

梯度下降 w1 = w1 -n*dc/dw1 

常规:
dw, db =gradient(x,y_hat)
w.set_value(w.get_value()-0.1*dw)
b.set_value(b.get_value()-0.1*db)
改进:
gradient = theano.function(
inputs=[x,y_hat],
updates=[(w,w-0.1*dw),(b,b-0.1*db)]

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. 12G服务器在BIOS中收集阵列卡日志(TTY日志)的方法

      如果系统进不去.请参考如下方法收集日志. 请准备个U 盘,容量在8G以下(含8G),否则会识别不到. 图片参考,以描述为准 F2 enter BIOS option--> Enter the ...

  2. 设计模式之美:Strategy(策略)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用不同的 Strategy 处理内部状态. 别名 Policy 意图 定义一系列的算法,把它们一个个封装起来,并且使它们可以相 ...

  3. dojo/io-query源码解析

    该模块主要对url中的query部分进行处理,我们发送GET请求时,将参数直接放在URL中,经常碰到的需求就是把一个对象转化为query字符串放到url中去发送GET请求.io-query模块便提供了 ...

  4. 关于javascript模块加载技术的一些思考

    前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...

  5. 手把手教你用python打造网易公开课视频下载软件4-图形化界面

    上一篇讲解完函数:def getdownLoadInfo (url): 传入公开课的url地址,就可以提取课程的信息,这一篇讲解一下如何编写图像化界面.大概思考一下图像化界面需要的内容: (1)一个标 ...

  6. 上学时的HTML+JS+CSS(小总结)

    html:超文本标记语言 基本标签: { 文本标签:<pre></pre>:原封不动的保留空白区域.      <br />:换行.      <hr wid ...

  7. IOS 多线程04-GCD详解 底层并发 API

    注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大量的复杂度和更多的责任.在我们的文章常见的后台实践 ...

  8. “你没有权限登录JIRA”的解决办法

    为了更好的做部门的项目管理,部门老大让运维部署了一个jira系统.这两天让我试用并摸索如何用. jira默认的用户组有 jira-administrators.jira-developers.jira ...

  9. 说说设计模式~组合模式(Composite)

    返回目录 何时能用到它? 组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦.对于今天这个 ...

  10. Elasticsearch推荐插件篇(head,sense,marvel)

    安装head head插件可以用来快速查看elasticsearch中的数据概况以及非全量的数据,也支持控件化查询和rest请求,但是体验都不是很好. 一般就用它来看各个索引的数据量以及分片的状态. ...