tf.get_variable可以只指定一個(gè)name 就行了和initializer就行了,可以將shape放在initializer里面
self.ent_emb = tf.get_variable(name="ent_emb", initializer=tf.random_uniform(shape=[self.num_ent, self.params.emb_size], minval=-sqrt_size, maxval=sqrt_size))
variables
可以看到Variable之所以為Variable 就是沒(méi)有在用feed_dict賦值的話就是初始值(或者在assign的值)掏熬。
y = tf.Variable(1) #1是初始值
b = tf.identity(y)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(b,feed_dict={y:3})) #使用3 替換掉
print(sess.run(b))
>>3
1
v.initializer
只是初始化v,tf.global_variables_initializer()
就是調(diào)用所有variable的initializer函數(shù)
import tensorflow as tf
v = tf.Variable([1,2,3]) #創(chuàng)建變量v仲锄,為一個(gè)array
print(v) #查看v的shape休蟹,不是v的值爽锥。結(jié)果是: <tf.Variable 'Variable:0' shape=(3,) dtype=int32_ref>
with tf.Session() as sess:
sess.run(v.initializer) #運(yùn)行變量的initializer。調(diào)用op之前,所有變量都應(yīng)被顯式地初始化過(guò)铺根。
sess.run(v) #查看v的值障涯,結(jié)果是:array([1, 2, 3])
variable的初始化罐旗,注意variable的初始化列表里面的都是表示初始值。
r = tf.Variable(tf.random_normal([20, 10], stddev=0.35)) #以標(biāo)準(zhǔn)差0.35的正太分布初始化一個(gè)形狀為[20唯蝶,40]的張量
z = tf.Variable(tf.zeros([20])) #初始化一個(gè)形狀為[20]的張量九秀, 里面的元素值全部為0.
創(chuàng)建變量還可以調(diào)用tf.get_variable
函數(shù)。要求指定變量的名稱粘我。此名稱將被其他副本用來(lái)訪問(wèn)同一變量鼓蜒,以及在檢驗(yàn)和導(dǎo)出模型時(shí)命名此變量的值。tf.get_variable 還允許您重用先前創(chuàng)建的同名變量征字,從而輕松定義重用層的模型都弹。
my_variable = tf.get_variable("my_variable", [1, 2, 3]) #這將創(chuàng)建一個(gè)名為“my_variable”的變量,該變量是形狀為 [1, 2, 3] 的三維張量
- initial_value:變量的初始值可以是一個(gè)張量匙姜,或者是可轉(zhuǎn)換為張量的Python對(duì)象畅厢。
-
dtype:如果設(shè)置,
initial_value
將被轉(zhuǎn)換為給定的類型氮昧。如果為None框杜,數(shù)據(jù)類型將被保留(前提是initial_value是張量)浦楣,或者由convert_to_tensor決定。
Variable(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None,
constraint=None
)
Variable中的常用屬性和方法
-
.eval(session=None)
:對(duì)tensor進(jìn)行運(yùn)算咪辱,返回該tensor運(yùn)算后的numpy ndarray類型的復(fù)制樣本振劳。 -
.get_shape()
:==tensor.shape
-
.initialized_value()
:返回variable的初始值。 -
read_value()
:返回當(dāng)前的variable的值 -
.assign(value, use_locking=False)
:僅需要賦值
assign返回的是一個(gè)tensor Op油狂,所以并不是立即就給y賦值历恐,而是需要執(zhí)行了這個(gè)Op操作以后才能完成賦值操作,通過(guò)這樣的設(shè)置可以完成更為復(fù)雜的運(yùn)算专筷。
assign_add(delta, use_locking=False)
W = tf.Variable(10)
assign_op = W.assign(100)
with tf.Session() as sess:
sess.run(W.initializer)
sess.run(assign_op)
print W.eval()
>> 100
----------------
my_var = tf.Variable(2, name="my_var")
# assign a * 2 to a and call that op a_times_two
my_var_times_two = my_var.assign(2 * my_var)
with tf.Session() as sess:
sess.run(my_var.initializer)
sess.run(my_var_times_two)
sess.run(my_var_times_two)
sess.run(my_var_times_two)
>>4
8
16
-----------------------------
y = tf.Variable(1)
b = tf.identity(y)
addOp = y.assign(y+3)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(addOp.eval())
print(addOp.eval())
--------
y = tf.Variable(1)
b = tf.identity(y)
addOp = y.assign(y+3)
x = tf.constant(1)
print(addOp)
print(b)
print(y)
print(x)
>>Tensor("Assign:0", shape=(), dtype=int32_ref)
Tensor("Identity:0", shape=(), dtype=int32)
<tf.Variable 'Variable:0' shape=() dtype=int32_ref>
Tensor("Const:0", shape=(), dtype=int32)
# Tensor("Assign")表示 Assign類型的op操作
# Tensor("Identity")表示是Identity類型的Op操作
tf.constant()
返回一個(gè)常量tensor
- tf.zeros_like(tensor,) :表示和這個(gè)tensor的形狀一樣但是是全零向量弱贼。
- tf.constant(value,):產(chǎn)生常量 Tensor, value 值可為 python 標(biāo)準(zhǔn)數(shù)據(jù)類型、Numpy 等仁堪,和variable不一樣了哮洽,第一個(gè)參數(shù)是值**。
- tf.fill(shape,value):表示給一個(gè)shape填充值弦聂。
# 產(chǎn)生全 0 的張量
tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(tensor, dtype=None, name=None)
# 產(chǎn)生全 1 的張量
tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(tensor, dtype=None, name=None)
# Creates a tensor of shape and fills it with value
tf.fill(shape, value, name=None)
tf.fill([2, 3], 9) ==> [[9, 9, 9]
[9, 9, 9]]
tf.constant(value, dtype=None, shape=None, name='Const')
tf.constant(-1.0, shape=[2, 3]) => [[-1., -1., -1.] # Note: 注意 shape 的用法(廣播機(jī)制)
[-1., -1., -1.]]
tf.constant([1,2,3,4,5,6], shape=[2,3]) => [[1, 2, 3]
[4, 5, 6]]
序列
-
tf.linspace(start,stop,num)
:產(chǎn)生 num 個(gè)等距分布在[start, stop]
間元素組成的數(shù)組鸟辅,包括 start & stop (需為 float 類型) -
tf.range([start], limit, delta=1, dtype=None, name='range')
:[]為可選參數(shù),步長(zhǎng) delta 默認(rèn)為 1莺葫,start 默認(rèn)為 0, limit 的值取不到匪凉,它產(chǎn)生一個(gè)數(shù)字序列。tf.range(limit=5) # [0, 1, 2, 3, 4]
捺檬。
# increase by (stop - start) / (num - 1)
tf.linspace(start, stop, num,, name=None)
tf.range([start], limit, delta=1, dtype=None, name='range')
# eg
tf.range(start=3, limit=18, delta=3) # [3, 6, 9, 12, 15]
tf.range(limit=5) # [0, 1, 2, 3, 4]
Random Tensors
-
tf.random_normal(shape,mean=0.0,dtype=tf.float32,)
: 正態(tài)分布再层,默認(rèn)均值為0,標(biāo)準(zhǔn)差為1.0堡纬,數(shù)據(jù)類型為float32聂受。 -
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, )
:截?cái)嗾植迹骄档木嚯x超過(guò)2倍標(biāo)準(zhǔn)差的隨機(jī)數(shù)將被丟棄烤镐,然后重新抽取蛋济,直到取得足夠數(shù)量的隨機(jī)數(shù)為止 -
seed
:是設(shè)置抽樣的隨機(jī)種子數(shù)。 -
tf.random_shuffle(value, seed=None, name=None)
:對(duì)value的第0維隨機(jī)進(jìn)行shuffle操作炮叶。 -
tf.random_crop(value, size, seed=None, name=None)
:對(duì)value的按照指定的size進(jìn)行隨機(jī)裁剪碗旅,例如對(duì)圖片進(jìn)行隨機(jī)裁剪可以設(shè)置size = [crop_height, crop_width, 3]
。 -
tf.random_uniform([1], seed=1)
:根據(jù)隨機(jī)數(shù)種子隨機(jī)創(chuàng)造一個(gè)形狀為[1]
的數(shù)字 -
tf.multinomial(logits, num_samples, seed=None, name=None)
:從多項(xiàng)式分布里面采樣镜悉。 -
tf.random_gamma(shape,alpha,beta=None,dtype=tf.float32,
:從gamma分布里面生成形狀為shape的隨機(jī)數(shù)序列
# 正態(tài)分布祟辟,默認(rèn)均值為0,標(biāo)準(zhǔn)差為1.0侣肄,數(shù)據(jù)類型為float32
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
# 正態(tài)分布旧困,但那些到均值的距離超過(guò)2倍標(biāo)準(zhǔn)差的隨機(jī)數(shù)將被丟棄,然后重新抽取,直到取得足夠數(shù)量的隨機(jī)數(shù)為止, 隨機(jī)數(shù) x
# 的取值范圍是$[mean - 2*stddev, mean + 2*stddev]$, 從而可以防止有元素與該張量中的其他元素顯著不同的情況出現(xiàn)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
# 產(chǎn)生在[minval, maxval)之間形狀為 shape 的均勻分布, 默認(rèn)是[0, 1)之間形狀為 shape 的均勻分布
tf.random_uniform(shape, minval=0.0, maxval=1, dtype=tf.float32, seed=None, name=None)
# Randomly shuffles a tensor along its first dimension
tf.random_shuffle(value, seed=None, name=None)
# Randomly crops a tensor to a given size
tf.random_crop(value, size, seed=None, name=None)
# Note:If a dimension should not be cropped, pass the full size of that dimension.
# For example, RGB images can be cropped with size = [crop_height, crop_width, 3]
# Sets the graph-level random seed
tf.set_random_seed(seed)
# 1. To generate the same repeatable sequence for an op across sessions
# set the seed for the op, a = tf.random_uniform([1], seed=1)
# 2. To make the random sequences generated by all ops be repeatable across sessions
# set a graph-level seed, tf.set_random_seed(1234)
# 其它
tf.multinomial(logits, num_samples, seed=None, name=None)
tf.random_gamma(shape,alpha,beta=None,dtype=tf.float32,seed=None,name=None)
參數(shù)的初始化
-
tf.constant_initializer()吼具、tf.zeros_initializer()被芳、tf.ones_initializer()
。 -
tf.random_uniform_initializer()馍悟、tf.uniform_unit_scaling_initializer()
。 tf.variance_scaling_initializer()
-
tf.glorot_uniform_initializer()剩晴、tf.glorot_normal_initializer()
:又稱Xavier_uniform_initializer
假設(shè)均勻分布的區(qū)間是[-limit, limit],則
limit=sqrt(6 / (fan_in + fan_out))
其中的fan_in和fan_out分別表示輸入單元的結(jié)點(diǎn)數(shù)和輸出單元的結(jié)點(diǎn)數(shù)锣咒。
由一個(gè) truncated normal distribution來(lái)初始化數(shù)據(jù).
stddev = sqrt(2 / (fan_in + fan_out))
-
tf.orthogonal_initializer()
:生成正交矩陣的隨機(jī)初始化
簡(jiǎn)寫(xiě)為tf.Orthogonal()。
生成正交矩陣的隨機(jī)數(shù)赞弥。
當(dāng)需要生成的參數(shù)是2維時(shí)毅整,這個(gè)正交矩陣是由均勻分布的隨機(jī)數(shù)矩陣經(jīng)過(guò)SVD分解而來(lái)。
init = tf.constant_initializer()
x = tf.get_variable(name='v_x', shape=[2, 3], initializer=init) # 必須指定shape
sess.run(x.initializer)
sess.run(x)
>>> array([[ 0., 0., 0.],
[ 0., 0., 0.]], dtype=float32)
使用另外一個(gè)變量進(jìn)行初始化
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")
Tensor的訪問(wèn)
- 可以進(jìn)行索引和切片:
可以逆序索引(arr[ : : -1])和負(fù)索引arr[-3]
绽左。 - 二維tensor的索引:
arr[r1:r2, c1:c2:step] # 也可指定 step 進(jìn)行切片
- ndarray的方式:
arr[i, j] == arr[i][j]
悼嫉。 - 在多維 Tensor 中,如果省略了后面的索引拼窥,則返回的對(duì)象會(huì)是一個(gè)維度低一點(diǎn)的ndarray(但它含有高一級(jí)維度上的某條軸上的所有數(shù)據(jù))戏蔑。
- 還可以進(jìn)行條件索引:arr[conditon] # conditon 可以使用 & | 進(jìn)行多條件組合
Tensor常用屬性
-
dtype
- 不帶小數(shù)點(diǎn)的數(shù)會(huì)被默認(rèn)為tf.int32,帶小數(shù)點(diǎn)的會(huì)默認(rèn)為tf.float32鲁纠。
- 可使用
tf.cast(x, dtype, name=None)
轉(zhuǎn)換數(shù)據(jù)類型总棵。 -
tf.string、tf.bool改含、tf.complex64情龄、tf.qint8,tf.float32/64捍壤、tf.int8/16/32/64
int8就是char骤视,pytorch中沒(méi)有t.bool只有。
-
shape
- tf.reshape(tensor, shape,)鹃觉,進(jìn)行reshape操作