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是啥 ...
随机推荐
- mysql 备份软件 Xtrabackup 的 xtrabackup_binlog_pos_innodb和xtrabackup_binlog_info 文件区别
今天在操作 innobackupex 的时候,执行 change master to 的时候发现 xtrabackup_binlog_pos_innodb xtrabackup_binlog_i ...
- redis(二)高级用法
redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...
- 据说每个大牛、小牛都应该有自己的库——Ajax
蹉跎到今天终于要写Ajax部分了,平时工作中除了选择器我用jQuery的最多的就是ajax,所以这部分在自己的框架中必不可少. XMLHttpRequest 我以为对每个使用过Ajax的人来说XMLH ...
- 虚拟化平台cloudstack(2)——安装(上)
vmware workstation安装ubuntu server12.04 这个其实没什么说的了,下软件,安装,一顿下一步,OK. 安装完成后,为ubuntu server 12.04安装桌面. 使 ...
- sigar
从http://sourceforge.net/projects/sigar/files/sigar/1.6/hyperic-sigar-1.6.4.zip/download下载sigar, 参照了h ...
- WebViewJavascriptBridge的暂时理解
直接从项目里复制了一份关于WebViewJavascriptBridge使用的代码,注释部分是自己暂时的理解.孟哥说,callHandler类似于jq里的trigger, registerHandle ...
- IBatisNet:让insert操作返回新增记录的主键值
项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目 ...
- iOS 获取键盘相关信息
一,在需要的地方添加监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onKeyboardWil ...
- 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, ...
- NodeJS系列~第三个小例子,NodeJs与Redis实现高并发的队列存储
返回目录 众所周知 redis量个强大的缓存组件,可以部署在win32和linux环境之上,它有五大存储结构,其中有一种为列表list,它可以实现quene和stack的功能,即队列和堆栈的功能. r ...