tensorflow学习笔记--tf.strided_slice

本文详细介绍了TensorFlow中strided_slice函数的使用方法,包括如何通过设置start、end和strides参数来实现对多维张量的有效切片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 链接:https://www.tensorflow.org/api_docs/python/tf/strided_slice

  • 说明:对传入的tensor执行切片操作,返回切片后的tensor。主要参数input_, start, end, stridesstrides代表切片步长。

  • 例子:

    1. # 'input' is [[[1, 1, 1], [2, 2, 2]],
    2. # [[3, 3, 3], [4, 4, 4]],
    3. # [[5, 5, 5], [6, 6, 6]]]
    4. tf.strided_slice(input, [ 1, 0, 0], [ 2, 1, 3], [ 1, 1, 1]) ==> [[[ 3, 3, 3]]]
    5. # 上面一行代码中[1,0,0]分别代表原数组三个维度的切片起始位置,[2,1,3]代表结束位置。
    6. [ 1, 1, 1]代表切片步长,表示在三个维度上切片步长都为 1。我们的原始输入数据为 3 x 2 x 3
    7. 通过参数我们可以得到,第一个维度上切片start= 1,end= 2
    8. 第二个维度start= 0, end= 1,第三个维度start= 0, end= 3
    9. 我们从里面的维度来看,原始数据的第三个维度有三个元素,切片操作start= 0,end= 3,stride= 1,代表第三个维度上的元素我们全部保留。
    10. 同理,在第二个维度上,start= 0, end= 1, stride= 1,代表第二个维度上只保留第一个切片,这样我们就只剩下[[[ 1, 1, 1]],[[ 3, 3, 3]],[[ 5, 5, 5]]]。
    11. 接着我们看第一个维度,start= 1, end= 2, stride= 1代表只取第二个切片,因此得到[[[ 3, 3, 3]]。以下两个例子同理。
    12. tf.strided_slice(input, [ 1, 0, 0], [ 2, 2, 3], [ 1, 1, 1]) ==> [[[ 3, 3, 3],
    13. [ 4, 4, 4]]]
    14. tf.strided_slice(input, [ 1, -1, 0], [ 2, -3, 3], [ 1, -1, 1]) ==>[[[ 4, 4, 4],
    15. [ 3, 3, 3]]]
    参考链接:https://github.com/NELSONZHAO/zhihu/tree/master/basic_seq2seq?1521452873816
  • 注意:如何看numpy数组的维度:以input数组为例,input维度是(3,2,3),即第一维有3个元素,第2维有2个元素,第3维有3个元素。技巧:第一维是看第一个方括号里包了几个元素,第二维是看第二个方括号里包了几个元素。。。。以此类推。
将其中的缓存机制去掉,代码变成了 class MLA(layers.Layer): def __init__(self, args: ModelArgs): super().__init__() self.dim = args.dim self.n_heads = args.n_heads self.q_lora_rank = args.q_lora_rank self.kv_lora_rank = args.kv_lora_rank self.qk_nope_head_dim = args.qk_nope_head_dim self.qk_rope_head_dim = args.qk_rope_head_dim self.qk_head_dim = args.qk_nope_head_dim + args.qk_rope_head_dim self.v_head_dim = args.v_head_dim # 初始化投影层 if self.q_lora_rank == 0: self.wq = layers.Dense(self.n_heads * self.qk_head_dim) else: self.wq_a = layers.Dense(self.q_lora_rank) self.q_norm = RMSNorm(self.q_lora_rank) self.wq_b = layers.Dense(self.n_heads * self.qk_head_dim) self.wkv_a = layers.Dense(self.kv_lora_rank + self.qk_rope_head_dim) self.kv_norm = RMSNorm(self.kv_lora_rank) self.wkv_b = layers.Dense(self.n_heads * (self.qk_nope_head_dim + self.v_head_dim)) self.wo = layers.Dense(self.dim) self.softmax_scale = self.qk_head_dim ** -0.5 if args.max_seq_len > args.original_seq_len: mscale = 0.1 * args.mscale * math.log(args.rope_factor) + 1.0 self.softmax_scale *= mscale * mscale def call(self, x, start_pos, freqs_cis, mask=None): bsz = tf.shape(x)[0] seqlen = tf.shape(x)[1] end_pos = start_pos + seqlen # 查询投影 if self.q_lora_rank == 0: q = self.wq(x) else: q = self.wq_b(self.q_norm(self.wq_a(x))) q = tf.reshape(q, [bsz, seqlen, self.n_heads, self.qk_head_dim]) q_nope, q_pe = tf.split(q, [self.qk_nope_head_dim, self.qk_rope_head_dim], axis=-1) q_pe = apply_rotary_emb(q_pe, freqs_cis) # 键值投影 kv = self.wkv_a(x) kv, k_pe = tf.split(kv, [self.kv_lora_rank, self.qk_rope_head_dim], axis=-1) k_pe = apply_rotary_emb(tf.expand_dims(k_pe, 2), freqs_cis) kv = self.wkv_b(self.kv_norm(kv)) kv = tf.reshape(kv, [bsz, seqlen, self.n_heads, self.qk_nope_head_dim + self.v_head_dim]) k_nope, v = tf.split(kv, [self.qk_nope_head_dim, self.v_head_dim], axis=-1) k = tf.concat([k_nope, tf.tile(k_pe, [1, 1, self.n_heads, 1])], axis=-1) # 注意力计算 q = tf.concat([q_nope, q_pe], axis=-1) scores = tf.einsum("bqhd,bkhd->bhqk", q, k) * self.softmax_scale # 维度调整为qk交互 print(scores.shape) # 此处为(2, 16, 128, 128) if mask is not None: print(mask.shape) # 此处为(128, 128) scores += mask[:, None, :, :] scores += mask[None, None, :, :] scores = tf.nn.softmax(scores, axis=-1) x = tf.einsum("bhqk,bkhd->bqhd", scores, v) # 维度调整 return self.wo(tf.reshape(x, [bsz, seqlen, -1])) 存在以下问题025-03-12 17:01:42.362209: W tensorflow/core/framework/op_kernel.cc:1830] OP_REQUIRES failed at strided_slice_op.cc:111 : INVALID_ARGUMENT: Index out of range using input dim 2; input has only 2 dims File "E:\算法模型\DeepSeek-V3-main\inference\model_tf.py", line 248, in call x = x + self.attn(self.attn_norm(x), start_pos, freqs_cis, mask) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\算法模型\DeepSeek-V3-main\inference\model_tf.py", line 159, in call scores += mask[:, None, :, :] ~~~~^^^^^^^^^^^^^^^ tensorflow.python.framework.errors_impl.InvalidArgumentError: Exception encountered when calling layer 'mla' (type MLA). {{function_node __wrapped__StridedSlice_device_/job:localhost/replica:0/task:0/device:CPU:0}} Index out of range using input dim 2; input has only 2 dims [Op:StridedSlice] name: transformer/block/mla/strided_slice/ Call arguments received by layer 'mla' (type MLA): • x=tf.Tensor(shape=(2, 128, 10), dtype=float32) • start_pos=0 • freqs_cis=tf.Tensor(shape=(128, 32), dtype=float32) • mask=tf.Tensor(shape=(128, 128), dtype=float32)
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值