• Theano中的共享变量


    Theano中的共享变量

    定义共享变量的原因在于GPU的使用,如果不定义共享的话,那么当GPU调用这些变量时,遇到一次就要调用一次,这样就会花费大量时间在数据存取上,导致使用GPU代码运行很慢,共享变量的类型必须为floatX

    因为GPU要求在floatX上操作,所以所有的共享变量都要声明为floatX类型,shared variable是一种符号变量(symbolic variable),但是这个symbolic variable又拥有自己的值。

    shared可以存储在显存中,因为这个特性,我们才会有"把神经网络参数放

    shared中"的这种做法。

    shared指向显存中的一块区域,这块区域在运算中是共享的,所以常常在运算中用来存储权值参数。

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    """
    theano de shared value
    """
    
    import numpy as np
    import theano.tensor as T
    import theano
    
    #共享变量中数据类型很重要,定义vector和matrix时需要统一
    #最后一个参数是共享变量的名称
    #初始化共享变量state为0
    state = theano.shared(np.array(0, dtype = np.float64), 'state')
    
    #定义累加值, 名称为inc, 定义数据类型是需要用state.dtype,而不是dtype = np.float64
    #否则会报错
    inc = T.scalar('inc', dtype = state.dtype)
    #定义一个accumulator函数
    #输入为inc, 输出为state
    #累加的过程叫做updates, 作用是state = state+inc
    accumulator = theano.function([inc], state, updates=[(state, state + inc)])

    获取与设置共享变量的值get_value, set_value 这两种只能在 Shared 变量 的时候调用。

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    """
    theano de shared value
    """
    
    import numpy as np
    import theano.tensor as T
    import theano
    
    """
    get_value, set_value 这两种只能在 Shared 变量 的时候调用。
    """
    
    #获取共享变量的值get_value
    print(state.get_value())
    #output: 0.0
    
    accumulator(1)
    print(state.get_value())
    #output: 1.0
    
    accumulator(10)
    print(state.get_value())
    #output: 11.0
    
    #设置共享变量的值set_value
    state.set_value(-1)
    accumulator(3)
    print(state.get_value())
    #output : 2.0

    临时共享变量,有时需要暂时试用shared变量,不需要更新,这时可以定义一个临时变量代替共享变量.

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    """
    theano de shared value
    """
    import numpy as np
    import theano.tensor as T
    import theano
    
    #临时试用共享变量
    #有时需要暂时试用shared变量,不需要更新,这时可以定义一个临时变量代替共享变量
    #函数输入值为[Inc, a], 要用a带入state, 输出是tmp_func函数形式
    #givens表示需要把什么替换成什么, 而state不会改变
    #最后输出结果中, state暂时被替换成a,state值不会变,还是上步的值2, a的值是3
    a = T.scalar(dtype=state.dtype)
    tmp_func = state * 2 + inc
    skip_shared = theano.function([inc, a], tmp_func, givens=[(state, a)])
    print(skip_shared(2, 3))
    #output: 3 *2+2 = 8
  • 相关阅读:
    1、搭建CICD平台
    Jackson 的 基本用法
    多种方式实现动态替换Android默认桌面Launcher
    Springboot2.x整合Redis以及连接哨兵模式/集群模式
    Redis哨兵(Sentinel)模式
    redis的哨兵模式(redis有密码)
    【数据结构】——LCT(link cut tree)
    征战蓝桥 —— 2017年第八届 —— C/C++A组第3题——魔方状态
    征战蓝桥 —— 2017年第八届 —— C/C++A组第4题——方格分割
    征战蓝桥 —— 2017年第八届 —— C/C++A组第4题——方格分割
  • 原文地址:https://www.cnblogs.com/xmeo/p/7240648.html
Copyright © 2020-2023  润新知