您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
Theano入门神经网络
 
 
  4340  次浏览      15
 2021-4-13 
 
编辑推荐:
本文首先定义了 定义函数、计算梯度、搭建神经网络等相关内容。
本文来选自于pianshen,由火龙果软件Anna编辑、推荐。

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) # 这里的两个矩阵不必完全相同,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))

结果:

[[ 2. 8.]
[18. 32.]]
[[14. 20.]
[30. 44.]
[46. 68.]]

若在batch上进行矩阵乘法运算,需要这样做,见下面的例子:

import theano
import theano.tensor as T
import numpy as np
a= T.tensor3 (dtype=theano.config.floatX)
b= T.tensor3 (dtype=theano.config.floatX)
tdot = T.batched_dot(a, b)
F= theano.function([a,b],tdot)
A=np.asarray([[[2,4,4],[6,8,3]], [[2,4,4], [6,8,3]],[[2,4,4], [6,8,3]],[[2,4,4],[6,8,3]]], dtype=np.float32) #2*3矩阵
B=np.asarray([[[1,2],[3,4], [5,6]],[[1,2], [3,4],[5,6]],[[1,2], [3,4],[5,6]],[[1,2],[3,4],[5,6]]], dtype=np.float32) #3*2矩阵
print('A.shape=%s' % (list(A.shape)))
print('B.shape=%s' % (list(B.shape)))
print('dot(A,B).shape=%s' % (list(F(A,B).shape)))

结果:

A.shape=[4, 2, 3]
B.shape=[4, 3, 2]
dot(A,B).shape=[4, 2, 2]

二、计算梯度

计算 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))

结果:

4.0
-4.0

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))

结果:

8.0
[array(4., dtype=float32), array(2., dtype=float32)]

example3 : 标量对矩阵的导数

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

结果:

[[ 2. 8.]
[18. 32.]]
60.0
[[2. 4.]
[6. 8.]]

搭建神经网络

1 单个神经元

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

import theano
import theano.tensor as T
import random
import numpy as np

x = T.vector (dtype=theano.config.floatX)
w = T.vector (dtype=theano.config.floatX)
b = T.scalar (dtype=theano.config.floatX)

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
prng = np.random.RandomState (123456789) # 定义局部种子
for i in range(5):
x = prng.rand(2,)
x = x.astype(np.float32)
print(x)
print(neuron(x,w,b))

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

结果:

[0.53283304 0.5341366 ]
[array(0.50032586, dtype=float32)]
[0.509553 0.71356404]
[array(0.5508266, dtype=float32)]
[0.25699896 0.7526936 ]
[array(0.621447, dtype=float32)]
[0.8838792 0.15489908]
[array(0.32541856, dtype=float32)]
[0.6705464 0.64344513]
[array(0.4932251, 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(5):
#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)]

 

 

   
4340 次浏览       15
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]
 
最新文章
多目标跟踪:AI产品经理需要了解的CV通识
深度学习架构
卷积神经网络之前向传播算法
从0到1搭建AI中台
工业机器人控制系统架构介绍
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
更多...   
成功案例
某综合性科研机构 人工智能与机器学习应用
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow框架实践
某领先数字地图提供商 Python数据分析与机器学习
中国移动 人工智能、机器学习和深度学习
更多...