导数使用T.grad计算。

这里使用pp()打印梯度的符号表达式。

第3行输出是打印了经过优化器简化的符号梯度表达式,与第1个输出相比确实简单多了。

fill((x** TensorConstant{2}), TensorConstant{1.0})指创建一个x**2大小的矩阵,并填充1。

importtheano.tensor as T
fromtheano import pp
fromtheano import function
x= T.dscalar('x')
y= x ** 2
gy= T.grad(y, x)
printpp(gy)
f= function([x], gy)
printf(4)
printpp(f.maker.fgraph.outputs[0])
>>>
((fill((x** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x **(TensorConstant{2} - TensorConstant{1})))
8.0
(TensorConstant{2.0}* x)

T.grad的第1个參数必须是标量

比如计算逻辑函数sigmoid的导数:

\frac{{ds\left( x \right)}}{{dx}} = s\left( x \right) \cdot \left( {1 - s\left( x \right)} \right)" alt="">

importtheano.tensor as T
fromtheano import function
x= T.dmatrix('x')
s= T.sum(1 / (1 + T.exp(-x)))
gs= T.grad(s, x)
dlogistic= function([x], gs)
printdlogistic([[0, 1], [-1, -2]])
>>>
[[0.25 0.19661193]
[ 0.19661193 0.10499359]]

计算雅克比(Jacobian)矩阵

雅克比矩阵是向量的一阶偏导数:

用T.arrange生成从0到y.shape[0]的序列。循环计算。

scan能够提高创建符号循环效率。

lambda~是python内建的magicfunction.

x= T.dvector('x')
y = x ** 2
J, updates = theano.scan(lambdai, y,x : T.grad(y[i], x), sequences=T.arange(y.shape[0]), non_sequences=[y,x])
f = function([x], J,updates=updates)
f([4, 4])
>>>
[[ 8. 0.]
[ 0. 8.]]

计算海森(Hessian)矩阵

海森矩阵是多元函数的二阶偏导数方阵。

仅仅要用T.grad(cost,x)替换雅克比矩阵的一些y就可以。

x= T.dvector('x')
y = x** 2
cost= y.sum()
gy =T.grad(cost, x)
H,updates = theano.scan(lambda i, gy,x : T.grad(gy[i], x),sequences=T.arange(gy.shape[0]), non_sequences=[gy, x])
f =function([x], H, updates=updates)
f([4,4])
>>>
[[2. 0.]
[ 0. 2.]]

雅克比右乘

x能够由向量扩展成矩阵。雅克比右乘使用Rop:

W = T.dmatrix('W')
V =T.dmatrix('V')
x =T.dvector('x')
y =T.dot(x, W)
JV =T.Rop(y, W, V)
f =theano.function([W, V, x], JV)
printf([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1])
>>>
[2. 2.]

雅克比左乘

雅克比左乘使用Lop:

import theano
import theano.tensor as T
from theano import function
x = T.dvector('x')
v =T.dvector('v')
x =T.dvector('x')
y =T.dot(x, W)
VJ =T.Lop(y, W, v)
f =theano.function([v,x], VJ)
print f([2, 2], [0, 1])
>>>
[[0. 0.]
[ 2. 2.]]

海森矩阵乘以向量

能够使用Rop

import theano
import theano.tensor as T
from theano import function
x= T.dvector('x')
v= T.dvector('v')
y= T.sum(x ** 2)
gy= T.grad(y, x)
Hv= T.Rop(gy, x, v)
f= theano.function([x, v], Hv)
printf([4, 4], [2, 2])
>>>
[4. 4.]

欢迎參与讨论并关注本博客微博以及知乎个人主页兴许内容继续更新哦~

转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!

最新文章

  1. mybatis常见易出错
  2. Sicily 1051: 魔板(BFS+排重)
  3. getpass模块和random模块
  4. [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定
  5. asp.net Lodop实现批量打印
  6. ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式
  7. 广东地区电信官方DNS服务器
  8. Metasploitable 2系列教程:信息收集
  9. 指向函数的指针与iOS-Block相关知识
  10. 迷你sql profile,给缺少sql跟踪的朋友们
  11. CodeForces Round #298 Div.2
  12. whereis 命令
  13. ubuntu 恢复gnome-panel
  14. 《javascript设计模式》--接口
  15. Linux下的压缩和解压
  16. Hibernate与iBATIS的比较
  17. 多工程:基于Maven的SSM(Spring,SpringMvc,Mybatis)整合的web工程(中)
  18. Java岗 面试考点精讲(基础篇01期)
  19. Apache cxf暴露接口以及客户端调用之WebService初步理解
  20. 关于在pycharm下提示ModuleNotFoundError: No module named 'XXX' 的一种可能

热门文章

  1. Mysql实战之索引
  2. Codeforces Round #241 (Div. 2) B dp
  3. Java数据结构-------Set
  4. configurationmanager.getsection usage
  5. C 语言 和 python 调用 .so 文件
  6. 【剑指offer】二维数组中的查找☆
  7. hdu 3579(中国剩余定理+考虑0)
  8. Cannot resolve symbol KeyEventCompat(android.support.v4.view.KeyEventCompat找不到)
  9. 更新到xcode10以后出现几个无奈的问题,谨已此篇告诫广大ioser升级请慎重
  10. Codeforces 371A K-Periodic Array(模拟)