TensorFlow2.4(三)---- 张量的操作(数据处理_维度变换、数据取样,以鸢尾花数据为例)_适合python机器学习的最全最细讲解

目录

前言

函数表

维度变换

tf.reshape()

 tf.concat()、tf.contrack() 

tf.expand_dims() 和 tf.squeeze()

tf.transpose()

数据取样(特定行列的选取)

与numpy的取法

 gather()

鸢尾花数据链接


前言

这一篇文章主要分两部分讲解张量之间的数据处理,第一部分主要是张量的维度变换,包括张量形状的改变、维度的增加和删除、转置以及张量的拼接;第二部分是数据的采样,主要以鸢尾花数据为例讲解特定行、列的选取


函数表

将全文讲解过的函数归纳于此表,便于参考和查询

形状处理部分 解释
tf.reshape(tensor,shape) 改变形状
tf.concat(tensors,axis) 张量拼接
tf.expand_dims(input,axis) 增加维度
tf.squeeze(input,axis) 删除维度
tf.transpose(a,perm) 转置
数据取样(张量以tf1为例) 解释
tf.gather(params,axis,indices) 按索引值取值

维度变换

在讲解函数之前,为了更好的理解“维”这个概念,这里有必要做出个人对TensorFlow中的“维”的看法,首先这个维度最初的定义是为了咱们更好地去理解数据间的各种排列组合而人为定义的,比如我们习惯说的零维数据就是一个点,一维数据就是一条线,二维数据就是一个面,三维便是一个体;每多一个维度,数据就会多向着某个方向展开;而张量中也谈及维度的概念,我们说三维张量其实就是三维数组的意思,但是有时候也会习惯性将数据的行数和列数称之为“维”,比如三行两列的二维张量,其在行上面(从上往下看)就有三个维(三行),显然依次类推,在列上面(左右看)就有两个维(两列);其实也是一种叫法的不统一,大家在理解这些概念的时候就见仁见智了。

  • tf.reshape()

tf.reshape(tensor,shape);第一个参数tensor是传入的张量,第二个参数shape是将张量重组成需要的形状。对于shape这个参数,作者略微提及几点:1、形状改变后,数据填入新形状的顺序是按照“从左至右、从上至下”的顺序从原张量中取出数据然后按照这个原则将数据填入新张量;2、新张量形状维度参数的乘积必须等于原数据维度参数的乘积,比如一个4X4的二维张量,其两个维度参数的乘积是16,那么新张量的维度参数的乘积必须也是16,比如这组数据可以填入一个2X2X4的三维张量

  • 将 1X16 的张量形状改变成 2X8
import tensorflow as tf
tf1 = tf.range(16) # 创建从0到15的张量
tf2 = tf.reshape(tf1,[2,8]) # 将其改变成一个 2 X 8 的二维数组,数据排序规则是从左往右,排满之后从上向下排

output:

>>>print(tf1)
tf.Tensor([ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15], shape=(16,), dtype=int32)
>>>print(tf2)
tf.Tensor(
[[ 0  1  2  3  4  5  6  7]
 [ 8  9 1
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将文本数据转换成BERT模型的input-segment形式需要以下步骤: 1. 分词:使用BERT的预训练tokenizer对文本进行分词,将每个单词转换成对应的ID。 2. 添加特殊标记:在文本的开头和结尾添加[CLS]和[SEP]标记。[CLS]表示该文本是一个分类问题,[SEP]用来分隔不同的句子。 3. 构建input-id和input-mask:将文本转换成对应的ID序列后,需要将其填充到固定长度。对于长度不足的文本,可以使用[PAD]标记进行填充。同时,需要构建一个mask矩阵,用于标记哪些元素是真实输入,哪些是填充元素。 4. 构建segment-id:BERT模型支持两个句子的输入,因此需要为每个单词标注所属的句子。对于只有一个句子的文本,将所有单词标注为同一个句子即可。 下面是一个示例代码,可以将文本数据转换成BERT模型的input-segment形式: ```python import tensorflow as tf from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") # 假设有一组文本数据 texts = ["这是第一句话", "这是第二句话"] # 分词 tokenized_texts = [tokenizer.tokenize(text) for text in texts] # 添加特殊标记 tokenized_texts = [['[CLS]'] + tokens + ['[SEP]'] for tokens in tokenized_texts] # 构建input-id和input-mask input_ids = [tokenizer.convert_tokens_to_ids(tokens) for tokens in tokenized_texts] input_ids = tf.keras.preprocessing.sequence.pad_sequences(input_ids, maxlen=32, padding='post', truncating='post', value=0) input_mask = [[int(token_id > 0) for token_id in input_sequence] for input_sequence in input_ids] # 构建segment-id segment_ids = [[0] * len(input_sequence) for input_sequence in input_ids] # 将数据转换为TensorFlow张量 input_ids = tf.constant(input_ids) input_mask = tf.constant(input_mask) segment_ids = tf.constant(segment_ids) # 打印结果 print("input_ids:", input_ids) print("input_mask:", input_mask) print("segment_ids:", segment_ids) ``` 输出结果如下: ``` input_ids: tf.Tensor( [[ 101 6821 3221 671 671 678 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 101 6821 3221 671 671 1391 102 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]], shape=(2, 32), dtype=int32) input_mask: tf.Tensor( [[1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]], shape=(2, 32), dtype=int32) segment_ids: tf.Tensor( [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]], shape=(2, 32), dtype=int32) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值