tensorflow中的shape维度理解和reshape取-1的含义

最近在做练习题的时候看到一个代码:

W_conv1 = weight_variable([5, 5, 1, 32])

这个是CNN中某一层的权重定义,然后就有点懵,所以在网上看了一下相关的帖子

对于shape来说可以定义多维度(二维以上)的张量,所以经常会出现这样的表述

那么这个[5, 5, 1, 32]应该怎么理解呢?

还是从一个简单的例子说起,

import tensorflow as tf
a = tf.constant([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]],shape = [3,3])
b = tf.initialize_all_variables()
 
with tf.Session() as sess:
    sess.run(b)
    print(sess.run(a))

运行结果是

[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]]

我们可以理解为:

shape[3, 3]的第一个“3”表示:“在第一个中括号以内存在3组元素”,

同理,则shape[3, 3]的第二个“3”表示:“在第二个中括号以内存在3组元素”。

由此我们可以知道[5, 5, 1, 32]这个结构首先是一个四维张量

其次在第一个维度中由五个元素组成

第三,这五个元素均是由五个子级元素组成

第四,五个子级元素中只有一个次级元素

最后,一个次级元素中包含了32个子元素

但从字面上理解比较抽象,这需要和神经网络的输入层元素个数进行联想,这里的数字都是每一层都是有特定具体含义的

 

然后说一下reshape中的-1参数

看到的代码如下

x_image = tf.reshape(x, [-1, 28, 28, 1])

其中的-1表示“目前我不确定”,所以在运行的时候程序先考虑后面的28,28和1

最后再看能组成什么样子

Emmmm,就这样!

参考:

https://blog.csdn.net/tkzc_csk/article/details/79332811

https://www.cnblogs.com/wasss/p/5439363.html

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
含义 Multi-Head Self-Attention是一种注意力机制(Attention Mechanism)的实现方式,用于处理序列数据,例如自然语言处理的句子。在Multi-Head Self-Attention,输入序列通过多个不同的注意力头(Attention Head)进行处理,每个头都会计算出不同的注意力分布,最终将这些分布进行加权平均得到最终的输出。这种方法可以捕捉序列不同位置之间的关系,提高序列数据的表现力。 实现 在tensorflow,Multi-Head Self-Attention通常作为Transformer模型的核心部分,由以下几个步骤实现: 1. 首先,使用线性变换将输入序列映射到多个不同的维度空间,得到多个不同的查询(Query)、键(Key)和值(Value)向量。 2. 对于每个注意力头,计算查询向量与键向量之间的点积(Dot-Product Attention),并将得到的值除以一个缩放因子,以避免点积过大或过小的问题。然后,通过softmax函数将得到的分数转换为注意力分布。 3. 将注意力分布与值向量相乘,得到每个头的输出向量。 4. 将多个头的输出向量连接在一起,并通过线性变换得到最终的输出向量。 以下是一个简单的tensorflow实现代码示例: ``` import tensorflow as tf from tensorflow.keras.layers import Layer class MultiHeadAttention(Layer): def __init__(self, num_heads, d_model): super(MultiHeadAttention, self).__init__() self.num_heads = num_heads self.d_model = d_model assert d_model % self.num_heads == 0 self.depth = d_model // self.num_heads self.query_dense = tf.keras.layers.Dense(units=d_model) self.key_dense = tf.keras.layers.Dense(units=d_model) self.value_dense = tf.keras.layers.Dense(units=d_model) self.dense = tf.keras.layers.Dense(units=d_model) def split_heads(self, inputs, batch_size): inputs = tf.reshape(inputs, shape=(batch_size, -1, self.num_heads, self.depth)) return tf.transpose(inputs, perm=[0, 2, 1, 3]) def call(self, inputs): query, key, value = inputs['query'], inputs['key'], inputs['value'] batch_size = tf.shape(query)[0] query = self.query_dense(query) key = self.key_dense(key) value = self.value_dense(value) query = self.split_heads(query, batch_size) key = self.split_heads(key, batch_size) value = self.split_heads(value, batch_size) scaled_attention_logits = tf.matmul(query, key, transpose_b=True) scaled_attention_logits = scaled_attention_logits / tf.math.sqrt(tf.cast(self.depth, tf.float32)) attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1) attention_output = tf.matmul(attention_weights, value) attention_output = tf.transpose(attention_output, perm=[0, 2, 1, 3]) concat_attention = tf.reshape(attention_output, (batch_size, -1, self.d_model)) output = self.dense(concat_attention) return output ``` 在这个实现,我们通过定义一个MultiHeadAttention类来实现Multi-Head Self-Attention。在初始化函数,我们指定了注意力头的数量和注意力向量的维度,然后通过三个线性层来映射输入序列到不同的维度空间。在call函数,我们首先将输入序列分别通过这三个线性层进行变换,然后将它们分割成多个头,并计算出每个头的注意力分布。最后,我们将多个头的输出向量连接在一起,并通过一个线性层得到最终的输出向量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值