tf.stack()与tf.unstack()函数   & tf.constant()

tf.stack()

是一个矩阵拼接函数,即将秩为 R 的张量列表堆叠成一个秩为 (R+1) 的张量

import tensorflow as tf
a = tf.constant([[1,2,3],[4,5,6]])
b = tf.constant([[7,8,9],[0,1,7]])
c = tf.stack([a,b],axis = 0)
with tf.Session() as sess:
    result1 = sess.run(c)
    print(result1)
>>>
[[[1 2 3]
  [4 5 6]]
 
 [[7 8 9]
  [0 1 7]]]

将 values 中的张量列表打包成一个张量,该张量比 values 中的每个张量都高一个秩,通过沿 axis 维度打包
给定一个形状为(A, B, C)的张量的长度 N 的列表;

如果 axis == 0,那么 output 张量将具有形状(N, A, B, C)。
如果 axis == 1,那么 output 张量将具有形状(A, N, B, C)。

如果 axis == 2,那么 output 张量将具有形状( A, B, N, C)。
如果 axis == 3,那么 output 张量将具有形状(A, B, C, N)。  或者 axis=-1 表示最后一个??


tf.unstack()

是一个拆分矩阵的函数,将秩为 R 的张量的给定维度出栈为秩为 (R-1) 的张量。

通过沿 axis 维度将 num 张量从 value 中分离出来。如果没有指定 num(默认值),则从 value 的形状推断。如果 value.shape[axis] 不知道,则引发 ValueError。

例如,给定一个具有形状 (A, B, C, D) 的张量。

  • 如果 axis == 0,那么 output 中的第 i 个张量就是切片 value[i, :, :, :],并且 output 中的每个张量都具有形状 (B, C, D)。(请注意,出栈的维度已经消失,不像split)。 
  • 如果 axis == 1,那么 output 中的第 i 个张量就是切片 value[:, i, :, :],并且 output 中的每个张量都具有形状 (A, C, D)。 

这与堆栈(stack.)相反

 

tf.constant()  https://blog.csdn.net/csdn_jiayu/article/details/82155224

在TensorFlow API中创建常量的函数原型如下所示:

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)


可以看到第一个值value是必须的,可以是一个数值,也可以是一个列表。
1 如果是数值

tensor=tf.constant(1)

为查看结果必须创建一个会话,并用取值函数eval()来查看创建的tensor的值:

sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())
结果是:1

 

2 如果value是一个列表:

tensor=tf.constant([1, 2])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

 

结果是:[1 2]

3 参数说明

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)

后面四个参数可写可不写,
1 第二个参数
表示数据类型,一般可以是tf.float32, tf.float64等:

tensor=tf.constant([1, 2], dtype=tf.float32)
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())

   结果是: [1. 2.]
 

2 第三个参数

表示张量的“形状”,即维数以及每一维的大小。
如果指定了第三个参数,当第一个参数value是数字时,张量的所有元素都会用该数字填充:

tensor=tf.constant(-1, shape=[2, 3])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())
结果是: [[-1 -1 -1]
         [-1 -1 -1]]

可以看到是一个二维张量,第一维大小为2, 第二维大小为3,全用数字-1填充。

而当第一个参数value是一个列表时,注意列表的长度必须小于等于第三个参数shape的大小(即各维大小的乘积),
否则7个数,但是给了6个位置[2,3]会报错:

tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])

报错如下:Traceback (most recent call last):
  File "<pyshell#68>", line 1, in <module>
    tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
ValueError: Too many elements provided. Needed at most 6, but received 7


而如果列表大小小于shape大小,则会用列表的最后一项元素填充剩余的张量元素:

tensor=tf.constant([1, 2], shape=[1, 4, 3])
sess=tf.Session()
with sess.as_default():
    print('结果是:', tensor.eval())
结果是: [[[1 2 2]
          [2 2 2]
          [2 2 2]
          [2 2 2]]]

3 第四个参数

name可以是任何内容,主要是字符串就行。
不输入任何内容时:

tensor=tf.constant([1, 2])
print(tensor)
Tensor("Const_16:0", shape=(2,), dtype=int32)

作为对比:

tensor=tf.constant([1, 2], name="jiayu")
print(tensor)
Tensor("jiayu_1:0", shape=(2,), dtype=int32)

4 第五个参数

verify_shape默认为False,
如果修改为True的话表示检查value的形状与shape是否相符,如果不符会报错

tensor=tf.constant([[1, 2, 3], [4, 5, 6]], shape=[2, 3], verify_shape=True)

    以上代码value与shape都是两行三列,检查结果正确。而下面的代码会报错

tensor=tf.constant([1, 2], shape=[3, 2], verify_shape=True)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机视觉-Archer

图像分割没有团队的同学可加群

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值