Theano入门神经网络(一)
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入门神经网络(一)的更多相关文章
- Theano入门神经网络(四)
这一部分主要介绍用Theano 实现softmax函数. 在多分类任务中经常用到softmax函数,首先上几个投影片解释一下 假设目标输出是y_hat ,激活函数后的Relu y 一个是1.2 一个是 ...
- Theano入门神经网络(三)
附录一个:Keras学习随笔 http://blog.csdn.net/niuwei22007/article/details/49045909 参考 <Python Machine Learn ...
- Theano入门神经网络(二) 实现一个XOR门
与非门的图片如下 示意图 详细解释: 1 定义变量的代码,包括了输入.权值.输出等.其中激活函数采用的是sigmod函数 # -*- coding: utf-8 -*- __author__ = 'A ...
- Theano入门——CIFAR-10和CIFAR-100数据集
Theano入门——CIFAR-10和CIFAR-100数据集 1.CIFAR-10数据集介绍 CIFAR-10数据集包含60000个32*32的彩色图像,共有10类.有50000个训练图像和1000 ...
- Theano入门笔记2:scan函数等
1.Theano中的scan函数 目前先弱弱的认为:相当于symbolic的for循环吧,或者说计算图上的for循环,也可以用来替代repeat-until. 与scan相比,scan_checkpo ...
- Theano入门
由于自己的一个小项目需要Theano部分的开源代码,所以学习一下并记录入门的经典网站. 入门中文博客:https://blog.csdn.net/hjimce/article/details/4680 ...
- Theano入门笔记1:Theano中的Graph Structure
译自:http://deeplearning.net/software/theano/extending/graphstructures.html#graphstructures 理解Theano计算 ...
- Theano深度学习结构分析
Reference:Theano入门三部曲 http://deeplearning.net/tutorial/logreg.html (Softmax回归) http://deeplearning. ...
- 关于深度学习框架 TensorFlow、Theano 和 Keras
[TensorFlow] ——( https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/) 1.TensorFlow是啥 ...
随机推荐
- 03人人都应该了解的10个 jQuery 小技巧
1 返回顶部按钮 你可以利用animate和scrollTop来实现返回顶部的动画,而不需要使用其他插件. // Back to top $('a.top').click(function () { ...
- iOS Wi-Fi
查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或者重新看到相关功能的实现,感觉理解上更深刻.这一类的文章集中记录在查漏补缺集. iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可 ...
- 我的ORM之六-- 批量
我的ORM索引 很多时候,批量方案是解决性能的关键 批量插入 SqlBulkCopy 利用 SqlBulkCopy 是性能最高的方式 实现: var s = dbr.Menu.NewMyOqlSet( ...
- 杂谈X509证书, Java Keystore与Jetty
很多人对JSSE组成部分的Key Tool 工具不太明白,希望本文能有帮助 科班出身的同学应该学过课程“密码学”, 这门课详细解释了现代对称加密的算法原理, 当时学的我云里雾里. 直到现在使用过SSL ...
- Oracle数据库面试题【转载】
1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...
- Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...
- C#学习系列-类与结构的区别
参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9830&ct=31038 如 ...
- 常用Math 方法
/** * * @authors Your Name (you@example.org) * @date 2016-11-18 11:26:44 * @version $Id$ */ Math.pow ...
- SpringBoot常用配置简介
SpringBoot常用配置简介 1. SpringBoot中几个常用的配置的简单介绍 一个简单的Spring.factories # Bootstrap components org.springf ...
- Netty学习三:线程模型
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...