Tensorflow函数详解

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.]]

你可能感兴趣的:(Tensorflow函数详解)