#对于2-D #所有的reduce_...,如果不加axis的话,都是对整个矩阵进行运算 tf.reduce_sum(a, 1) #对axis1 tf.reduce_mean(a,0) #每列均值
第二个参数是axis,如果为0的话,
r
e
s
[
i
]
=
∑
j
a
[
j
,
i
]
res[i] = \sum_{j} a[j,i]
res[i]=∑ja[j,i]即(
r
e
s
[
i
]
=
∑
a
[
:
,
i
]
res[i] = \sum a[:,i]
res[i]=∑a[:,i]), 如果是1的话,
r
e
s
[
i
]
=
∑
j
a
[
i
,
j
]
res[i] = \sum_{j} a[i,j]
res[i]=∑ja[i,j]
NOTE:返回的都是行向量,(axis等于几,就是对那维操作,i.e.:沿着那维操作, 其它维度保留)
#关于concat,可以用来进行降维 3D->2D , 2D->1D tf.concat(concat_dim, data) #arr = np.zeros([2,3,4,5,6]) In [6]: arr2.shape Out[6]: (2, 3, 4, 5) In [7]: np.concatenate(arr2, 0).shape Out[7]: (6, 4, 5) :(2*3, 4, 5) In [9]: np.concatenate(arr2, 1).shape Out[9]: (3, 8, 5) :(3, 2*4, 5) #tf.concat() t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, 8, 9], [10, 11, 12]] # 将t1, t2进行concat,axis为0,等价于将shape=[2, 2, 3]的Tensor concat成 #shape=[4, 3]的tensor。在新生成的Tensor中tensor[:2,:]代表之前的t1 #tensor[2:,:]是之前的t2 tf.concat(0, [t1, t2]) ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] # 将t1, t2进行concat,axis为1,等价于将shape=[2, 2, 3]的Tensor concat成 #shape=[2, 6]的tensor。在新生成的Tensor中tensor[:,:3]代表之前的t1 #tensor[:,3:]是之前的t2 tf.concat(1, [t1, t2]) ==> [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
concat是将list中的向量给连接起来,axis表示将那维的数据连接起来,而其他维的结构保持不变
#squeeze 降维 维度为1的降掉 tf.squeeze(arr, []) 降维, 将维度为1 的降掉 arr = tf.Variable(tf.truncated_normal([3,4,1,6,1], stddev=0.1)) arr2 = tf.squeeze(arr, [2,4]) arr3 = tf.squeeze(arr) #降掉所以是1的维 #split tf.split(split_dim, num_split, value, name='split') # 'value' is a tensor with shape [5, 30] # Split 'value' into 3 tensors along dimension 1 split0, split1, split2 = tf.split(1, 3, value) tf.shape(split0) ==> [5, 10] #embedding mat = np.array([1,2,3,4,5,6,7,8,9]).reshape((3,-1)) ids = [[1,2], [0,1]] res = tf.nn.embedding_lookup(mat, ids) res.eval() array([[[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6]]]) #扩展维度,如果想用广播特性的话,经常会用到这个函数 # 't' is a tensor of shape [2] #一次扩展一维 shape(tf.expand_dims(t, 0)) ==> [1, 2] shape(tf.expand_dims(t, 1)) ==> [2, 1] shape(tf.expand_dims(t, -1)) ==> [2, 1] # 't2' is a tensor of shape [2, 3, 5] shape(tf.expand_dims(t2, 0)) ==> [1, 2, 3, 5] shape(tf.expand_dims(t2, 2)) ==> [2, 3, 1, 5] shape(tf.expand_dims(t2, 3)) ==> [2, 3, 5, 1]
tf.slice()
tf.slice(input_, begin, size, name=None)
先看例子
import tensorflow as tf import numpy as np sess = tf.InteractiveSession() a = np.array([[1,2,3,4,5],[4,5,6,7,8],[9,10,11,12,13]]) tf.slice(a,[1,2],[-1,2]).eval() #array([[ 6, 7], # [11, 12]])
理解tf.slice()最好是从返回值上去理解,现在假设input的shape是[a1, a2, a3], begin
的值是[b1, b2, b3],size
的值是[s1, s2, s3],那么tf.slice()
返回的值就是 input[b1:b1+s1, b2:b2+s2, b3:b3+s3]
。
如果
s
i
=
−
1
s_i=-1
si=−1 ,那么 返回值就是 input[b1:b1+s1,..., bi: ,...]
注意:input[1:2] 取不到input[2]
tf.stack()
tf.stack(values, axis=0, name='stack')
将 a list of R 维的Tensor
堆成 R+1
维的Tensor
。
Given a list of length N of tensors of shape (A, B, C);
if axis == 0 then the output tensor will have the shape (N, A, B, C)
这时 res[i,:,:,:] 就是原 list中的第 i 个 tensor
. if axis == 1 then the output tensor will have the shape (A, N, B, C).
这时 res[:,i,:,:] 就是原list中的第 i 个 tensor
Etc.
# 'x' is [1, 4] # 'y' is [2, 5] # 'z' is [3, 6] stack([x, y, z]) => [[1, 4], [2, 5], [3, 6]] # Pack along first dim. stack([x, y, z], axis=1) => [[1, 2, 3], [4, 5, 6]]
tf.pad
tf.pad(tensor, paddings, mode="CONSTANT", name=None)
-
tensor
: 任意shape
的tensor
,维度Dn
-
paddings
:[Dn, 2]
的Tensor
,Padding
后tensor
的某维上的长度变为padding[D,0]+tensor.dim_size(D)+padding[D,1]
-
mode
:CONSTANT
表示填0
,REFLECT
表示反射填充,SYMMETRIC
表示对称填充。
tf.gather()
tf.gather(params, indices, validate_indices=None, name=None)
indices must be an integer tensor of any dimension (usually 0-D or 1-D). Produces an output tensor with shape indices.shape + params.shape[1:]
# Scalar indices, 会降维 output[:, ..., :] = params[indices, :, ... :] # Vector indices output[i, :, ..., :] = params[indices[i], :, ... :] # Higher rank indices,会升维 output[i, ..., j, :, ... :] = params[indices[i, ..., j], :, ..., :] """ indices = [2, 0, 3] output[0] <-- param[2] output[1] <-- param[0] output[2] <-- param[3] indices = [[1, 2], [2, 3]] output[0, 0] <-- param[1] output[0, 1] <-- param[2] output[1, 0] <-- param[2] output[1, 1] <-- param[3] """
tf.gather_nd
tf.gather_nd( params, indices, name=None, batch_dims=0 ) indices = [[1, 2], [2, 3]] output[0] <-- param[1, 2] output[1] <-- param[2, 3] . # 注意对比与 tf.gather之间的区别 indices = [[[1, 2]], [[2, 3]]] output[0, 0] <-- param[1, 2] output[1, 0] <-- param[2, 3] . # 注意对比与 tf.gather之间的区别
tf.scatter_nd
scatter_nd( indices, updates, shape, name=None ) """ shape: 最终结果的shape updates: 数据源 indices: 数据源相应未知的数据放到结果的什么位置 """ # 文档中废话那么多,可以总结成两个式子 # res[*indice[i,j,..,z], ...] = updates[i,j,..,z,...] # len([i,j,..,z]) = indice.rank-1. [i,j,...,z]表示原始未知。*indice[i,j,..,z] 表示目标位置! # 在这里 rank 表示 几维, a=[1,2,3], a.rank=1, b = [[1,2], [2,3], [3,4]], b.rank=2 """ indices = [ [1, 2, 3], [2, 3, 4] ] 意味着 updates[0] --> res[1, 2, 3] updates[1] --> res[2, 3, 4] indices = [ [[1, 2, 3], [7, 8, 9]], [[2, 3, 4], [9, 10, 11]] ] 意味着: updates[0, 0] --> res[1, 2, 3] updates[0, 1] --> res[7, 8, 9] updates[1, 0] --> res[2, 3, 4] updates[1, 1] --> res[9, 10, 11] """
热门文章
- 「3月31日」最高速度22.3M/S,2025年V2ray/Shadowrocket/Clash/SSR每天更新免费节点订阅地址分享
- 手把手教会将 Windows 窗体桌面应用从.NET Framework迁移到 .NET SDK/.NET 6 格式
- 「3月17日」最高速度21M/S,2025年V2ray/SSR/Clash/Shadowrocket每天更新免费节点订阅地址分享
- EF Core 的 Code First 模式
- 详解css让子盒子水平和垂直居中的几种方法
- 零宽断言正则表达式替换方案
- Quartz高可用定时任务快速上手
- Pytorch单GPU、多GPU训练的几个细节对比
- Springboot之请求映射
- 宠物医院社会实践报告 宠物医院社会实践报告5000字