2018做网站用什么开发,免费室内装修3d设计软件,好看的商标logo设计,济南手机网站建设专业定制Logistic函数 logistic函数的图#xff0c;其中x在x轴上#xff0c;s(x)在y轴上。 如果你想对双精度矩阵上的每个元素计算这个函数#xff0c;这表示你想将这个函数应用到矩阵的每个元素上。 嗯#xff0c;你是这样做的#xff1a; xT.dmatrix(x)
s1/(1T.exp(-x))
logisti… Logistic函数 logistic函数的图其中x在x轴上s(x)在y轴上。 如果你想对双精度矩阵上的每个元素计算这个函数这表示你想将这个函数应用到矩阵的每个元素上。 嗯你是这样做的 xT.dmatrix(x)
s1/(1T.exp(-x))
logistictheano.function([x],s)
print logistic([[1,2],[3,4]])[[ 0.73105858 0.88079708][ 0.95257413 0.98201379]] 在每个元素上执行logistic的原因是因为它的所有运算 —— 除法、加法、幂和除法 —— 本身是单个元素的操作。 同时计算多个值 Theano支持多输出功能。例如我们可以同时计算两个矩阵a和b之间每个元素的差、差的绝对值和平方差 a,bT.dmatrices(a,b)
diffa-b
abs_diffabs(a-b)
squared_diffdiff**2
ftheano.function([a,b],[diff,abs_diff,squared_diff]) 注意 dmatrices产生与你提供的名称一样多的输出。它是分配符号变量的一个快捷方式我们将在教程中经常使用它。 当我们使用函数f它返回三个变量。 print f([[1,1],[1,2]],[[1,1],[1,1]])[array([[ 0., 0.],[ 0., 1.]]), array([[ 0., 0.],[ 0., 1.]]), array([[ 0., 0.],[ 0., 1.]])] 为参数设置默认值 x,yT.dscalars(x,y)
zxy
ffunction([x,In(y,value2)],z)
print f(2)4.0 这里使用In类它允许你更详细地指定你的函数的参数的属性。这里通过创建value字段设置为1的In实例为y赋予默认值1。 具有默认值的输入必须遵循没有默认值的输入类似Python的函数。可以有多个具有默认值的输入。这些参数可以按位置或名称设置和在标准Python中一样 x,y,wT.dscalars(x,y,w)
z(xy)*w
ffunction([x,In(y,value1),In(w,value2,namew_by_name)],z)
print f(1)
print f(1,2)
print f(1,1,1)
print f(1,w_by_name1,y0)
print f(1,w_by_name1)4.0
6.0
2.0
1.0
2.0 In不知道作为参数传递的局部变量y和w的名称。符号变量对象具有名称属性在上面的示例中由dscalars设置和它们是我们构建的函数中的关键字参数的名称。这是Iny value 1中工作的机制。在In(w, value2, namew_by_name)的情况下。我们用一个这个函数使用的名称来覆盖符号变量的name属性。 使用共享变量 还可以利用内部状态生成一个函数。例如假设我们想要一个累加器在开始状态被初始化为零。然后在每次函数调用时状态通过函数的参数增加。 首先我们定义累加器函数。它将其参数添加到内部状态并返回旧的状态值。 这段代码引入了一些新的概念。shared函数构造所谓的共享变量。它们是符号变量和非符号变量的混合其值可以在多个函数之间共享。共享变量就像dmatrices(...)返回的对象一样可以在符号表达式中使用但它们还有一个内部值定义在所有使用这个符号变量的函数中的值。它被称为共享变量因为它的值在许多函数之间共享。该值可以通过.get_value()和.set_value()方法访问和修改。 from theano import shared
stateshared(0)
incT.iscalar(inc)
accumulatorfunction([inc],state,updates[(state,stateinc)]) 该代码中的另一个新东西是function的updates参数。updates必须提供形式为共享变量新表达式对的一个列表。它也可以是一个字典其键是共享变量值是新的表达式。无论哪种方式它意味着“每当这个函数运行时它将用相应表达式的结果替换每个共享变量的.value”。上面我们的累加器用状态和增量总和取代state的值。 print state.get_value()
accumulator(1)
print state.get_value()
accumulator(200)
print state.get_value()0
1
201 可以重置状态。只需使用.set_value()方法 state.set_value(-1)
accumulator(2)
print state.get_value()1 如上所述你可以定义多个函数来使用相同的共享变量。这些函数都可以更新该值。 decrementorfunction([inc],state,updates[(state,state-inc)])
decrementor(2)
print state.get_value()-1 你可能想知道为什么存在更新机制。你总是可以通过返回新的表达式并在NumPy中照常使用它们来实现类似的结果。更新机制可以是语法方便但是它主要是为了效率。有时可以使用就地算法例如低秩矩阵更新更快地完成对共享变量的更新。此外Theano对分配变量的位置和方式有更多的控制这是在GPU上获得良好性能的重要因素之一。 可能会发生这种情况你使用共享变量表达了某个公式但你不想使用它的值。在这种情况下你可以使用function的givens参数为一个特定函数替换图中的特定节点。 stateshared(0)
incT.iscalar(inc)
fn_of_statestate*2inc
#foo 必须和被替换的shared变量有相同的类型
fooT.scalar(dtypestate.dtype)
skip_sharedfunction([inc,foo],fn_of_state,givens[(state,foo)])
print skip_shared(1,3)#我们使用了3作为state,而不是0
print state.get_value()#old state值不变7
0 givens参数可用于替换任何符号变量而不仅仅是共享变量。一般情况下你可以替换常量和表达式。但要小心不要让givens替换引入的表达式是共同依赖的替换的顺序没有定义所以替换必须以任何顺序工作。 在实践中考虑givens的一个好方法是允许你用一个不同的表达式替换你的公式的任何部分这个表达式的计算结果是一个相同形状和dtype的张量。 注意 Theano共享变量broadcast模式对于每个维度默认为False。共享变量大小可以随时间改变所以我们不能使用形状来找到broadcastable的模式。如果你想要一个不同的模式只要将它作为参数传递theano.shared(..., broadcastable(True, False)) 复制函数 Theano函数可以被复制这对于创建类似的函数但是使用不同的共享变量或更新是有用的。这是使用function对象的copy()方法完成的。复制的是原始函数的优化图因此编译只需要执行一次。 让我们从上面定义的累加器开始 stateshared(0)
incT.iscalar(inc)
accumulatortheano.function([inc],state,updates[(state,stateinc)]) 我们可以使用它像往常一样增加状态。 我们可以使用copy()创建一个类似的累加器但使用自己的内部状态使用swap参数它是一个要交换的共享变量的字典 new_stateshared(0)
new_accumulatoraccumulator.copy(swap{state:new_state})
new_accumulator(100)
print new_state.get_value()100 第一个函数的状态保持不变 print state.get_value()0 我们现在使用delete_updates参数创建一个删除更新的副本默认情况下该参数设置为False null_accumulatoraccumulator.copy(delete_updatesTrue)
null_accumulator(100)
print state.get_value() 如预期共享状态不再更新。 使用随机数 因为在Theano中你首先将一切用符号表示并在之后编译这个表达式以获得函数所以使用伪随机数字不是像在NumPy中那么直接虽然也不太复杂。 将随机性放到Theano的计算中的考虑方式是将随机变量放在你的图中。Theano将为每个这样的变量分配一个NumPy RandomStream对象一个随机数生成器并根据需要绘制它。我们将这种随机数序列称为随机流。随机流的核心是它们的共享变量因此在这里也可以对共享变量进行观察。Theanos的随机对象在RandomStreams中定义和实现底层在RandomStreamBase中定义和实现。 简要示例 from theano.tensor.shared_randomstreams import RandomStreams
srngRandomStreams(seed234)
rv_usrng.uniform((2,2))
rv_nsrng.uniform((2,2))
ffunction([],rv_u)
gfunction([],rv_n,no_default_updatesTrue)
print f()
print f()
print g()
print g()[[ 0.12672381 0.97091597][ 0.13989098 0.88754825]]
[[ 0.31971415 0.47584377][ 0.24129163 0.42046081]]
[[ 0.12309219 0.71399385][ 0.14249561 0.36686867]]
[[ 0.12309219 0.71399385][ 0.14249561 0.36686867]]这里’rv_u’表示来自均匀分布的2×2矩阵的随机流。同样’rv_n’表示来自正态分布的2×2矩阵的随机流。分布的实现在RandomStreams中定义底层在raw_random中定义。它们只在CPU上工作。 现在让我们使用这些对象。随机数发生器的内部状态是自动更新的所以我们每次都得到不同的随机数。 当我们向function添加额外参数no_default_updatesTrue如在g中时随机数生成器状态不受调用返回函数影响。因此例如多次调用g将返回相同的数字。 一个重要的提醒是在函数的每次执行期间最多绘制一个随机变量。因此即使rv_u随机变量在输出表达式中出现三次almost_zeros函数保证返回大约为0舍入误差除外。 种子流 随机变量可以使用单独的种子或使用共同的种子。 你可以使用.rng.set_value()通过播种或分配.rng属性来播种一个随机变量。 rng_valrv_u.rng.get_value(borrowTrue)
rng_val.seed(89234)
rv_u.rng.set_value(rng_val,borrowTrue) 你也可以通过RandomStreams对象的seed方法对该对象分配的全部随机变量设置种子。该种子将用于设置临时随机数发生器的种子这个零时随机数发生器随后将为每个随机变量生成种子。 srng.seed(89234) 函数之间共享流 与通常的共享变量一样用于随机变量的随机数发生器在函数之间是共同的。因此我们的nearly_zeros函数将更新函数f中使用的生成器的状态。 在Theano图之间复制随机状态 在一些使用情况下用户可能想要将与给定的theano图例如具有下面的编译函数f1的g1相关联的所有随机数发生器的“状态”转移到第二个图形例如具有函数f2的g2。这中情况例如如果你试图从之前的一个序列化的模型的参数初始化模型的状态。对于和可以通过复制state_updates参数的元素来实现。 每当从RandomStreams对象中绘制随机变量时就会将元组添加到state_updates列表中。第一个元素是一个共享变量它表示与此特定变量相关联的随机数生成器的状态而第二个元素表示与随机数生成过程对应的theano图即RandomFunction {uniform} .0。 下面示出了如何将“随机状态”从一个theano函数传递到另一个函数的示例。 from theano.tensor.shared_randomstreams import RandomStreams
from theano.sandbox.rng_mrg import MRG_RandomStreams
class Graph():def __init__(self,seed123):self.rngRandomStreams(seed)self.yself.rng.uniform(size(1,))
def copy_random_state(g1,g2):if isinstance(g1.rng,MRG_RandomStreams):g2.rng.rstateg1.rng.rstatefor(su1,su2) in zip(g1.rng.state_updates,g2.rng.state_updates):su2[0].set_value(su1[0].get_value())
g1Graph(seed123)
f1theano.function([],g1.y)g2Graph(seed987)
f2theano.function([],g2.y)#by default,两个函数不是同步的
print f1()
print f2()#现在复制theano随机数生成器的状态
copy_random_state(g1,g2)
print f1()
print f2()[ 0.72803009]
[ 0.55056769]
[ 0.59044123]
[ 0.59044123] 转载于:https://www.cnblogs.com/qniguoym/p/7662459.html