本文主要讲解TensorFlow中比较常用的的几个函数:

tf.slice()

tf.convert_to_tensor()

tf.nn.embedding_lookup()

1、tf.slice()

tf.slice(
input_,
begin,
size,
name=None
)

begin:切片操作的起始位置

size:每个维度要取的数据个数

输出:
input = [[[1, 1, 1], [2, 2, 2]],
[[3, 3, 3], [4, 4, 4]],
[[5, 5, 5], [6, 6, 6]]]
tf.slice(input, [1, 0, 0], [1, 1, 3]) ==> [[[3, 3, 3]]]
tf.slice(input, [1, 0, 0], [1, 2, 3]) ==> [[[3, 3, 3],
[4, 4, 4]]]
tf.slice(input, [1, 0, 0], [2, 1, 3]) ==> [[[3, 3, 3]],
[[5, 5, 5]]]

tf.gather(input, [0, 2]) ==> [[[1, 1, 1], [2, 2, 2]],
[[5, 5, 5], [6, 6, 6]]]

假设我们要从input中抽取[[[3, 3, 3]]],这个输出在inputaxis=0的下标是1,axis=1的下标是0,axis=2的下标是0-2,所以begin=[1,0,0],size=[1,1,3]。

假设我们要从input中抽取[[[3, 3, 3], [4, 4, 4]]],这个输出在inputaxis=0的下标是1,axis=1的下标是0-1,axis=2的下标是0-2,所以begin=[1,0,0],size=[1,2,3]。

假设我们要从input中抽取[[[3, 3, 3], [5, 5, 5]]],这个输出在inputaxis=0的下标是1-2,axis=1的下标是0,axis=2的下标是0-2,所以begin=[1,0,0],size=[2,1,3]。

假设我们要从input中抽取[[[1, 1, 1], [2, 2, 2]],[[5, 5, 5], [6, 6, 6]]],这个输出在input的axis=0的下标是[0, 2],不连续,可以用tf.gather抽取。input[0]和input[2]

2、tf.convert_to_tensor()

tf.convert_to_tensor(
value,
dtype=None,
name=None,
preferred_dtype=None
)

将给定value转换为Tensor。此函数将各种类型的Python对象转换为Tensor 对象。它接受Tensor对象,numpy数组,Python列表和Python标量。

参数:

value:需要转换的

dtype:返回张量的可选元素类型。如果缺少,则从value的类型推断出类型。

name:如果Tensor创建了new,则使用可选名称。

返回:

一个基于value的输出操作(ops),输出一个tensor(自己的理解)

a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.convert_to_tensor(a, dtype=tf.float32)
# <tf.Tensor 'Const_3:0' shape=(2, 2) dtype=float32>

3、tf.nn.embedding_lookup()

tf.nn.embedding_lookup(params,
ids, partition_strategy='mod',
name=None,
validate_indices=True,
max_norm=None
)

直接来个例子:

import numpy as np
import tensorflow as tf
data = np.array([[[2],[1]],[[3],[4]],[[6],[7]]])
data = tf.convert_to_tensor(data)
k = [[0,1],[1,0],[0,0]]
lookup_data = tf.nn.embedding_lookup(data,k)
init = tf.global_variables_initializer()
In [76]: data.shape
Out[76]: (3, 2, 1)
In [77]: np.array(lk).shape
Out[77]: (3, 2)
In [78]: lookup_data
Out[78]: <tf.Tensor 'embedding_lookup_8:0' shape=(3, 2, 2, 1) dtype=int64>

不懂?看下面这个图:

TensorFlow中常用的函数

k中的值,在要寻找的embedding数据中下找对应的index下的vector进行拼接。永远是look(k)部分的维度+embedding(data)部分的除了第一维后的维度拼接。很明显,我们也可以得到,k里面值是必须要小于等于embedding(data)的最大维度减一的

In [79]: data
Out[79]:
array([[[2],
[1]],
[[3],
[4]],
[[6],
[7]]])
In [80]: lk
Out[80]: [[0, 1], [1, 0], [0, 0]]
# lk[0]也就是[0,1]对应着下面sess.run(lookup_data)的结果恰好是把data中的[[2],[1]],[[3],[4]]
In [81]: sess.run(lookup_data)
Out[81]:
array([[[[2],
[1]],
[[3],
[4]]],
[[[3],
[4]],
[[2],
[1]]],
[[[2],
[1]],
[[2],
[1]]]])
 麻烦大家点一下关注,有不懂的可以私信我,欢迎收藏、评论、点赞。 
相关文章