tf.concat的作用主要是将向量按指定维连起来,其余维度不变;而1.0版本以后,函数的用法变成:
import tensorflow as tf
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
#按照第0维连接
t12_0 = tf.concat( [t1, t2],0)
#按照第1维连接
t12_1 = tf.concat([t1, t2],1)
with tf.Session() as sess:
print(sess.run(t12_0))
print(sess.run(t12_1))
输出:
---------------------
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
----------------------
作为参考合成神经网络输出的时候在深度方向(inception_v3)是数字3,[batch,heigh,width,depth]。
用法:stack(values, axis=0, name=”stack”):
“”“Stacks a list of rank-R
tensors into one rank-(R+1)
tensor.
x = tf.constant([1, 4])
y = tf.constant([2, 5])
z = tf.constant([3, 6])
tf.stack([x,y,z]) ==> [[1,4],[2,5],[3,6]]
tf.stack([x,y,z],axis=0) ==> [[1,4],[2,5],[3,6]]
tf.stack([x,y,z],axis=1) ==> [[1, 2, 3], [4, 5, 6]]
tf.stack将一组R维张量变为R+1维张量。注意:tf.pack已经变成了tf.stack\3、tf.squeeze。数据降维,只裁剪等于1的维度。不指定维度则裁剪所有长度为1的维度。
import tensorflow as tf
arr = tf.Variable(tf.truncated_normal([3,4,1,6,1], stddev=0.1))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(arr).shape)
print(sess.run(tf.squeeze(arr,[2,])).shape)
print(sess.run(tf.squeeze(arr,[2,4])).shape)
print(sess.run(tf.squeeze(arr)).shape)
输出:
----------------
(3, 4, 1, 6, 1)
(3, 4, 6, 1)
(3, 4, 6)
(3, 4, 6)
----------------
tf.slice
slice(input_, begin, size, name=None)
从张量中提取一个切片。
import tensorflow as tf
input = [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]]
slice_1 = tf.slice(input, [1, 0, 0], [1, 1, 3])
slice_2 = tf.slice(input, [1, 0, 0], [1, 2, 3])
slice_3 = tf.slice(input, [1, 0, 0], [2, 1, 3])
with tf.Session() as sess:
print(sess.run(slice_1))
print(sess.run(slice_2))
print(sess.run(slice_3))
输出:
------------
[[[3 3 3]]]
[[[3 3 3]
[4 4 4]]]
[[[3 3 3]]
[[5 5 5]]]
------------
tf.strided_slice(record_bytes, [0], [label_bytes]), tf.int32)
def strided_slice(
input_, begin,
end,
strides=None,
begin_mask=0,
end_mask=0,
ellipsis_mask=0,
new_axis_mask=0,
shrink_axis_mask=0,
var=None,
name=None
):
例:
import tensorflow as tf
# 来把输入变个型,可以看成3维的tensor,从外向为1,2,3维。
input= \
[
[[1, 1, 1],
[2, 2, 2]
],
[[3, 3, 3],
[4, 4, 4]
],
[[5, 5, 5],
[6, 6, 6]
]
]
slice = tf.strided_slice(input, [0,0,0], [2,2,2], [1,2,1])
with tf.Session() as sess:
print(sess.run(slice))
# start = [0,0,0] , end = [2,2,2], stride = [1,2,1]
# 求一个[start, end)的一个片段,注意end为开区间
# 第1维 start = 0 , end = 2, stride = 1, 所以取 0 , 1行,此时的输出
# [[[1, 1, 1], [2, 2, 2]],
# [[3, 3, 3], [4, 4, 4]]]
# 第2维时, start = 0 , end = 2 , stride = 2, 所以只能取0行,此时的输出
# [[[1, 1, 1]],
# [[3, 3, 3]]]
# 第3维的时候,start = 0, end = 2, stride = 1, 可以取0,1行,此时得到的就是最后的输出
# [[[1, 1]],
# [[3, 3]]]
# 整理之后最终的输出为:
# [[[1,1],[3,3]]]