對于TensorFlow中的基本用法狠角,參考了網(wǎng)上很多博客,把自己認為解釋的比較好的做一些整理揣苏。
tensorflow中tf.Variable()與tf.get_variable()兩個函數(shù)的區(qū)別:
一個變量通過調(diào)用run() 方法維持圖的狀態(tài)。你通過構(gòu)造variable 類的實例來添加一個變量到圖中。Variable() 構(gòu)造器需要一個初始值坷虑,可以是任意類型和shape 的Tensor。初始值定義了變量的type和shape埂奈。構(gòu)造完成之后迄损,變量的type和shape 是固定的≌嘶牵可以使用assign 方法來修改變量的值芹敌。如果你想修改變量的shape,你必須使用assign 操作垮抗。并且validate_shpe=False氏捞。就像任何Tensor,通過Variable() 創(chuàng)建的variable冒版,可以用作圖中其他操作節(jié)點的輸入液茎。另外,所有操作承載的Tensor 類傳遞給variables
首先解釋一下個別參數(shù)的含義:
initial_value: ?一個Tensor辞嗡,或者可以轉(zhuǎn)化為Tensor的Python對象捆等,其含義為:變量的初始值。初始值必須指定shape除非validate_shape 被設(shè)置為False;
trainable: ?如果是True续室,變量也默認添加到GraphKeys.TRAINABLE_VARIABLES栋烤。這是很多優(yōu)化器類使用的默認變量列表
collections:指定該圖變量的類型、默認為[GraphKeys.GLOBAL_VARIABLES]挺狰,為list類型
validate_shape:如果為False明郭,則不進行類型和維度檢查
name:變量的名稱,如果沒有指定則系統(tǒng)會自動分配一個唯一的值
具體區(qū)別:
1. tf.get_variable跟tf.Variable都可以用來定義圖變量她渴,但是前者的必需參數(shù)(即第一個參數(shù))并不是圖變量的初始值达址,而是圖變量的名稱。盡管上圖顯示每一個變量函數(shù)都有很多的參數(shù)趁耗,但是也只有第一個是必須填寫的
2.?使用tf.Variable時沉唠,如果檢測到命名沖突,系統(tǒng)會自己處理苛败。使用tf.get_variable()時满葛,系統(tǒng)不會處理沖突径簿,而會報錯
? ? ? ? 基于這兩個函數(shù)的特性,當我們需要共享變量的時候嘀韧,需要使用tf.get_variable()篇亭。在其他情況下,這兩個的用法是一樣的锄贷。他們之間的實質(zhì)性區(qū)別就是:由于tf.Variable()每次都在創(chuàng)建新對象译蒂,所有reuse=True和它并沒有什么關(guān)系。對于get_variable()谊却,來說柔昼,如果已經(jīng)創(chuàng)建的變量對象,就把那個對象返回炎辨,如果沒有創(chuàng)建變量對象的話捕透,就創(chuàng)建一個新的。
tf.variable_scope和tf.name_scope
? ? ? ? 在圖二中使用tf.get_variable()遇到相同名字的變量碴萧,就會報錯乙嘀。為什么提到這兩個函數(shù),這兩個函數(shù)有什么作用破喻?簡單來說就是為變量添加命名域虎谢,一個深度學(xué)習(xí)模型的參數(shù)變量往往是成千上萬的,不加上命名空間加以分組整理低缩,將會成為可怕的災(zāi)難嘉冒。TensorFlow的命名空間分為兩種,tf.variable_scope和tf.name_scope咆繁。
? ? ? ? tf.variable_scope可以讓變量有相同的命名,包括tf.get_variable得到的變量顶籽,還有tf.Variable的變量tf.name_scope可以讓變量有相同的命名玩般,只是限于tf.Variable的變量
換成下面的代碼就可以執(zhí)行了:
神經(jīng)網(wǎng)絡(luò)組件:tf.nn
一.激活函數(shù)
常見的激活函數(shù)的模型可以參考這篇博客:常見激活函數(shù)總結(jié)。
激活操作提供了在神經(jīng)網(wǎng)絡(luò)中使用的不同類型的非線性模型礼饱。包括光滑非線性模型(sigmoid, tanh, elu, softplus, and softsign)坏为。連續(xù)但是不是處處可微的函數(shù)(relu, relu6, crelu and relu_x)。當然還有隨機正則化 (dropout)所有的激活操作都是作用在每個元素上面的镊绪,輸出一個tensor和輸入的tensor又相同的形狀和數(shù)據(jù)類型匀伏。這里列出tensorflow提供的這些激活函數(shù),但是就不細講原理了,參照鏈接就行.至于使用也是非常簡單的.只以relu作為例子,其他的使用方式差不多.
tf.nn.relu(features, name=None)
參數(shù):
features :?tensor類型,必須是這些類型:A Tensor. float32, float64, int32, int64, uint8, int16, int8, uint16, half.
name:?操作名稱(可選)
還有一些其他的激活函數(shù)為:
二.分類
分類實現(xiàn)了一些交叉熵的函數(shù)等等蝴韭,要是你的神經(jīng)網(wǎng)絡(luò)有分類的任務(wù)什么的化够颠,一般可以用在輸出層。Tensorflow的softmax_cross_entropy_with_logits函數(shù)榄鉴、TensorFlow四種Cross Entropy算法實現(xiàn)和應(yīng)用履磨。
1.? tf.nn.softmax(logits, dim=-1, name=None)
參數(shù):
logits:非空的tensor蛉抓,類型必須為half, float32, float64.
dim:softmax作用的維度,默認是-1剃诅,表示最后一個維度
name:【可選】這個操作的名字
返回值:
返回一個tensor巷送,和logits有相同的類型和形狀
2. tf.nn.log_softmax(logits, dim=-1, name=None)
3. tf.nn.softmax_cross_entropy_with_logits(logits, labels, dim=-1, name=None)
作用:對于logits和labels之間計算softmax交叉熵。要是你對于softmax熟悉的話矛辕,這里很容易理解笑跛。通俗來說,就是在離散分類任務(wù)的時候度量概率誤差的聊品。softmax之后的每一個分量就代表一個類飞蹂,分量(類)上面的值就是該類的概率。
這個函數(shù)并不是計算softmax的函數(shù)杨刨,只是根據(jù)softmax計算分類誤差晤柄,所以不要吧這個函數(shù)當做softmax函數(shù)使用。logits和labels必須有相同的形狀[batch_size, num_classes]和相同的類型 (either float16, float32, or float64)妖胀。
logits:Unscaled log probabilities.
labels:你的labels矩陣芥颈,每一行代表一個樣本的概率分布(要是你熟悉softmax和onehot encoding的話)
dim:作用的維度,默認是-1赚抡,表示最后的那個維度
name:【可選】這個操作的名字
返回:一個1維的tensor,長度為batch_size,類型和logits一樣涂臣。其中是各個元素相應(yīng)樣本的softmax的交叉熵損失盾计。
4. tf.nn.weighted_cross_entropy_with_logits(logits, targets, pos_weight, name=None)
其他
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
按概率來將x中的一些元素值置零,并將其他的值放大赁遗。用于進行dropout操作署辉,一定程度上可以防止過擬合
x是一個張量,而keep_prob是一個(0,1]之間的值岩四。x中的各個元素清零的概率互相獨立哭尝,為1-keep_prob,而沒有清零的元素,則會統(tǒng)一乘以1/keep_prob, 目的是為了保持x的整體期望值不變剖煌。
tf.fill(shape,value,name=None) :創(chuàng)建一個形狀大小為shape的tensor材鹦,其初始值為value:
tf.constant(value,dtype=None,shape=None,name=’Const’)
創(chuàng)建一個常量tensor,按照給出value來賦值耕姊,可以用shape來指定其形狀桶唐。value可以是一個數(shù),也可以是一個list茉兰。如果是一個數(shù)尤泽,那么這個常亮中所有值的按該數(shù)來賦值。如果是list,那么len(value)一定要小于等于shape展開后的長度。賦值時安吁,先將value中的值逐個存入醉蚁。不夠的部分,則全部存入value的最后一個值鬼店。
tf.random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.random_uniform(shape,minval=0,maxval=None,dtype=tf.float32,seed=None,name=None)
這幾個都是用于生成隨機數(shù)tensor的网棍。尺寸是shape
random_normal: 正太分布隨機數(shù),均值mean,標準差stddev
truncated_normal:截斷正態(tài)分布隨機數(shù)妇智,均值mean,標準差stddev,不過只保留[mean-2*stddev,mean+2*stddev]范圍內(nèi)的隨機數(shù)
random_uniform:均勻分布隨機數(shù)滥玷,范圍為[minval,maxval]。
tf.expand_dims(Tensor, dim):為張量+1維
tf.pack(values, axis=0, name=”pack”):?將一個R維張量列表沿著axis軸組合成一個R+1維的張量
tf.concat(concat_dim, values, name=”concat”):?將張量沿著指定維數(shù)拼接起來巍棱。
tf.sparse_to_dense:稀疏矩陣轉(zhuǎn)密集矩陣
幾個參數(shù)的含義:
sparse_indices: 元素的坐標[[0,0],[1,2]] 表示(0,0)惑畴,和(1,2)處有值
output_shape: 得到的密集矩陣的shape
sparse_values: sparse_indices坐標表示的點的值,可以是0D或者1D張量航徙。若0D如贷,則所有稀疏值都一樣。若是1D到踏,則len(sparse_values)應(yīng)該等于len(sparse_indices)
default_values: 缺省點的默認值
tf.random_shuffle(value,seed=None,name=None):沿著value的第一維進行隨機重新排列
tf.argmax | tf.argmin
tf.argmax(input=tensor,dimention=axis):找到給定的張量tensor中在指定軸axis上的最大值/最小值的位置杠袱。
tf.equal(x, y, name=None):?判斷兩個tensor是否每個元素都相等。返回一個格式為bool的tensor
cast(x, dtype, name=None):將x的數(shù)據(jù)格式轉(zhuǎn)化成dtype.例如窝稿,原來x的數(shù)據(jù)格式是bool楣富,那么將其轉(zhuǎn)化成float以后,就能夠?qū)⑵滢D(zhuǎn)化成0和1的序列伴榔。反之也可以
tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None):修正梯度值纹蝴,用于控制梯度爆炸的問題。梯度爆炸和梯度彌散的原因一樣踪少,都是因為鏈式法則求導(dǎo)的關(guān)系塘安,導(dǎo)致梯度的指數(shù)級衰減。為了避免梯度爆炸援奢,需要對梯度進行修剪耙旦。
函數(shù)返回2個參數(shù): list_clipped,修剪后的張量萝究,以及global_norm,一個中間計算量锉罐。當然如果你之前已經(jīng)計算出了global_norm值帆竹,你可以在use_norm選項直接指定global_norm的值。
TensorFlow中緯度的計算:參考文章:TensorFlow的緯度計算