tensorflow中的函数随手记

tf.concat

tf.concat 起到的是拼接的作用,函数主要有两个参数,分别是 axis 和 values。这两个参数 axis 起到确定相加方向的作用,values 起到给出待相加参数的作用。
axis 这个参数常见有 0和1,即指定相加方向。0 指的是列相加;1 指的是行相加。理论上还有 -1 这个参数,但一般用不上。要注意的是,若要列相加,则两个向量的行应相同;若行相加,则向量的列应当相同。
例如说:
给出两个向量,他们的 shape 分别为 (2, 2) 和 (2, 2),行相加之后就是 (4, 2),列相加之后就是 (2, 4)
我们有:

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

tf.argmax

tf.argmax 起到的是比较大小的作用,它进行比较的顺序先宽后高以深度为标准进行比较。
也就是说,这个函数的输出值的 shape 即为你输入值的宽和高。它会为你比较在同一宽高处不同深度的值的大小,并且把最大值的位置返回给你。例如:

n = np.random.randn(3,4,2)
res = tf.argmax(n)
# res.shape = (4,2)

n = np.random.randn(2,3,4)
res = tf.argmax(n)
# res.shape = (3,4)

返回值的形式如下所示:

sess.run(res)
array([[1, 0, 1, 1],
       [1, 0, 1, 1],
       [0, 1, 1, 0]], dtype=int64)

numpy中数组的使用注意

当你在numpy中定义一个随机数组的时候,例如 ex

>>> ex = np.random.randn(1, 2, 2, 3)
>>> ex
array([[[[ 0.15811279,  0.91209517, -3.47016142],
         [ 0.23840981,  1.6852879 , -0.68669106]],

        [[-1.13691608, -1.4908408 , -1.09036246],
         [-0.00371591,  0.68245959, -1.63700518]]]])

若我们此时使用这种选择数组第一列的时候,就会得到下列结果。看着好像不是那么对,0.23怎么跑到 [0, 0, 1] 的位置去了

>>> sub = ex[:, :, :, 0]
>>> sub
array([[[ 0.15811279,  0.23840981],
        [-1.13691608, -0.00371591]]])

那么这时候,我们如果想得到和 ex 相同的位置,就需要像这样:

>>> sub = ex[:, :, :, 0:1]
>>> sub
array([[[[ 0.15811279],
         [ 0.23840981]],

        [[-1.13691608],
         [-0.00371591]]]])

就可以得到正确的结果了。要注意的是,0:1 代表的是第一列,也就是数组下标为0的那一列。
另外的是,在使用 numpy 进行数组的 reshape 操作的时候,reshape 的取值顺序是先行后列最后是深度,最后是样本数量

双冒号(::)的用法

对于某一个元组,例如:

ex = [1,2,3,4,5,6,7,8,9,0]

如果我们选取单独的某一个值:

>>> ex[1]
2

或者我们选取一部分的值

>>> ex[1:4]
[2, 3, 4]

我们也可以使用::进行操作,::的操作语法是
[起始位置 : 终结位置 : 步长]
当终结位置不设定时,则默认是结尾

>>> ex[1:4:1]
[2, 3, 4]
>>> ex[1:4:2]
[2, 4]
>>> ex[1::2]
[2, 4, 6, 8, 0]

eval与literal_eval的使用与区别

在python中,若要将字符串型的 list,tuple,dict 转变成原有的类型,我们一般会使用 eval 这个函数。的作用就是把数据还原成它本身或者是能够转化成的数据类型。例如:

>>> str_list = "[1,2,3]"
>>> trans_list = eval(str_list)
>>> trans_list
[1, 2, 3]
>>> type(str_list)
<class 'str'>
>>> type(trans_list)
<class 'list'>

但这个函数也有着比较严重的问题,就是它能把字符串转换成操作的类型实在是太多了,但如果你输入了命令性质的字符串,例如:

open(r'...', 'r').read()

它真的会按照你输入的指令进行执行,这可是大麻烦,所以就有了literal_eval。从表面上看,literal 意思是文字,也就是这东西只转换数据了。若输入指令性质的操作,就会报错并不会执行,从而更加安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值