標(biāo)題:six_questions_of_tf
內(nèi)容:
一. tf variable_scope與tf.name_scope
二.tf.get_variable()和tf.Variable()
三.global_step=tf.Variable(0, trainable=False)
四.保存檢查點(diǎn)(checkpoint)
五.padding 0時(shí),為什么左邊也要padding
六.單層卷積和池化提取圖片特征
正文如下:
一我磁、 with tf variable_scope的作用
主要作用:在一個(gè) variable_scope 作用域下內(nèi)共享變量
tf.name_scope()和tf.variable_scope()是兩個(gè)作用域,一般與兩個(gè)創(chuàng)建/調(diào)用變量的函數(shù)tf.variable() 和tf.get_variable()搭配使用季研。
它們搭配在一起的兩個(gè)常見用途:1)變量共享座每,#2)tensorboard畫流程圖時(shí)為了可視化封裝變量
###1.共享變量的使用及舉例
變量共享主要涉及兩個(gè)函數(shù):
? ? tf.get_variable(<name>, <shape>, <initializer>)
? ? tf.variable_scope(<scope_name>)
TF中有兩種作用域類型
? ? 命名域 (name scope),可通過tf.name_scope 或 tf.op_scope創(chuàng)建;
? ? 變量域 (variable scope)碌识,可通過tf.variable_scope 或 tf.variable_op_scope創(chuàng)建
代碼舉例:
代碼舉例:以下代碼運(yùn)行第一次沒問題碾篡,運(yùn)行第二次會(huì)報(bào)錯(cuò)
所以:命名域 (name scope) 、變量域 (variable scope)筏餐,這兩種作用域的使用有區(qū)別?
在variable_scope的作用域下开泽,tf.get_variable()和tf.Variable()都加了scope_name 前綴, 因此魁瞪,必須在tf.variable_scope的作用域下穆律,通過get_variable()可以使用已經(jīng)創(chuàng)建的變量,實(shí)現(xiàn)了變量的共享导俘。
在name_scope的作用域下峦耘,通過tf.get_variable()方式創(chuàng)建的變量,只有variable scope名稱會(huì)加到變量名稱前面趟畏,而name scope不會(huì)作為前綴贡歧; 通過tf.variable()創(chuàng)建的變量,name scope 和variable scope都會(huì)加到變量名稱前面
### TF中創(chuàng)建變量的方式有兩種:tf.get_variable()和tf.Variable()
? ? tf.get_variable(“vname”)方法赋秀,在創(chuàng)建變量時(shí)利朵,如果這個(gè)變量vname已經(jīng)存在,直接使用這個(gè)變量猎莲,如果不存在绍弟,則重新創(chuàng)建;
? ? tf.Variable()在創(chuàng)建變量時(shí)著洼,一律創(chuàng)建新的變量樟遣,如果這個(gè)變量已存在,則后綴會(huì)增加0身笤、1豹悬、2等數(shù)字編號(hào)予以區(qū)別。
## 二液荸、tf.varibales initialize
Tensorflow使用Variable類表達(dá)瞻佛、更新、存儲(chǔ)模型參數(shù)娇钱。
Variable是在可變更的伤柄,具有保持性的內(nèi)存句柄,存儲(chǔ)著Tensor文搂。
在整個(gè)session運(yùn)行之前,圖中的全部Variable必須使用Tensor進(jìn)行初始化适刀。
### 在TensorFlow的世界里,變量的定義和初始化是分開的
所有關(guān)于圖變量的賦值和計(jì)算都要通過tf.Session的run來進(jìn)行煤蹭,在執(zhí)行完初始化之后笔喉,Variable中的值生成完畢取视,不會(huì)再變化。
想要將所有圖變量進(jìn)行集體初始化時(shí)應(yīng)該使用tf.global_variables_initializer 或tf.initialize_all_variables()
## 三然遏、global_step=tf.Variable(0, trainable=False)
global_step在滑動(dòng)平均贫途、優(yōu)化器吧彪、指數(shù)衰減學(xué)習(xí)率等方面都有用到待侵,這個(gè)變量的實(shí)際意義非常好理解:代表全局步數(shù),比如在多少步該進(jìn)行什么操作姨裸,現(xiàn)在神經(jīng)網(wǎng)絡(luò)訓(xùn)練到多少輪等等秧倾,類似于一個(gè)鐘表。
根據(jù)代碼可以發(fā)現(xiàn)global_step的初始化值是0:
? global_step=tf.Variable(0, trainable=False)
問題:如果global_step直接賦值為0了傀缩,還怎么表示全局的步數(shù)那先?
## 四:保存檢查點(diǎn)(checkpoint)
為了得到可以用來后續(xù)恢復(fù)模型以進(jìn)一步訓(xùn)練或評(píng)估的檢查點(diǎn)文件(checkpoint file),我們實(shí)例化一個(gè)tf.train.Saver料身。
saver = tf.train.Saver()
在訓(xùn)練循環(huán)中汤纸,將定期調(diào)用saver.save()方法,向訓(xùn)練文件夾中寫入包含了當(dāng)前所有可訓(xùn)練變量值的檢查點(diǎn)文件芹血。
saver.save(sess, FLAGS.train_dir, global_step=step)
這樣贮泞,我們以后就可以使用saver.restore()方法,重載模型的參數(shù)幔烛,繼續(xù)訓(xùn)練啃擦。
saver.restore(sess, FLAGS.train_dir)
## 五、padding 0時(shí),為什么左邊也要padding
1.使得左邊和上邊邊緣有機(jī)會(huì)被卷積核滑動(dòng)時(shí)饿悬,更多次數(shù)的提取到令蛉,
2.卷積前后圖片的中心位置不變 (在卷積時(shí),中心位置可能會(huì)有更多機(jī)會(huì)被卷積到乡恕,兩邊會(huì)更少)
ps:通常地言询,一般filter的高和寬都為奇數(shù),一般為 3x3傲宜,或5x5,或7x7
(filter的大小不為奇數(shù)時(shí)运杭,一般是padding_width/2=padding_left;padding_height/2=padding_top)