当前位置:网站首页>tensorflow 基础操作1(tensor 基本属性 , 维度变换,数学运算)
tensorflow 基础操作1(tensor 基本属性 , 维度变换,数学运算)
2022-08-11 08:12:00 【自然color】
目录
1.2.4 直接新建tensor 小括号里各种参数形式对应的典型应用
1.3.1 直接给出每个维度的索引号,多个中括号,取单一元素
1.3.2 numpy-style indexing(推荐)
1.3.5 start: end : step ::step 隔着取
2.1 reshape 改变view 只改变数据理解方式 不改变内容
1.tensorflow 数据类型
list
np.array
tf.Tensor: 支持自动求导 方便深度学习(一般指rank>2 )
TF 包括的数据类型: int float double bool string
1.1 tensor 属性,数据转换
a.device 查看目标在哪个设备上(cpu/gpu)
aa=a.gpu() 把cpu上的a 转换到gpu上的aa 操作符往往根据参数自动选择
b.numpy() 把tensor b 转换成 numpy numpy类型一定在cpu上
b.ndim 或者 tf.rank(b) 判断维度
b.shape 返回形状
isinstance(a,tf.tensor)不推荐 or tf.is_tensor(a) 判断数据类型是不是tensor
a.dtype==float32 判断数据类型
aa=tf.convert_to_tensor(a,dtype=tf.int32) 转换成tensor 默认64位需要手动定义成32位
tf.cast(aa,dtype=tf.float32) tf数据转换
bb=tf.cast(b,dtype=tf.bool)
b=tf.Variable(a,name='input_data') b.trainable (可优化的量,自动记录梯度信息)
int(tensor) tensor是一个标量的话 可以直接转化成numpy数据
1.2 创建tensor
1.2.1 tf.convert_to_tensor()
tf.convert_to_tensor(np.ones([2,3])) # 默认float64 [2,3]被视为data
tf.convert_to_tensor(np.zeros([2,3])) # 默认float64
tf.convert_to_tensor([1,2])# 默认int32
tf.convert_to_tensor([1,2.])# 默认float64
tf.convert_to_tensor([[1],[2.]])# 默认float32
1.2.2 直接新建
tf.zeros([1,2]) #[1,2]指shape float32
tf.zeros_like(a) #shape 与 a 一样
tf.ones()
tf.fill([2,2],9) # 元素全部填充为9
1.2.3随机化初始化(均匀分布、正态分布)
正态分布 tf.random.normal([2,2],mean=1,stddev=1)
截断正态分布 tf.random.truncated_normal([2,2],mean=1,stddev=1)
均匀分布 tf.random.uniform()
随机打散, 照片与索引一一对应
tf.constant()
1.2.4 直接新建tensor 小括号里各种参数形式对应的典型应用
(1)[]: loss,accuracy 都是标量
(2)[out_dim] 向量 Bias 线性回归的b
(3)矩阵 [b,vec_dim] 线性回归的w
(4)dim=3的tensor 自然语言处理的把一段话每个句子的单词转换为长度为5的向量
维度: 句子数目 每句含单词数目 每个单词长度 三维
(5)dim=4 tensor 图片保存 [b,h,w,c] 例如RGB格式一张图片 [1,h,w,3]
(6)dim=5 tensor meta-learning 多一个维度:任务数量
1.3 索引
1.3.1 直接给出每个维度的索引号,多个中括号,取单一元素
1.3.2 numpy-style indexing(推荐)
1.3.3 start:end 带冒号返回向量
1.3.4 冒号方式 任意维度可以省略数字
1.3.5 start: end : step ::step 隔着取
1.3.6 : :-1
1.3.7 ...省略号 省略的维度全取
a[0,...,2,:] 必须逻辑上可以推断出 省略号所指的维度
1.4 切片
1.4.1 tf.gather
假设 4个班级,每班35人,每人8门课
1.4.2 gather 联合使用
1.4.3 多个维度
最后一个双括号 代表取出的标量成绩被升维,变成只有一个元素的一维数组
下面第四行 实现取:第一个班级第一个学生第一门课成绩,第二个班级第二个学生第二门课成绩,第三个班级第三个学生第三门课成绩
1.4.4 tf.boolean_mask
2 维度变换
2.1 reshape 改变view 只改变数据理解方式 不改变内容
一个新的shape 只能有一个 -1
reshape 提供很多种可能 但物理意义需要自己明确
2.2 tf.transpose 转置 改变content
2.3 增加减少维度
2.3.1 tf.expand_dims
给正数会在数值所指的轴前面增加 给负数会在数值所指的轴后面增加一个轴
2.3.2 减少维度
指定轴 或者默认去除所有维度=1 的轴
2.4 Broadcasting
不复制数据,呈现数据扩张效果
1,简洁 2.省内存
小维度对齐 其他维度是1的可以自动扩张 其他的不行
tf.broadcasting_to
3 数学运算
3.1 +-*/ // %
3.2 tf.math.log tf.exp
对数换底 实现 log2,log10等
3.3 @ matmul 矩阵相乘
前面一维并行 后面两维当成矩阵
with broadcasting
4 实战 前向传播 张量
import tensorflow as tf
from tensorflow import keras
from keras import datasets
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
(x, y), _ = datasets.mnist.load_data()
# x:[0-255]=>[0-1.]
x = tf.convert_to_tensor(x, dtype=tf.float32)/255.
y = tf.convert_to_tensor(y, dtype=tf.int32)
# print(x.shape, y.shape, x.dtype, y.dtype)
# print(tf.reduce_min(x), tf.reduce_max(x))
# print(tf.reduce_min(y), tf.reduce_max(y))
train_db = tf.data.Dataset.from_tensor_slices((x, y)).batch(128)
train_iter = iter(train_db)
sample = next(train_iter)
print("batch:", sample[0].shape, sample[1].shape)
# [b,784]-[b,512]-[b,128]-[b,10]
#[dim_in, din_out],[dim_out]
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))
lr = 1e-3
for epoch in range(10):
for step, (x, y) in enumerate(train_db):
# x:[128,28,28]
# y:[128]
x = tf.reshape(x, [-1, 28*28])
with tf.GradientTape() as tape: # 默认跟踪tf.Variable
# x:[b,28*28]
# [email protected] + b1
# [b,784]@[784,256]+[256]---[b,256]+[256]
h1 = [email protected] + tf.broadcast_to(b1, [x.shape[0], 256])
h1 = tf.nn.relu(h1)
h2 = [email protected] + b2
h2 = tf.nn.relu(h2)
out = [email protected] + b3
# compute loss
# out[b,10]
# y:[b]
y_onehot = tf.one_hot(y, depth=10)
# mse = mean(sum(y-out)^2)
loss = tf.square(y_onehot-out)
loss = tf.reduce_mean(loss)
grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])
w1.assign_sub(lr * grads[0]) # 原地更新
b1.assign_sub(lr * grads[1])
w2.assign_sub(lr * grads[2])
b2.assign_sub(lr * grads[3])
w3.assign_sub(lr * grads[4])
b3.assign_sub(lr * grads[5])
if step % 100 ==0:
print(epoch, step, 'loss:', float(loss))
边栏推荐
猜你喜欢
随机推荐
3.1-Classification-probabilistic generative model
通过记账,了解当月收支情况
Nuget找不到包的问题处理
Kotlin算法入门计算质因数
2.1-梯度下降
1071 Small Gamble (15 points)
Kotlin算法入门求回文数算法优化一
pyqt5实现仪表盘
一根网线两台电脑传输文件
1056 Sum of Combinations (15 points)
Evolution and New Choice of Streaming Structured Data Computing Language
你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
Openlayers 聚合图、权重聚合图以及聚合图点击事件
go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...
为什么会没有内存了呢
2022 China Soft Drink Market Insights
Distributed Lock-Redission - Cache Consistency Solution
对比学习系列(三)-----SimCLR
AUTOSAR从入门到精通番外篇(八)-C语言常用技巧50个
C语言-结构体