tf.concat()的理解和使用

一:原型

concat(values, axis, name=“concat”)。简单理解即将传入的values(若干shape完全一样的N维张量)在指定的维度axis(0<= axis <= N-1)上进行拼接,并返回拼接后的张量。

二:代码分析

1:一维张量

a = tf.constant([1,2])
b = tf.constant([3, 4])
c = tf.concat(values=[a, b], axis=0)
with tf.Session() as sess:
    print(sess.run(c))

如上面代码所示,定义了两个一维张量a和b,axis的可取值此时只能是0,c为拼接后的结果,运行可知,c=[1 2 3 4]。

a = tf.constant([1])
b = tf.constant([2])
c = tf.constant([3])
d = tf.constant([4])
cat = tf.concat(values=[a, b, c, d], axis=0)
with tf.Session() as sess:
    print(sess.run(cat))

同理,以上代码运行后结果为[1 2 3 4]

2:二维张量

对于二维张量而言,axis的可选值包括0和1。

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

cat = tf.concat(values=[a, b], axis=0)
with tf.Session() as sess:
    print(sess.run(cat))

如上代码所示,定义了两个shape为(2, 3)的张量a和b,并在第0维上进行concat操作,运行程序知cat的shape为(4, 3),cat的值为:

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

可知,axis=0时即在第0维,也就是在二维张量的行上进行了concat操作。将axis改为1后。运行程序知cat的shape为(2, 6),值为:

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

可知axis=1时相当于对张量a的列进行了扩展。

3:三维张量

对于三维张量而言,axis的可选值包括0、1、2。

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

cat = tf.concat(values=[a, b], axis=0)
with tf.Session() as sess:
    print(sess.run(cat))

程序中定义了两个shape为(3, 2, 4)的三维张量,并在第0维上进行concat操作,运行程序后,cat的shape为(6, 2, 4),值为:

[[[1 1 1 1]
  [1 1 1 1]]

 [[2 2 2 2]
  [2 2 2 2]]

 [[3 3 3 3]
  [3 3 3 3]]

 [[4 4 4 4]
  [4 4 4 4]]

 [[5 5 5 5]
  [5 5 5 5]]

 [[6 6 6 6]
  [6 6 6 6]]]

对于三维张量A而言,第0维即表示A中含有多少个二维张量B,由以上结果可知,在0维上拼接,相当于把b中所有的二维张量直接添加到a原有的二维张量后面。
将axis改为1,得到的cat的shape为(3, 4, 4),值为

[[[1 1 1 1]
  [1 1 1 1]
  [4 4 4 4]
  [4 4 4 4]]

 [[2 2 2 2]
  [2 2 2 2]
  [5 5 5 5]
  [5 5 5 5]]

 [[3 3 3 3]
  [3 3 3 3]
  [6 6 6 6]
  [6 6 6 6]]]

原有的张量a中有三个二维数组,每个二维数组的shape为(2, 4),在第1维上进行拼接后,cat中每个二维数组的shape为(4, 4),即将b中第i个二维数组拼接到a中第i个二维数组后面,并存于cat的第i个位置。
将axis改为2,cat的shape为(3, 2, 8),值为

[[[1 1 1 1 4 4 4 4]
  [1 1 1 1 4 4 4 4]]

 [[2 2 2 2 5 5 5 5]
  [2 2 2 2 5 5 5 5]]

 [[3 3 3 3 6 6 6 6]
  [3 3 3 3 6 6 6 6]]]

同理,读者可自行理解。

这段代码的功能是将一组文本数据对应的标签转换为适合 BERT 模型输入的格式。以下是逐行解释: ### 1. 函数定义 `encode_data` 函数接受两个参数: - **texts**: 文本列表,每个元素是一个字符串类型的句子。 - **labels**: 标签列表,通常表示分类任务中的类别。 返回值是由字典组成的特征(包含`input_ids`, `attention_mask`),以及通过TensorFlow张量形式存储的标签。 --- ### 2. 初始化变量 ```python input_ids = [] attention_masks = [] ``` 初始化了两个空列表用于分别保存编码后的 token ID 注意力掩码 (Attention Mask)。 --- ### 3. 遍历文本并编码每一句 ```python for text in texts: encoded = tokenizer.encode_plus( text, add_special_tokens=True, # 添加特殊标记 [CLS], [SEP] max_length=maxlen, # 设置最大长度 maxlen pad_to_max_length=True, # 如果句子不足指定长度,则填充至该长度 return_attention_mask=True, # 返回注意力遮罩矩阵 return_tensors='tf' # 返回结果作为 TensorFlow 张量 ) input_ids.append(encoded['input_ids']) # 存储token id序列化结果 attention_masks.append(encoded['attention_mask']) # 存储注意力建模的结果 ``` #### 关键点解析: - **tokenizer.encode_plus()** 使用预训练模型相关的分词器对单个文本进行处理,并生成相应的输入信息: - `add_special_tokens`: 确保每条文本前加上[CLS]开头、结尾添加[SEP]等特定符号; - `max_length`: 控制所有句子的最大截断或补全到固定长度; - `pad_to_max_length`: 当某句话短于设定的最大长度时,在后面补充足够的padding标识符; - `return_attention_mask`: 输出一个与当前句子相对应的位置是否需要忽略的标志向量; - `return_tensors='tf'`: 直接输出 Tensorflow 的 tensor 类型的数据结构而非普通数组或其他形式; --- ### 4. 合并所有样本形成最终输入批次 ```python return { 'input_ids': tf.concat(input_ids, axis=0), # 把所有的 input ids 连接到一起构成批量维度下的新tensor 'attention_mask': tf.concat(attention_masks, axis=0), # 对齐各个 mask 值合并成统一形状的大mask matrix }, tf.convert_to_tensor(labels) # 转换 labels 成tensorflow张量类型以便后续深度学习框架运算兼容性良好 ``` 这一步将之前单独处理过的每一个实例打包在一起作为一个整体传入下游神经网络计算流程里去完成下一步预测等工作负载需求满足情况评估指标优化等方面操作步骤安排规划方案设计构思创意表达观点看法建议意见等内容创作素材参考来源链接引用标注说明注释等等事宜都应该考虑到并且合理组织起来呈现给读者观众用户群体等人观看查阅了解更多信息知识内容详情细节要点重点难点热点焦点话题讨论交流互动分享传播影响力扩大知名度提升品牌形象塑造维护促进合作共赢发展进步成长壮大成熟完善进化革新创新创造发明发现探索求知欲好奇心驱动引领带动激励鼓舞人心振奋士气增强信心决心毅力耐心恒心坚持到底永不放弃勇往直前无惧挑战困难险阻阻碍障碍挫折失败成功胜利喜悦幸福快乐美好未来愿景目标使命责任义务担当奉献牺牲精神品质美德传承延续历史文脉文化传统价值观信仰信念理想追求梦想期望寄托寄予厚望殷切希望深切关怀关爱爱护帮助支持援助扶持提携举荐推荐表扬称赞赞誉肯定认可鼓励鞭策警醒启示教导教育引导启迪智慧灵感思维火花碰撞交融汇集成海纳百川有容乃大兼收并蓄博采众长取长补短共同提高相互借鉴互相学习彼此欣赏尊重包容理解沟通交流融合一体化全球化国际化本土化区域特色优势互补互利共赢共享共建共创美好生活新时代新征程新篇章! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值