Tensorflow 变换汇总

                              Tensorflow tensor变换汇总

1. tf.concat([t1, t2], dim) 仅限于矩阵t1,t2维度需大于1

2. tf.expand_dims(input, axis=None, name=None, dim=None)

功能:在输入形状的维度索引(axis)轴处插入1的尺寸。 尺寸索引轴从零开始; 如果您指定轴的负数,则从最后向后计数。如果要将批量维度添加到单个元素,则此操作非常有用。 例如,如果您有一个单一的形状[height,width,channels],您可以使用expand_dims(image,0)使其成为1个图像,这将使形状[1,高度,宽度,通道]。

For example:

# 't' is a tensor of shape [2]
shape(expand_dims(t, 0)) ==> [1, 2]
shape(expand_dims(t, 1)) ==> [2, 1]
shape(expand_dims(t, -1)) ==> [2, 1]
# 't2' is a tensor of shape [2, 3, 5]
shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]

3.tf.squeeze(input, squeeze_dims=None, name=None)

功能:给定张量输入,此操作返回相同类型的张量,并删除所有尺寸为1的尺寸。 如果不想删除所有尺寸1尺寸,可以通过指定squeeze_dims来删除特定维度为1尺寸。
# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
shape(squeeze(t)) ==> [2, 3]
Or, to remove specific size 1 dimensions:

# 't' is a tensor of shape [1, 2, 1, 3, 1, 1]
shape(squeeze(t, [2, 4])) ==> [1, 2, 3, 1]

tf.expand_dims与tf.squeeze合起来:

import tensorflow as tf

w = tf.Variable(tf.truncated_normal([2, 3], stddev=0.1, dtype=tf.float32), dtype=tf.float32,name="w")
expend_w = tf.expand_dims(w, 0)
squeeze_w = tf.squeeze(expend_w, 0)
init = tf.global_variables_initializer()
with tf.Session() as session:
    session.run(init)
    print(session.run(tf.shape(expend_w)))#[1 2 3]
    print(session.run(tf.shape(squeeze_w)))#[2 3]

4.tf.stack( values,axis,name) 与 tf.unstack( values,axis,name) 

功能:将两个数组按照指定的方向进行叠加,生成一个新的数组。 
参数axis:当其取0时表示按照x轴方向进行叠加,当其取1时表示按照y轴进行叠加。 

例子:

import tensorflow as tf

a=tf.constant([1,2,3])
b=tf.constant([4,5,6])

c=tf.stack([a,b],axis=0)  #将数组a与数组b按照x轴方向进行叠加
d=tf.stack([a,b],axis=1)  #将数组a与数组b按照y轴方向进行叠加

e=tf.unstack(c,axis=0)    #将数组c按照x轴方向进行拆分
f=tf.unstack(d,axis=1)    #将数组d按照y轴方向进行拆分

with tf.Session() as sess:
    print(sess.run(c))#[[1 2 3],[4 5 6]]
    print(sess.run(d))#[[1 4],[2 5], [3 6]]
    print(sess.run(e))#[array([1, 2, 3]), array([4, 5, 6])]
    print(sess.run(f))#[array([1, 2, 3]), array([4, 5, 6])]

5.def pad(tensor, paddings, mode="CONSTANT/REFLECT/SYMMETRIC", name=None)

# 't' is [[1, 2, 3], [4, 5, 6]].
# 'paddings' is [[1, 1,], [2, 2]].
# 'constant_values' is 0.
# rank of 't' is 2.
pad(t, paddings, "CONSTANT") ==>
 [[0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 2, 3, 0, 0],
 [0, 0, 4, 5, 6, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]]
pad(t, paddings, "REFLECT") ==> [[6, 5, 4, 5, 6, 5, 4],
[3, 2, 1, 2, 3, 2, 1],
[6, 5, 4, 5, 6, 5, 4],
[3, 2, 1, 2, 3, 2, 1]]
pad(t, paddings, "SYMMETRIC") ==> [[2, 1, 1, 2, 3, 3, 2],
  [2, 1, 1, 2, 3, 3, 2],
  [5, 4, 4, 5, 6, 6, 5],
  [5, 4, 4, 5, 6, 6, 5]]
  
tf.pad的使用,第一个是填充0,后面两个是复制前几行或者列
[1,1],[2,2]
[1,1]指的是向上扩充一行,向下扩充一行
[2,2]指的是向左扩充2列,向右扩充2列
1.CONSTANT模式,按上下左右填充几行或者几列的0,paddings=[[1,1],[2,2]]的意思是向上填充一行0,向下填充一行0,向左填充二行0,向右填充两行0
2.REFLECT模式,首先要定好边缘(可理解为对称轴),按边缘翻(边缘不复制)
3.SYMMETRIC类似的,唯一的区别是把边缘(也就是对称轴)也复制了,从对称轴开始复制
例:
import tensorflow as tf
w = tf.truncated_normal([1,2,3,1], stddev=0.1, dtype=tf.float32)
with tf.Session() as sess:
    print(sess.run(tf.shape(tf.pad(w,[[0, 0], [3, 3], [3, 3], [0, 0]]))))#[1 8 9 1]


### DGCNN 实现概述 DGCNN(Dynamic Graph Convolutional Neural Network)是一种用于处理图数据的强大模型,在点云分类、分割等领域表现出色。为了在 TensorFlow 中实现 DGCNN,需遵循特定的架构设计原则并利用 TensorFlow 提供的相关 API。 #### 构建计算图 创建 DGCNN 计算图涉及定义输入层、边缘特征提取模块、池化操作以及全连接层等组件。具体来说: - **输入准备**:将原始点云转换成适合网络处理的形式。 - **局部邻域构建**:对于每一个点,找到其 k 个最近邻居来形成局部结构[^1]。 - **边特征学习**:基于每一对节点之间的相对位置关系构造边特征向量,并通过共享权重矩阵对其进行变换[^3]。 - **最大池化聚合**:应用 max-pooling 来汇总来自不同尺度下的信息[^4]。 ```python import tensorflow as tf from tensorflow.keras import layers def knn(x, k): """Calculate pairwise distance and get k nearest neighbors.""" inner = -2 * tf.matmul(x, x, transpose_b=True) xx = tf.reduce_sum(tf.square(x), axis=1, keepdims=True) pairwise_distance = -xx - inner - tf.transpose(xx) neg_knn_idx = tf.nn.top_k(-pairwise_distance, k=k)[1] return neg_knn_idx class EdgeConv(layers.Layer): def __init__(self, out_channels, k=20, **kwargs): super().__init__(**kwargs) self.k = k self.conv = layers.Conv2D(out_channels, kernel_size=(1, 1)) def call(self, inputs): batch_size = tf.shape(inputs)[0] num_points = tf.shape(inputs)[1] idx = knn(inputs[:, :, :3], self.k) # Use only spatial coordinates for KNN grouped_xyz = group_point( inputs[:, :, :3], idx, use_xyz=False ) xyz_expanded = tf.tile(tf.expand_dims(inputs[:, :, :3], axis=-2), multiples=[1, 1, self.k, 1]) new_features = tf.concat([xyz_expanded, grouped_xyz], axis=-1) output = self.conv(new_features) return output def dgcnn_model(input_shape, num_classes): input_layer = layers.Input(shape=input_shape) edge_conv_1 = EdgeConv(64)(input_layer) pool_1 = layers.GlobalMaxPooling1D()(edge_conv_1) edge_conv_2 = EdgeConv(64)(pool_1) pool_2 = layers.GlobalMaxPooling1D()(edge_conv_2) concat = tf.concat([pool_1, pool_2], axis=-1) dense_1 = layers.Dense(512, activation='relu')(concat) dropout_1 = layers.Dropout(0.5)(dense_1) dense_2 = layers.Dense(256, activation='relu')(dropout_1) dropout_2 = layers.Dropout(0.5)(dense_2) logits = layers.Dense(num_classes)(dropout_2) model = tf.keras.Model(inputs=input_layer, outputs=logits) return model ``` 此代码片段展示了如何使用 TensorFlow 和 Keras 定义一个简单的 DGCNN 模型框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值