Scan

  • 复发(Recurrence)的一种常用形式,可以用于循环(looping)

  • Reduction和map是scan的特例

  • 可以根据一些输出序列scan一个函数(function),每一步都会生成一个输出

  • 可以查看之前k步的输出

  • 给定一个初始状态z=0,可以通过scan函数z + x(i)计算一个列表的和sum(a_list)

  • 通常一个for循环可以用scan()操作符进行实现

使用scan的优点:

  • 迭代次数为符号图的一部分

  • 最大限度地减少GPU传输(如果用到了GPU)

  • 通过序列步长计算梯度

  • 运行速率比python内置的for循环稍微快些

  • 可以通过检测需要的实际内存量,来降低整体内存使用量

例子:对应元素计算tanh(x(t).dot(W) + b)

import theano
import theano.tensor as T
import numpy as np# 定义张量变量
X = T.matrix('X')
W = T.matrix('W')
b_sym = T.vector('b_sym')results, updates = theano.scan(lambda v: T.tanh(T.dot(v, W) + b_sym), sequences=X)
compute_elementwise = theano.function([X, W, b_sym], results)# 测试
x = np.eye(2, dtype=theano.config.floatX)
w = np.ones((2, 2), dtype=theano.config.floatX)
b = np.ones((2), dtype=theano.config.floatX)
b[1] = 2compute_elementwise(x, w, b)
# 和numpy相比较
np.tanh(x.dot(w) + b)

例子: 计算序列x(t) = tanh(x(t-1).dot(W) + y(t).dot(U) + p(T-t).dot(V))

import theano
import theano.tensor as T
import numpy as np
# 定义张量变量
X = T.vector('X')
W = T.matrix('W')
b_sym = T.vector('b_sym')
U, Y, V, P = T.matrices('U', 'Y', 'V', 'P')result, update = theano.scan(lambda y, p, x_tml: T.tanh(T.dot(x_tml, W) + T.dot(y, U) + T.dot(p, V)),sequences=[Y, P[::-1]], outputs_info=[X])compute_seq = theano.function(inputs=[X, W, Y, U, P, V], outputs=result)# 测试
x = np.zeros((2), dtype=theano.config.floatX)
x[1] = 1
w = np.ones((2, 2), dtype=theano.config.floatX)
y = np.ones((5, 2), dtype=theano.config.floatX)
y[0, :] = -3
u = np.ones((2, 2), dtype=theano.config.floatX)
p = np.ones((5, 2), dtype=theano.config.floatX)
p[0, :] = 3
v = np.ones((2, 2), dtype=theano.config.floatX)print(compute_seq(x, w, y, u, p, v))# 与Numpy对比
x_res = np.zeros((5, 2), dtype=theano.config.floatX)
x_res[0] = np.tanh(x.dot(w) + y[0].dot(u) + p[4].dot(v))
for i in range(1, 5):x_res[i] = np.tanh(x_res[i - 1].dot(w) + y[i].dot(u) + p[4-i].dot(v))
print(x_res)

例子: 计算X的行范式

import theano
import theano.tensor as T
import numpy as np# 定义张量变量
X = T.matrix('X')
results, updates = theano.scan(lambda x_i: T.sqrt((x_i ** 2)).sum(), sequences=[X])
compute_norm_lines = theano.function(inputs=[X], outputs=results)# 测试
x = np.diag(np.arange(1, 6, dtype=theano.config.floatX), 1)
print(compute_norm_lines(x))# 和Numpy对比
print(np.sqrt((x ** 2).sum(1)))

例子: 计算X的列范式

import theano
import theano.tensor as T
import numpy as np# 定义张量变量
X = T.matrix("X")
results, updates = theano.scan(lambda x_i: T.sqrt((x_i ** 2).sum()), sequences=[X.T])
compute_norm_cols = theano.function(inputs=[X], outputs=results)# 测试
x = np.diag(np.arange(1, 6, dtype=theano.config.floatX), 1)
print(compute_norm_cols(x))# 和Numpy对比
print(np.sqrt((x ** 2).sum(0)))

Theano - 循环相关推荐

  1. 中兴面试总结,华为。技术,市场

    1,软件测试,如何把这个测试做的更好. 进到一个新项目,作为测试人员应该都是想把测试做好,项目在符合客户质量要求的情况下按时交付的吧.但往往都事与愿违,造成这个结果的原因有很多很多.通过这段时间做自动 ...

  2. Theano 中文文档 0.9 - 7.2.5 循环

    7.2.5 循环 译者:Python 文档协作翻译小组,原文:Loop. 本文以 CC BY-NC-SA 4.0 协议发布,转载请保留作者署名和文章出处. Python 文档协作翻译小组人手紧缺,有兴 ...

  3. 【theano-windows】学习笔记六——theano中的循环函数scan

    前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于 ...

  4. scan——Theano中循环的实现

    引子 在开始scan函数的设计之前,我们从一个实例出发,首先来看,一个循环需要必备哪些成分:简单的循环累积相乘,计算AkA^k,使用numpy,代码如下. def power(A, k):result ...

  5. 循环神经网络教程第二部分-用python,numpy,theano实现一个RNN

    作者:徐志强 链接:https://zhuanlan.zhihu.com/p/22289383 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在本部分,我们将会从头 ...

  6. 循环神经网络教程4-用Python和Theano实现GRU/LSTM RNN, Part 4 – Implementing a GRU/LSTM RNN with Python and Theano

    The code for this post is on Github. This is part 4, the last part of the Recurrent Neural Network T ...

  7. 一文详解循环神经网络的基本概念(代码版)

    作者 | 李理 目前就职于环信,即时通讯云平台和全媒体智能客服平台,在环信从事智能客服和智能机器人相关工作,致力于用深度学习来提高智能机器人的性能. 写在前面 由于工作太忙,这个系列文章有一年多没有更 ...

  8. 技术 | Bengio终结Theano不是偶然,其性能早在Keras支持的四大框架中垫底

    作者 | Jasmeet Bhatia 编译 | KK4SBB 本文将对目前流行的几种Keras支持的深度学习框架性能做一次综述性对比,包括Tensorflow.CNTK.MXNet和Theano.作 ...

  9. Recurrent Neural Network系列2--利用Python,Theano实现RNN

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...

最新文章

  1. [LeetCode]--118. Pascal#39;s Triangle
  2. redis中的发布订阅
  3. 【ABAP】Smartforms无法打印字符串中空格问题处理
  4. scala读取mysql文件_9. Scala操作外部数据 文件读取,xml,Excel,MySQL
  5. 矩池云通过本地端口转发方式登陆VNC
  6. matlab 2018 ccs,Matlab2018a 与ccs7生成tms320F2812代码调试记录
  7. G502使用计算机配置,罗技G502鼠标驱动调试详解!实战《男友4》设置!
  8. 网站数据分析指标体系
  9. 获取webshell的方法
  10. x240无线网卡驱动 linux,Linux2.6移植:DM9000驱动
  11. 1258 近义词句子
  12. DeDeCMS二次开发教程之程序安装
  13. iOS10.3正式版发布:iOS10.3新功能有哪些? 韩俊强的博客
  14. 新一代智能视频云发展现状分析:五大要素成关键
  15. element ui 前台模板_一个干净优雅的 Element UI Admin 模板
  16. uniapp从开发App到上架应用市场需要经历什么?
  17. 查看ubuntu系统的版本信息
  18. STM32 启动代码分析
  19. CPU为什么选择导热硅脂而不是牙膏
  20. 语言学c刊,完整版|最新版C刊(2021-2022版)目录发布!新增和踢出了哪些?

热门文章

  1. 互联网产品各阶段的标准流程文档
  2. 营救Peter——下载XCode的六种姿势
  3. 骑行广州大学城 外环十大校门
  4. hadoop之MapReduce框架TaskTracker端心跳机制分析(源码分析第六篇)
  5. copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理
  6. Java单例模式:饿汉与懒汉区别
  7. linux开发神器--Tmux
  8. Install NSCA
  9. 99%的用户都选择用它来恢复丢失的照片
  10. fpga该驱动器调试dev_dbg 无输出