[tf]tf的数据类型

引用

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操作

你可能感兴趣的:([tf]tf的数据类型)