網站首頁 編程語言 正文
學習前言
最近在學目標檢測……SSD的源碼好復雜……看了很多版本的SSD源碼,發現他們會使用tf.variable_scope,剛開始我還以為就是tf.name_scope,才發現原來兩者是不一樣的
兩者區別
tf.name_scope()和tf.variable_scope()是兩個作用域,一般與兩個創建/調用變量的函數tf.variable() 和tf.get_variable()搭配使用。
為什么要使用兩個不同的作用域方式呢?其主要原因與變量共享相關。
變量共享主要涉及兩個函數:tf.Variable() 和tf.get_variable()
在tf.variable_scope的作用域下需要使用tf.get_variable()函數,這是因為tf.get_variable()擁有一個變量檢查機制,會檢測已經存在的變量是否設置為共享變量,當同名變量存在共享機制時,不會報錯,如果并未設置為共享變量,則報錯。
如果使用tf.Variable() 的話每次都會新建變量。但是很多時候我們希望重用一些變量,所以我們使用到了get_variable(),它會去搜索變量名,有就直接用,沒有再新建。
在進行變量共享的時候需要使用到標志reuse,當reuse = True時是可以共享,False時不可以共享。
tf.variable_scope函數
tf.variable_scope(
name_or_scope,
default_name=None,
values=None,
initializer=None,
regularizer=None,
caching_device=None,
partitioner=None,
custom_getter=None,
reuse=None,
dtype=None,
use_resource=None,
constraint=None,
auxiliary_name_scope=True
)
其中:
1、name_or_scope:范圍的名稱。
2、default_name:如果name_or_scope參數為None,則使用默認的名稱,該名稱將是唯一的;如果提供了name_or_scope,它將不會被使用,因此它不是必需的,并且可以是None。
3、values:傳遞給操作函數的Tensor參數列表。
4、initializer:此范圍內變量的默認初始值設定項。
5、regularizer:此范圍內變量的默認正規化器。
6、caching_device:此范圍內變量的默認緩存設備。
7、partitioner:此范圍內變量的默認分區程序。
8、custom_getter:此范圍內的變量的默認自定義吸氣。
9、reuse:可以是True、None或tf.AUTO_REUSE;如果是True,即可以開始共享變量,變量重構用;如果是tf.AUTO_REUSE,則我們創建變量(如果它們不存在),否則返回它們(用于在第一輪創建變量);如果是None,則我們繼承父范圍的重用標志。
10、dtype:在此范圍中創建的變量類型。
測試代碼
1、使用reuse=True共享變量
import tensorflow as tf
# 初始化第一個v1
with tf.variable_scope("scope1"):
v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
print(v1.name)
# 不同的作用域
with tf.variable_scope("scope2"):
v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
print(v1.name)
# 開始共享
with tf.variable_scope("scope1",reuse = True):
v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
print(v1_share.name)
運行結果為:
scope1/v1:0
scope2/v1:0
scope1/v1:0
如果在下部再加上
with tf.variable_scope("scope2"):
v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
print(v1_share.name)
此時沒有reuse,不能共享,程序報錯。
2、使用AUTO_REUSE共享變量
import tensorflow as tf
# 使用AUTO_REUSE可以直接創建
# 如果reuse = True,初始化第一輪創建的時候會報錯
def demo():
with tf.variable_scope("demo", reuse=tf.AUTO_REUSE):
v = tf.get_variable("v", [1])
return v
v1 = demo()
v2 = demo()
print(v1.name)
運行結果為:
demo/v:0
demo/v:0
原文鏈接:https://blog.csdn.net/weixin_44791964/article/details/102495350
相關推薦
- 2022-03-20 關于數據庫系統的概述_數據庫其它
- 2022-06-13 基于Docker與Jenkins實現自動化部署的原理解析_docker
- 2022-11-06 Android?菜單欄DIY實現效果詳解_Android
- 2022-11-29 C#泛型的使用案例_C#教程
- 2022-03-27 pygame實現貪吃蛇游戲_python
- 2022-06-29 RedisTemplate常用操作方法總結(set、hash、list、string等)_Redis
- 2023-01-13 分布式緩存Redis與Memcached的優缺點區別比較_數據庫其它
- 2022-10-11 兩臺主機的vmware虛擬機相互連通的實現步驟_VMware
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支