1. 程式人生 > >TensorFlow 中 name_scope/ variable_scope 的使用

TensorFlow 中 name_scope/ variable_scope 的使用

 為了說明TensorFlow 中   name_scope/ variable_scope 的使用,直接上程式碼,方便檢視,怎麼使用的

"""

"""

import multiprocessing
import threading
import tensorflow as tf
import numpy as np
import gym
import os
import shutil
import matplotlib.pyplot as plt



class ACNet(object):

    def __init__(self, scope, globalAC=None):

        return null


with tf.name_scope('name_scope_2') as scope:
    # tf.get_variable_scope().reuse_variables()
    var1 = tf.get_variable(name='var1', shape=[1], initializer=None, dtype=tf.float32)
    # var11 = tf.get_variable(name='var1')
    var2 = tf.Variable(name='var2', initial_value=[1], dtype=tf.float32)
    var21 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)


#在 tf.name_scope() 環境下
#1: tf.get_variable() 建立的變數名不受 name_scope 的影響;
#2: tf.Variable() 建立變數時,name 屬性值允許重複(底層實現時,會自動引入別名機制)




#在 tf.variable_scope(name) 環境下
#1: tf.get_variable() 建立的變數名受 variable_scope 的影響;
#2: tf.Variable() 建立變數時,建立的變數名受 variable_scope 的影響,並且如果先前有name,後續的name會變為name1
#3: tf.Variable() 建立變數時,name 屬性值允許重複(底層實現時,會自動引入別名機制)

with tf.variable_scope("one"):
    a = tf.get_variable("v", [1]) #a.name == "one/v:0"
# with tf.variable_scope("one"):
#     b = tf.get_variable("v", [1]) #建立兩個名字一樣的變數會報錯 ValueError: Variable one/v already exists
with tf.variable_scope("one", reuse = True): #注意reuse的作用。
    c = tf.get_variable("v", [1]) #c.name == "one/v:0" 成功共享,因為設定了reuse

    v2 = tf.Variable(name='var2', initial_value=[1], dtype=tf.float32)
    v21 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)


if __name__ == "__main__":

    with tf.Session() as sess:
        print("================name_scope==")
        print(var1.name)   #tf.get_variable()函式生成的變數,可以實現變數共享,不帶name_scope的名字
        # print(var11.name)
        print(var2.name) #tf.Variable()函式生成的變數,不可以實現變數共享,帶name_scope的名字
        print(var21.name)

        print("===============variable_scope==")
        print(a.name)
        # print(b.name)
        print(c.name)
        print(v2.name)
        print(v21.name)

執行結果如下所示: