torch.unsqueeze() view() permute() transpose()

torch.unsqueeze

torch.unsqueeze(input, dim, out=None)
返回一个新的张量,对输入的指定位置增加一个维度
例子:https://blog.csdn.net/xiexu911/article/details/80820028
torch.squeeze(input, dim, out=None)
就是在指定维度压缩一个维度

注意: 返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。
如果dim为负,则将会被转化dim+input.dim()+1
参数:
tensor (Tensor) – 输入张量
dim (int) – 插入维度的索引
out (Tensor, optional) – 结果张量

view(*args) → Tensor

返回一个有相同数据但大小不同的tensor。 返回的tensor必须有与原tensor相同的数据和相同数目的元素,但可以有不同的大小。一个tensor必须是连续的contiguous()才能被查看。

permute(dims)

将tensor的维度换位。
参数: - dims (int…*)-换位顺序

torch.transpose(dim0,dim1)—>Tensor

dim0 和 dim1 交换位置,转置
只能操作2D矩阵的转置
有2种调用方式

以下是使用tensorflow的layers.Layer模块改写的代码: ``` import tensorflow as tf class SelfAttention(tf.keras.layers.Layer): def __init__(self, in_c, out_c, fm_sz, pos_bias=False): super(SelfAttention, self).__init__() self.w_q = tf.keras.layers.Conv2D(filters=out_c, kernel_size=1, input_shape=[None, None, in_c]) self.w_k = tf.keras.layers.Conv2D(filters=out_c, kernel_size=1, input_shape=[None, None, in_c]) self.w_v = tf.keras.layers.Conv2D(filters=out_c, kernel_size=1, input_shape=[None, None, in_c]) self.pos_code = self.__getPosCode(fm_sz, out_c) self.softmax = tf.keras.layers.Softmax(axis=2) self.pos_bias = pos_bias def __getPosCode(self, fm_sz, out_c): x = [] for i in range(fm_sz): x.append([np.sin, np.cos][i % 2](1 / (10000 ** (i // 2 / fm_sz)))) x = np.array([x], dtype=np.float32) return tf.concat([(x + tf.transpose(x)).unsqueeze(0) for i in range(out_c)], axis=0) def call(self, x): q, k, v = self.w_q(x), self.w_k(x), self.w_v(x) pos_code = tf.concat([self.pos_code[None, ...] for i in range(tf.shape(x)[0])], axis=0) if self.pos_bias: att_map = tf.matmul(q, tf.transpose(k, perm=[0, 1, 3, 2])) + pos_code else: att_map = tf.matmul(q, tf.transpose(k, perm=[0, 1, 3, 2])) + tf.matmul(q, tf.transpose(pos_code, perm=[0, 1, 3, 2])) am_shape = tf.shape(att_map) att_map = self.softmax(tf.reshape(att_map, [am_shape[0], am_shape[1], am_shape[2] * am_shape[3]])) att_map = tf.reshape(att_map, am_shape) return att_map * v ``` 需要注意的是,tensorflow中没有nn.Module这个概念,而是使用tf.keras.layers.Layer作为基类。因此,我们需要在类定义中加入`tf.keras.layers.Layer`,并对一些函数名称进行修改。此外,tensorflow默认使用NHWC格式的数据,因此在调用transpose函数时需要加上perm参数进行转置,以保证维度的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值