当前位置:网站首页>tensorflow 基础操作1(tensor 基本属性 , 维度变换,数学运算)

tensorflow 基础操作1(tensor 基本属性 , 维度变换,数学运算)

2022-08-11 08:12:00 自然color

目录

1.tensorflow 数据类型

1.1 tensor 属性,数据转换

1.2 创建tensor

1.2.1 tf.convert_to_tensor()

1.2.2 直接新建

1.2.3随机化初始化(均匀分布、正态分布)

1.2.4 直接新建tensor 小括号里各种参数形式对应的典型应用

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 ...省略号    省略的维度全取

1.4 切片

1.4.1 tf.gather

 1.4.2 gather  联合使用

1.4.3 多个维度

1.4.4 tf.boolean_mask

2 维度变换

2.1 reshape 改变view  只改变数据理解方式 不改变内容

 2.2 tf.transpose 转置 改变content

 2.3 增加减少维度   

2.3.1 tf.expand_dims

 2.3.2 减少维度

 2.4 Broadcasting

3 数学运算

3.1  +-*/ // %

3.2   tf.math.log        tf.exp

3.3 @   matmul   矩阵相乘

4 实战 前向传播 张量


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))

原网站

版权声明
本文为[自然color]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_46955575/article/details/126215502