tensorflow数据类型tf.Dtype
官方API
tf.constant(),声明一个常量
constant(
value,
dtype=None,
shape=None,
name='Const',
verify_shape=False
)
heads = tf.constant([0, 1, 3, 4, 5], dtype=tf.int64)
tf.one_hot(),生成一组以one_hot方式表示的tensor
one_hot(
indices,
depth,
on_value=None,
off_value=None,
axis=None,
dtype=None,
name=None
)
heads = tf.constant([0, 1, 3, 4, 5], dtype=tf.int64)
num_entities = 5
one_hot = tf.one_hot(indices=heads, depth=num_entities)
- 为防止出错,depth与indices中的数据的数量应当一致。
tf.nn.embedding_lookup()
tf.nn.embedding_lookup
embedding_lookup(
params,
ids,
partition_strategy='mod',
name=None,
validate_indices=True,
max_norm=None
)
- 在只考虑前两个参数,后面参数默认的情况下,params是指embedding表,ids指的是要进行embedding的tensor,举例如下:
import tensorflow as tf
import numpy as np
def _random_uniform_unit(r, c):
""" Initialize random and unit row norm matrix of size (r, c). """
bound = 6. / np.sqrt(c)
init_matrix = np.random.uniform(-bound, bound, (r, c))
init_matrix = np.array(list(map(lambda row: row / np.linalg.norm(row), init_matrix)))
return init_matrix
queries = np.random.randint(0, 10, size=[5, 3])
query_embedding = _random_uniform_unit(10, 2)
print("queries\n{}".format(queries))
print("query_embedding\n{}".format(query_embedding))
inputs = tf.nn.embedding_lookup(query_embedding, queries)
sess = tf.Session()
print("inputs")
print(sess.run(inputs))
- queries.shape = [5,3]
[[3 7 1]
[4 3 3]
[6 3 2]
[3 3 0]
[0 1 2]]
- query_embedding.shape = [10,2]
[[ 0.90292864 0.42979049]
[-0.60955742 -0.79274192]
[-0.16401362 0.98645807]
[-0.0341987 0.99941505]
[-0.67351797 0.73917085]
[-0.33204653 0.94326301]
[-0.99956043 0.0296472 ]
[ 0.56861586 0.82260319]
[ 0.88163565 -0.47193069]
[-0.35534625 -0.93473474]]
- inputs.shape = [5,3,2]
[[[-0.0341987 0.99941505]
[ 0.56861586 0.82260319]
[-0.60955742 -0.79274192]]
[[-0.67351797 0.73917085]
[-0.0341987 0.99941505]
[-0.0341987 0.99941505]]
[[-0.99956043 0.0296472 ]
[-0.0341987 0.99941505]
[-0.16401362 0.98645807]]
[[-0.0341987 0.99941505]
[-0.0341987 0.99941505]
[ 0.90292864 0.42979049]]
[[ 0.90292864 0.42979049]
[-0.60955742 -0.79274192]
[-0.16401362 0.98645807]]]
tf.split()
split(
value,
num_or_size_splits,
axis=0,
num=None,
name='split'
)
- 考虑前3个参数,后面两个默认
将value在第axis上分成num_or_size_splits个,举例如下: - 例子1
matrix = np.random.randint(0, 5, size=[5, 8])
#默认axis=0
split0, split1 = tf.split(matrix, [2, 3])
sess = tf.Session()
print(matrix)
print(sess.run(split0)) #shape=[2,8]
print(sess.run(split1)) #shape=[3,8]
- matrix
[[0 0 1 0 1 2 1 0]
[3 2 2 2 4 1 2 4]
[3 4 3 1 0 0 0 3]
[0 1 2 0 3 1 0 4]
[4 1 0 0 4 4 1 0]]
- split0
[[0 0 1 0 1 2 1 0]
[3 2 2 2 4 1 2 4]]
- split1
[[3 4 3 1 0 0 0 3]
[0 1 2 0 3 1 0 4]
[4 1 0 0 4 4 1 0]]
- 例子2
matrix = np.random.randint(0, 5, size=[5, 4, 8])
print(matrix)
split0, split1 = tf.split(matrix, 2, axis=1)
sess = tf.Session()
print(sess.run(split0))
print(sess.run(split1))
- matrix
[[[1 3 3 0 1 3 3 1]
[0 2 3 3 0 4 1 3]
[3 4 3 0 3 0 0 2]
[1 3 0 0 0 1 1 0]]
[[4 2 3 0 1 2 3 0]
[0 0 3 3 2 0 3 1]
[3 3 1 1 4 1 4 4]
[0 4 4 0 0 0 0 0]]
[[4 1 0 1 4 1 1 2]
[0 2 3 4 0 3 3 3]
[1 4 1 4 2 0 3 1]
[4 1 1 4 3 3 4 4]]
[[3 3 3 4 0 2 2 1]
[1 0 2 1 3 0 4 4]
[4 4 1 1 2 0 4 0]
[4 1 2 0 1 2 4 3]]
[[2 1 2 1 3 4 1 4]
[4 2 4 1 4 3 4 3]
[3 2 2 0 1 2 2 1]
[2 0 2 4 2 0 0 4]]]
- split0
[[[1 3 3 0 1 3 3 1]
[0 2 3 3 0 4 1 3]]
[[4 2 3 0 1 2 3 0]
[0 0 3 3 2 0 3 1]]
[[4 1 0 1 4 1 1 2]
[0 2 3 4 0 3 3 3]]
[[3 3 3 4 0 2 2 1]
[1 0 2 1 3 0 4 4]]
[[2 1 2 1 3 4 1 4]
[4 2 4 1 4 3 4 3]]]
- split1
[[[3 4 3 0 3 0 0 2]
[1 3 0 0 0 1 1 0]]
[[3 3 1 1 4 1 4 4]
[0 4 4 0 0 0 0 0]]
[[1 4 1 4 2 0 3 1]
[4 1 1 4 3 3 4 4]]
[[4 4 1 1 2 0 4 0]
[4 1 2 0 1 2 4 3]]
[[3 2 2 0 1 2 2 1]
[2 0 2 4 2 0 0 4]]]
tf.reshape()
- 见API
tf.concat()
concat(
values,
axis,
name='concat'
)
例子:
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1) # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
# tensor t3 with shape [2, 3]
# tensor t4 with shape [2, 3]
tf.shape(tf.concat([t3, t4], 0)) # [4, 3]
tf.shape(tf.concat([t3, t4], 1)) # [2, 6]
tf.truncated_normal()
truncated_normal(
shape,
mean=0.0,
stddev=1.0,
dtype=tf.float32,
seed=None,
name=None
)
- 生成一个tuple,tuple.shape = shape。
- 取值是以mean为均值,stddev(standard deviation)为标准差的正态分布,且随机取值。
matrix = tf.truncated_normal([5, 5], mean=0.5, stddev=0.1)
sess = tf.Session()
print(sess.run(matrix))
[[ 0.45370424 0.48200235 0.4999696 0.4151116 0.41560024]
[ 0.43999606 0.5398522 0.42844459 0.58125985 0.54634178]
[ 0.66550612 0.56114542 0.42937878 0.50703061 0.45166823]
[ 0.69100404 0.57875633 0.41092399 0.56445539 0.41516542]
[ 0.66599876 0.65357423 0.53620756 0.42988184 0.57689136]]
tf.shape()
shape(
input,
name=None,
out_type=tf.int32
)
- 求一个tensor的shape
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
tf.shape(t) # [2, 2, 3]
tf.expand_dims()
expand_dims(
input,
axis=None,
name=None,
dim=None
)
- 在指定的axis上扩充1维
- 举例:
# 't' is a tensor of shape [2]
tf.shape(tf.expand_dims(t, 0)) # [1, 2]
tf.shape(tf.expand_dims(t, 1)) # [2, 1]
tf.shape(tf.expand_dims(t, -1)) # [2, 1]
# 't2' is a tensor of shape [2, 3, 5]
tf.shape(tf.expand_dims(t2, 0)) # [1, 2, 3, 5]
tf.shape(tf.expand_dims(t2, 2)) # [2, 3, 1, 5]
tf.shape(tf.expand_dims(t2, 3)) # [2, 3, 5, 1]
tf.stack()
stack(
values,
axis=0,
name='stack'
)
- 参考博客
- numpy文档 numpy的stack()和tensorflow的stack()功能完全相同。
- 这个函数困扰了我很久,但其实相通之后原理非常简单,先举一个例子,然后通过对这个例子的分析来理解这个函数。
- 例子:
a=[[1,2,3],
[4,5,6]]
b=[[1,2,3],
[4,5,6]]
c=[[1,2,3],
[4,5,6]]
#这里也可以用np.stack((a,b,c),axis=2)
d=tf.stack((a,b,c),axis=2)
print(d)
#d
[[[1 1 1]
[2 2 2]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]
- 首先,在这个函数中,第一个参数values并不是进行变换的基本单位,以例子为例,values是a,b,c的组合,但变换的基本单位是a、b和c,这三个tensor的shape必须是一致的。
- 然后就可以理解结果的维度变化,比如a的维度是(A,B),stack()函数的axis=0时,结果维度为(?,A,B);axis=1时,结果维度为(A,?,B);axis=2时,结果维度为(A,B,?)。
- 然后就是各个个体(这里就是a,b和c)相对应位置的组合。
tf.squeeze()
- 去掉维度为1的维
- 官方文档
squeeze(
input,
axis=None,
name=None,
squeeze_dims=None
)
- example
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
tf.shape(tf.squeeze(t)) # [2, 3]
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
tf.shape(tf.squeeze(t, [2, 4])) # [1, 2, 3, 1]
SparseTensorValue(indices, values, dense_shape)
- 参考链接
- 生成一个稀疏张量,shape=dense_shape。
- 稀疏的意思是这个张量里面0很多,不是0的数(比如1)比0少的多。
- dense_shape说明了要生成的稀疏张量的维数。
- indices代表了所生成稀疏张量中不是0的数的位置。
- values中的值与indices的值一一对应,代表了不是0的数的值。
- 举例:
tf.SparseTensorValue(
indices=[[4, 1], [1, 2]],
values=tf.constant([1, 2]),
dense_shape=[5, 5]
)
- a为:
[[ 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.]]