函数是Theano的一个核心设计模块,它提供一个接口,把函数计算图编译为可调用的函数对象。本节介绍如何编写函数方程。

语法

theano.function(inputs, 
                outputs, 
                mode=None, 
                updates=None, 
                givens=None, 
                no_default_updates=False, 
                accept_inplace=False, 
                name=None,
                rebuild_strict=True, 
                allow_input_downcast=None, 
                profile=None, 
                on_unused_input='raise')

其中常用的就三四个。

  • inputs表示自变量
  • outputs表示因变量(即返回值)
  • updates一般用于神经网络共享变量参数更新,以字典或元组列表的形式指定
  • givens是一个字典或元组列表,记为[(var1,var2)],表示在每一次函数调用时,在符号计算图中,把符号变量var1节点替换为var2节点,该参数常用来指定训练数据集的batch大小。
import theano  

x = theano.tensor.scalar(name='x',dtype='float32')
y= theano.tensor.scalar(name='y',dtype='float32')
# 也可以合并写为: x, y =theano.tensor.scalars('x', 'y')  

z1= x + y  
z2=x*y  
#定义x、y为自变量,z1、z2为函数返回值(因变量)
f =theano.function([x,y],[z1,z2])  

#返回当x=2,y=3的时候,函数f的因变量z1,z2的值
print(f(2,3))

运行结果:

上面的案例中,x = 2,y = 3 ,相当于传参进去了

[array(5., dtype=float32), array(6., dtype=float32)]

符号变量类型的知识补充:

数值:iscalar(int类型的变量)、fscalar(float类型的变量)

一维向量:ivector(int 类型的向量)、fvector(float类型的向量)、

二维矩阵:fmatrix(float类型矩阵)、imatrix(int类型的矩阵)

三维float类型矩阵:ftensor3

四维float类型矩阵:ftensor4

自动求导

利用Theano求导时非常方便,可以直接利用函数theano.grad()进行求解。

例如,对于下面的函数:

需要求导的函数

import theano  
x =theano.tensor.fscalar('x')#定义一个float类型的变量x(为标量)
y= 1 / (1 + theano.tensor.exp(-x))#y与x的关系式 
dx=theano.grad(y,x)#偏导数函数  
f= theano.function([x],dx)#定义函数f,输入为x,输出为s函数的偏导数  
print(f(3))#计算当x=3的时候,函数y的偏导数

运行结果:

0.04517666

参数更新

深度学习中通常需要迭代多次,每次迭代都需要更新参数。在theano.function中,参数update就是实现这个需求的。

updates=[old_w,new_w]

当函数被调用的时候,这个会用new_w替换old_w,下面这个例子说明了这样的一个过程:

import theano  
w= theano.shared(1)#定义一个共享变量w,其初始值为1  
x=theano.tensor.iscalar('x')  
f=theano.function([x], w, updates=[[w, w+x]])#定义函数自变量为x,因变量为w,当函数执行完毕后,更新参数w=w+x  
print(f(3))#函数输出为w  
print(w.get_value())#这个时候可以看到w=w+x为4

运行结果:

1

4

分析:首先需要明确的死,w一开始是固定好的1,当输入x=3时,w还是输出1,这个函数执行完毕之后,w = w+x变成4,更新了参数。因此,不要发迷糊,郁闷为什么第一次print不是4。

知识补充:

通过get_value()、set_value()可以查看、设置共享变量的数值。


声明:内容来源于吴茂贵老师主编的学习教材《Python深度学习——基于TensorFlow》,本文仅供学习参考,并加入了博主自己的一些理解和操作,并非原汁原味,为了更好的阅读体验和系统性地学习,请购买正版读物进行学习。



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/Theanofunc.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 27 日
如果觉得我的文章对你有用,请随意赞赏