TensorFlow 数据类型
Contents
Tensorflow中的基本数据类型有数值类型、字符串类型和布尔类型
- 数值类型
var x=Tensorflow.Binding.tf.Variable(10,name:"x");
- 字符串类型
var mammal1=Tensorflow.Binding.tf.Variable("Elephant",name:"var1",dtype:tf.@string)
- 布尔类型
var bo=Tensorflow.Binding.tf.Variable(true)
具体数据类型
public TF_DataType byte8=TF_DataType.TF_UINT8;
public TF_DataType int8=TF_DataType.TF_INT8;
public TF_DataType int16=TF_DataType.TF_INT16;
public TF_DataType int32=TF_DataType.TF_INT32;
public TF_DataType int64=TF_DataType.TF_INT64;
public TF_DataType float16=TF_DataType.TF_HALF;
public TF_DataType float32=TF_DataType.TF_FLOAT;
public TF_DataType float64=TF_DataType.TF_DOUBLE;
public TF_DataType @bool=TF_DataType.TF_BOOL;
public TF_DataType chars=TF_DataType.TF_STRING;
public TF_DataType @string=TF_DataType.TF_STRING;
张量详解
TensorFlow中数据的基本单位为张量(Tensor)。可以使用张量表示标量、向量、矩阵
张量的主要特征为形状、类型和值,通过张量属性sharp,dtype和方法numpy()来获取
类型转换
可以快速对零维张量进行类型转换,通过在变量前加(type)进行强制类型转换
常量与变量
从行为特征来看,有常量constant和变量Variable两种类型的张量
本地文件(图像)读取
可以通过tf.io.read_file()方法从本地读取文件(图像)
基本张量操作
张量是常用的数据结构,可以进行张量的创建、索引和修改等
- tf.cast改变张量的数据类型
var h=tf.constant(new[]{123,456},dtype:tf.int32);
var f=tf.cast(h,tf.float32)
- tf.range创建区间张量值
var b=tf.range(1,10,delta:2);
- tf.zeros/tf.ones创建0值和1值
var zeros=tf.zeros((3,4));
var ones=tf.ones((4,5));
var filled =tf.fill((2,3),6);
- tf.random生成随机分布张量
tf.random.normal用于随机生成正态分布的张量,tf.random.truncated_normal用于随机生成正态分布的张量,并剔除2倍方差意外的数据
var normal1=tf.random.normal((3,4),mean:100,stddev:10.2f);
var normal2=tf.random.truncated_normal((3,4),mean:100,stddev:10.2f);
- 索引切片
可以通过张量索引来读取元素,对于变量,可以通过索引对部分元素进行修改
var t=tf.fill(new[2,3],5);
print(t[-1]);//取最后一行
print(t[1,3]);//取第一行第三列
print(t[1][3]);//取第一行第三列
//根据索引从坐标轴取切片
var gathered=tf.gather(t,tf.constant(2));
//根据条件取x或y值
var filtered=tf.where(tf.constant(new[]{true,true,true,false,false,false}),t,t+1);
//取第一行至最后一行,第0列至最后一列,每隔2列取1列
var s=t[new Slice(1,6),new Slice(0,5,2)];
var s=t[new Slice(1),new Slice(step:2)];
- 张量比较
tf.equal可以比较两个张量是否相同;ToScalar可以获取布尔标量值
维度变换
张量维度变换操作主要是指改变张量的形状,主要方法有tf.resharp,tf.squeeze,tf.expand_dim和tf.transpose
1. tf.resharp改变张量的形状
该操作不会改变张量在内存中的存储顺序。并且速度快,操作可逆
2. tf.squeeze维度压缩简化
可以消除张量中的单个元素的维度。该操作不会改变张量在内存中的存储顺序
3. tf.expand_dims增加维度
往指定的维度中插入长度为1的维度
var a=tf.constant(new[,]{{1,2,3},{4,5,6}});
//往0维中插入长度为1的维度
var b=tf.expand_dims(a,0);
- tf.tramspose维度交换
他会改变张量在内存中的存储顺序
合并分割
合并有两种方式:tf.concat可以连接不通的张量,在同一设定的维度进行,不会增加维度;tf.stack采用维度堆叠的方式,会增加维度
1. tf.concat
var a=tf.constant(new[,]{{1,2},{3,4}});
var b=tf.constant(new[,]{{5,6},{7,8}});
var c=tf.constant(new[,]{{9,10},{11,12}});
var concatValue1=tf.concat(new[]{a,b,c},axis:0);
var concatValue2=tf.concat(new[]{a,b,c},axis:-1);
- tf.stack
tf.stack在指定的维度上创建了新的维度,并将输入张量在新维度上进行堆叠操作 -
tf.split
可以将张量根据维数分割
广播机制(自动扩展机制) Broadcasting
广播是一种十分轻量的张量复制操作,只会在逻辑上扩展张量的形状,而不会直接执行实际存储I/0的赋值操作。经过广播后的张量在视图上会体现出复制后的形状。
广播机制和tf.tile复制数据的最终实现效果相同,但是广播机制节省大量的计算资源并自动优化了运算速度。
但是广播机制并不是任何场合都适用
1. 如果张量的维度不同,则对维度较小的张量左侧补齐进行扩展,知道两个张量的维度相同
2. 如果两个张量在某个维度上的长度是相同的,或者其中一个张量在该维度上的长度为1,则我们说这两个张量在该维度上是相容的
3. 如果两个张量在所有维度上或通过上述(1)的过程扩展后都是相容的,则他们能使用广播机制
4. 广播之后,每个维度的长度取两个张量在该维度长度上的较大值
5. 在任何一个维度上,如果一个张量的长度为1,另一个张量的长度大于1,那么在该维度上,就好像对每一个张量进行了复制。
不可广播的情形,同样是上面这个例子,如果张量B的形状[w,2],同时张量A的形状为[b,h,w,c],其中c \neq 2,这这两个张量不符合普适性原则,无法应用广播机制
广播机制实现的两种方式
1. 隐式自动调用
在进行不同形状的张量运算时,隐式地自动调用广播机制,如用“+、-、*、/”等运算
2. 显示广播方法
使用tf.broadcast_to显示地调用广播方法,将指定的张量广播至指定的形状。
var a1=tf.cnstant(new int[]{1,2,3});
var b1=tf.constant(new int[,]{{0,0,0},{1,1,1},{2,2,2}});
var c1=tf.broadcast_to(a1,b1.shape);
Filed under: TensorFlow,人工智能,编程 - @ 2023年4月15日 下午2:01