引用
tf.get_variable可以只指定一个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 就是没有在用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()
就是调用所有variable的initializer函数
import tensorflow as tf
v = tf.Variable([1,2,3]) #创建变量v,为一个array
print(v) #查看v的shape,不是v的值。结果是:
with tf.Session() as sess:
sess.run(v.initializer) #运行变量的initializer。调用op之前,所有变量都应被显式地初始化过。
sess.run(v) #查看v的值,结果是:array([1, 2, 3])
variable的初始化,注意variable的初始化列表里面的都是表示初始值。
r = tf.Variable(tf.random_normal([20, 10], stddev=0.35)) #以标准差0.35的正太分布初始化一个形状为[20,40]的张量
z = tf.Variable(tf.zeros([20])) #初始化一个形状为[20]的张量, 里面的元素值全部为0.
创建变量还可以调用tf.get_variable
函数。要求指定变量的名称。此名称将被其他副本用来访问同一变量,以及在检验和导出模型时命名此变量的值。tf.get_variable 还允许您重用先前创建的同名变量,从而轻松定义重用层的模型。
my_variable = tf.get_variable("my_variable", [1, 2, 3]) #这将创建一个名为“my_variable”的变量,该变量是形状为 [1, 2, 3] 的三维张量
- initial_value:变量的初始值可以是一个张量,或者是可转换为张量的Python对象。
- dtype:如果设置,
initial_value
将被转换为给定的类型。如果为None,数据类型将被保留(前提是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)
:对tensor进行运算,返回该tensor运算后的numpy ndarray类型的复制样本。 -
.get_shape()
:==tensor.shape
-
.initialized_value()
:返回variable的初始值。 -
read_value()
:返回当前的variable的值 -
.assign(value, use_locking=False)
:仅需要赋值
assign返回的是一个tensor Op,所以并不是立即就给y赋值,而是需要执行了这个Op操作以后才能完成赋值操作,通过这样的设置可以完成更为复杂的运算。
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)
Tensor("Const:0", shape=(), dtype=int32)
# Tensor("Assign")表示 Assign类型的op操作
# Tensor("Identity")表示是Identity类型的Op操作
tf.constant()
返回一个常量tensor
- tf.zeros_like(tensor,) :表示和这个tensor的形状一样但是是全零向量。
- tf.constant(value,):产生常量 Tensor, value 值可为 python 标准数据类型、Numpy 等,和variable不一样了,第一个参数是值**。
- tf.fill(shape,value):表示给一个shape填充值。
# 产生全 0 的张量
tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(tensor, dtype=None, name=None)
# 产生全 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 的用法(广播机制)
[-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)
:产生 num 个等距分布在[start, stop]
间元素组成的数组,包括 start & stop (需为 float 类型) -
tf.range([start], limit, delta=1, dtype=None, name='range')
:[]为可选参数,步长 delta 默认为 1,start 默认为 0, limit 的值取不到,它产生一个数字序列。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,)
: 正态分布,默认均值为0,标准差为1.0,数据类型为float32。 -
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, )
:截断正太分布,到均值的距离超过2倍标准差的随机数将被丢弃,然后重新抽取,直到取得足够数量的随机数为止 -
seed
:是设置抽样的随机种子数。 -
tf.random_shuffle(value, seed=None, name=None)
:对value的第0维随机进行shuffle操作。 -
tf.random_crop(value, size, seed=None, name=None)
:对value的按照指定的size进行随机裁剪,例如对图片进行随机裁剪可以设置size = [crop_height, crop_width, 3]
。 -
tf.random_uniform([1], seed=1)
:根据随机数种子随机创造一个形状为[1]
的数字 -
tf.multinomial(logits, num_samples, seed=None, name=None)
:从多项式分布里面采样。 -
tf.random_gamma(shape,alpha,beta=None,dtype=tf.float32,
:从gamma分布里面生成形状为shape的随机数序列
# 正态分布,默认均值为0,标准差为1.0,数据类型为float32
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
# 正态分布,但那些到均值的距离超过2倍标准差的随机数将被丢弃,然后重新抽取,直到取得足够数量的随机数为止, 随机数 x
# 的取值范围是$[mean - 2*stddev, mean + 2*stddev]$, 从而可以防止有元素与该张量中的其他元素显著不同的情况出现
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
# 产生在[minval, maxval)之间形状为 shape 的均匀分布, 默认是[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)
参数的初始化
-
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
假设均匀分布的区间是[-limit, limit],则
limit=sqrt(6 / (fan_in + fan_out))
其中的fan_in和fan_out分别表示输入单元的结点数和输出单元的结点数。
由一个 truncated normal distribution来初始化数据.
stddev = sqrt(2 / (fan_in + fan_out))
-
tf.orthogonal_initializer()
:生成正交矩阵的随机初始化
简写为tf.Orthogonal()。
生成正交矩阵的随机数。
当需要生成的参数是2维时,这个正交矩阵是由均匀分布的随机数矩阵经过SVD分解而来。
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)
使用另外一个变量进行初始化
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的访问
- 可以进行索引和切片:
可以逆序索引(arr[ : : -1])和负索引arr[-3]
。 - 二维tensor的索引:
arr[r1:r2, c1:c2:step] # 也可指定 step 进行切片
- ndarray的方式:
arr[i, j] == arr[i][j]
。 - 在多维 Tensor 中,如果省略了后面的索引,则返回的对象会是一个维度低一点的ndarray(但它含有高一级维度上的某条轴上的所有数据)。
- 还可以进行条件索引:arr[conditon] # conditon 可以使用 & | 进行多条件组合
Tensor常用属性
- dtype
- 不带小数点的数会被默认为tf.int32,带小数点的会默认为tf.float32。
- 可使用
tf.cast(x, dtype, name=None)
转换数据类型。 -
tf.string、tf.bool、tf.complex64、tf.qint8,tf.float32/64、tf.int8/16/32/64
int8就是char,pytorch中没有t.bool只有。
- shape
- tf.reshape(tensor, shape,),进行reshape操作