Tensorflow2学习--001(基本操作与介绍)
Tensorflow基本操作
tensorflow是如今世界上最流行的开源机器学习框架之一,它可以让我们快速搭建机器学习模型。
Tensorflow基本数据类型
numpy 不支持自动求导 并且不能利用GPU计算
tf.Tensor 类似numpy
什么是tensor
数据 1.1
向量 [1.1]
matrix [[1.1,2.2],[3.3,4.4],[5.5,6.6]]
tensor 基本所有的数据类型
tf is a computing lib
int float double
bool string
常量类型创建
tf.constant(1)
创建一个int类型的tensor 值为1
tf.constant(1.)
创建一个float整型tensor 值为1.0
tf.constant(2.2,dtype = tf.int32)
创建一个int类型的tensor
tf.constant([True,Flase])
创建一个bool类型的tensor 判断默认是bool 不是01
tf.constant('hello,tensor')
创建一个string类型的tensor
tensor的属性和方法:
运用CPU环境创建:
with tf.device("cpu"):
a = tf.constant([1])
运用GPU环境创建:
with tf.device("gpu"):
a = tf.range(3)
不指定会运用默认的设备
1. device 返还一个当前tensor所在的设备
a.device
aa = a.gpu() 转换设备到gpu
bb = b.cpu() 转换到cpu
不同点: 运算方式不一样 必须要在一个设备上运算
若a在cpu b在gpu 会报错
2. .numpy() tensor转为numpy数据类型
3. tf.rank(b)
返还一个rank(等级 维度) 类型为tensor
4. tf.is_tensor(b)
判断是否为tensor
5. tf.convert_to_tensor(sss)
转为tensor类型
6. tf.cast(aa,dtype = tf.float32)
数据转换类型
7. tf.cast(aa,dtype = tf.int32)
将bool转为int
8. tf.Variable(a)
Variable类型
专门对于可以优化的参数
y = wx + b w和b 除了是tensor 还是 Variable类型
tf.Variable(tensor) 又一层的包装
可以让参数具有可求导的特性
Variable.trainable 是否可训练
当一个tensor转为Variable 就会记录梯度信息
创建tensor
1. 将 numpy转为tensor
tf.convert_to_tensor(np.ones([2,3]))
2. tf.zeros_like()
tf.ones_like()
3. tf.ones() [] != [1] 维度不同
tf.zeros()
4. tf.fill([shape],n)
5. tf.random.normal([shape],mean=,stddev=) 正态分布
注意: np.random.normal(平均值列表,方差列表,size) 产生[正态1,正态2,正态3.。。。]
6. tf.random.truncated_normal([shape],mean=,stddev=) 截断的正态分布 避免梯度消失
7. tf.random.uniform([],minval=,maxval=)均匀分布
不同的tensor的应用
[] 标量scalr 一个loss, accuracy
[out_dim] 向量
y = x @ w + b
y是类型假设共10类 x=[4,784] 四张图片 每张784像素点
w 参数 应该为 [784,10] b: [10] 偏置
每个维度都有其含义
使用某些维度 要知道他们都有什么用
tensor索引:
有规律的索引
s[,,,,]
s[-1:] 起始位置-1 -- end
不写的是开头或者末尾
s[:]
: 全部
s[::2] 步长 ::num
s[::-1] 逆序
s[0,...] ...代表省略 自动推断
s[0,...,2] 拿到0图像2通道
无规律的索引
tf.gather() 给一个index 根据自己的index来索引
tf.gather(a,axis=,indices=[]) 给出维度和索引
axis 取值维度(行 或 列) indices 按axis取某一行 列
取不同维度的值
tf.gather_nd(a,[[0,0],[1,0]]) 0的1和1的1
tf.boolean_mask(a,mask=[True,True,True,True])
最外层四个图片都取
tf.boolean_mask(a,mask=[True,True,True,True],axis=0)
axis维度是否选取 mask必须和元素个数对应
a = tf.ones([2,3,4])
tf.boolean_mask(a,mask=[[True,True,True],[True,True,Flase]])
0维度的 [4][4][4]
0维度的 [4][4]
[[4],[4],[4],[4],[4]]
5*4
维度变换:
view 理解方式
[b,28,28] [b,h,w]
[b,28*28] 不考虑行和列信息
[b,2,14*28] 图片分为上下两部分 每部分不考虑行列
[b,28,28,1] 增加channel
tf.reshape(s,[])
-1 全部
视图的转换
shape ndim
tf.reshape
tf.transpose(a,perm=[axis]) 转置
维度展开:
a:[班级,学生,成绩]
学校 = [学校,班级,学生,成绩]
tf.expand_dims(a,axis=)
在axis处增加一个维度
用处:
如增加一个维度
[1,3,1,35]
[1,3,1,35] 可以进行数据的组合
||
[2,3,1,35]
如果 某axis为1 则可以去除该维度 不指定参数 去除所有为1 的维度
tf.squeeze(a,axis=)
Broadcasting(广播机制)
张量维度扩张的手段
并且没有进行复制数据 只是一个手段
tf.broadcase_to() 可以进行显示的维度扩展
(x,new_shape)
维度的自动扩展
[b,10] + [10] = [b,10]

小维度先对其
向大维度进行扩张


广播机制好处:
1.极其便捷
shape [4,32,8] + score [5.0]
= shape [4,32,8] + shape [1]
2.极度节省内存
broadcast_to 和 tile的 区别
tile(x,[2,1,1])
2,1,1 代表 一二三维度分别复制 2 1 1 次

张量运算
1. +-*/ 对应运算加减乘除
2. ** pow square tf.pow(a,3) a**3
3. sqrt
4. // %
5. exp log tf.exp(a) tf.math.log(a) 以e为底
不能实现以别的为底的log 只能logb / loga == logba
6.@ matmul 并行矩阵运算
[b,3,4] @ [b,4,5] = [b,3,5]
tf.matmul(a,b)
7.linear layer
8. reduce_mean/max/min/sum 某个维度下面的计算

浙公网安备 33010602011771号