欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
作者简介:石晓文,中国人民大学信息学院在读研究生,美团外卖算法实习生
简书ID:石晓文的学习日记(https://www.jianshu.com/u/c5df9e229a67)
天善社区:https://www.hellobi.com/u/58654/articles
腾讯云:https://cloud.tencent.com/developer/user/1622140
个人公众号:小小挖掘机(ID:wAIsjwj)
配套学习视频教程: 手把手教你用Python 实践深度学习
本文,将总结一下最近使用tensorflow中遇到的两个小需求:张量排序和字符串拼接,咱们一起来学习一下,嘻嘻!
1、张量排序
tensorflow是没有类似于python中sorted或者np.sort方法的,如果在流中使用这两个方法,是会报错的!那么我们如果想要在graph中实现对张量的排序,该如何做呢!我觉得可以使用top_k函数!
tf.nn.top_k
函数如下:
tf.nn.top_k(input, k, name=None)
这个函数的作用是返回 input 中每行最大的 k 个数(如果想要实现排序,k设置成数组长度即可),并且返回它们所在位置的索引。因此,返回的是一个tuple,我们用下标索引0取出排序后的结果。
看下面的例子:
choose = tf.placeholder(tf.int64,[None,5])
sortresult = tf.nn.top_k(choose,5,sorted=True)
sortresultarr = tf.nn.top_k(choose,5,sorted=True)[0]
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
feed_dict = {
choose:[[5,4,3,0,1],[2,3,0,4,2],[2,3,5,4,2]]
}
print(sess.run(sortresult,feed_dict=feed_dict))
print(sess.run(sortresultarr,feed_dict = feed_dict))
返回的结果如下:
TopKV2(values=array([[5, 4, 3, 1, 0],
[4, 3, 2, 2, 0],
[5, 4, 3, 2, 2]]), indices=array([[0, 1, 2, 4, 3],
[3, 1, 0, 4, 2],
[2, 3, 1, 0, 4]], dtype=int32))
[[5 4 3 1 0]
[4 3 2 2 0]
[5 4 3 2 2]]
2、字符串拼接
实现字符串拼接,如果给出的是数字型的tensor,我们首先要将数字转换成字符串,这里使用tf.as_string方法。
sortresultarr = tf.as_string(tf.nn.top_k(choose,5,sorted=True)[0])
输出如下:
[[b'5' b'4' b'3' b'1' b'0']
[b'4' b'3' b'2' b'2' b'0']
[b'5' b'4' b'3' b'2' b'2']]
也许你可能会使用tf.cast方法,不好意思,我们在将int64位转换成string时,报错了:
sortresultarr = tf.cast(tf.nn.top_k(choose,5,sorted=True)[0],tf.string)
error:Cast int64 to string is not supported
转换成字符串之后,字符串拼接我们可以查到两种方法:tf.reduce_join和tf.string_join。我们分别来试验下这两种方法。
tf.string_join
tf.string_join(
inputs,
separator='',
name=None
)
该方法将给定的字符串张量列表中的字符串连接成一个张量。如果我们直接把刚才的结果放入到函数中,报错了:
sortresultstr = tf.string_join(sortresultarr,separator=",")
#ERROR
TypeError: Expected list for 'inputs' argument to 'string_join' Op, not <tf.Tensor 'AsString:0' shape=(?, 5) dtype=string>.
因为函数要求输入的是一个list,而非一个张量,那好,我们就放入一个list,比如我们将结果的前两行放入:
sortresultstr = tf.string_join([sortresultarr[0],sortresultarr[1]],separator=",")
这次没有报错,而是返回了一个有趣的结果:
[b'5,4' b'4,3' b'3,2' b'1,2' b'0,0']
可以看到,它将我们传入的list中,按位进行了拼接,是不是很有趣!不过这并不是我们想要的答案,如果想要按行进行拼接,应该使用reduce_join函数。
tf.reduce_join
reduce_join(
inputs,
axis=None,
keep_dims=False,
separator='',
name=None,
reduction_indices=None
)
解释一下几个重要的参数:
inputs:
string类型的Tensor。
要加入的输入。所有减少的指数必须为非零的大小。
axis:
拼接的维度。
keep_dims:
可选的bool。默认为False。如果为True,则保留维度减小的长度1。
separator:
可选的string。默认为""。加入时要使用的分隔符。
看下面的例子:
sortresultstr = tf.reduce_join(sortresultarr,axis=1,keep_dims=True,separator=",")
结果如下:
[[b'5,4,3,1,0']
[b'4,3,2,2,0']
[b'5,4,3,2,2']]
参考文献
1、https://www.w3cschool.cn/tensorflow_python/tensorflow_python-zku82hj1.html
2、https://www.w3cschool.cn/tensorflow_python/tensorflow_python-ukns2mo5.html
3、https://blog.csdn.net/wuguangbin1230/article/details/72820627
网友评论