TensorFlow2基础-Tensor性质

【TensorFlow2.0】(1) tensor数据类型,类型转换 各位同学好,今天和大家分享一下TensorFlow2.0中的tensor数据类型,以及各种类型之间的相互转换方法。 1. tf.tensor 基础操作 scaler标量:1.2 vector向量:[1.2]、[1.1,2.2,3.3] 注意:此处的[1.2]是一维的,而1.2是0维的 matrix矩阵:[[1.1,2.2],[3.3,4.4]] tensor张量:代表任意维度的数据 1.1 创建一个tensor 创建方法: tf.constant(value, shape=维度, d... 阅读详情

一、如何创建Tensor

tf.constant(数据)就可以创建一个tensor,tensor可以是任意的数据类型,在创建过程中,我们可以使用dtype=的参数来定义这个tensor的变量类型,但是要注意定义的类型与我们的数据类型是否相同。

二、Tensor的常见属性

转换设备

# 从GPU转化成CPU
tensor.cpu()
# 从CPU转化成GPU
tensor.gpu()

tensor.numpy()将tensor类型转化成nandarry类型,nadarry类型默认是在CPU上的
tf.convert_to_tensor(数据,dtpye=)将numpy类型转化成tensor类型,但是需要注意的是,如果不指定类型的话还是会使用numpy的数据类型而不是tensor的数据类型

查看tensor的维度
tensor.ndim:返回一个int数值,表示其维度
tf.rank(tensor)返回一个tensor类型的数据,也表示其维度

tf.is_tensor(变量)用于判断该变量是否为tensor类型
tensor.dtype查看tensor的数据的类型

tf.cast(tensor,dtype=)用于tensor类型的数据类型转化

tf.Variable类
tf.Variable(tensor)variable类本质上也是一个tensor,但是他被赋予两个属性,一个是name,可以忽略,另一个是trainable翻译过来就是可训练的,也就是说这个变量在我们的前向传播和反向传播过程中会创建关于这个变量的w和b,也就是说,这个变量是需要一个梯度来实现参数更新
当我们创建一个Variable类后,tf会自动记录我们这个变量的相关梯度信息

如果我们的tensor是一个元素的话,我们可以使用int(tensor)等强制转化类型的方法实现从GPU转化到CPU上的一个过程

三、创建tensor

tf.zeros(形状):创建一个指定形状的0张量(内部所有都是0,但是满足指定的形状),形状用元组或者列表存储
tf.ones(形状):创建一个指定形状的数据都是1的张量
tf.ones_like(tensor) == tf.ones(tensor.shape)

tf.fill(形状,数字)创建一个指定形状的数据全是指定数字的张量

tf.random.normal(形状,mean=1,stddev=1)产生一个指定形状的,符合正态分布的一个tensor,mean是均值默认为0,stddev是方差默认为1

tf.random.truncated_normal(形状,mean = 1,stddev=1)产生一个指定形状的,符合截断正态分布的一个tensor,其他参数类似

什么事截断的正态分布呢:就是说在一个标准的正态分布上,当我们的数值达到某一部分时,我们舍去那一部分,然后再次进行采样。当我们遇到梯度消失时,这样的初始化方法或许会有不错的效果

tf.random.uniform(形状,minval=,maxval=)产生一个指定形状的,在minval~maxval之间采样的符合均匀分布的tensor

tf.random.shuffle(tensor)对一个以为tensor进行随机打乱原有的次序
tf.one_hot(tensor)对一个tensor一维数组进行onehot编码,数值作为索引

tf.keras.losses.mes(y,yHat)MSE(误差平方和)求解函数

# 定义x
x = tf.random.normal([4,784])
# 创建一个输出为10的层的方法
net = layers.Dense(10)
# 创建一个隐藏层输,在参数中输入输入的维度
net.build((4,784))
# W
net.kernel
# b
net.bias

关于kenel和bias可参考:官方

四、索引切片

tensor的索引切片方式和numpy几乎是一样的。

五、选择索引

我们以一个tensor,a(维度为[4,38,5])为例子
tf.gather(a,axis=0,indices=[2,3])表示选择我们a中的第0维度的,第2和3个数据,维度将会转化为[2,38,5]
tf.gather_nd(a,[[1,2,3],[2,5,3]])表示选择我们a中的a[1,2,3]与a[2,5,3]组成的tensor
tf.boolean_mask(a,mask=[[True,False,False],[False,True,True]])对于一个([2,3])维度的就取出他对应的维度就可以了,对于一个[2,3,4]维度的看前面的2,3取出对应位置的四个元素

六、维度修改

在修改维度时通常会看到tf.reshape(a,[4,-1])这样的写法,意思是将其转化成一个二维数据,行是4,他的宽需要自动计算,最终的size仍要一致
tf.transpose(a,perm=[0,3,1,2])对图片的维度进行转换[b,h,w,c]标称[b,c,h,w]

tf.expand_dims(a,axis=0)增加一个维度,axis指定在哪个轴前添加
tf.squeeze(a,axis=)维度收缩,如果不填axis的话,就对所有维度为1的的维度全部去除,如果输入axis,就只对axis维度进行去除

七、tensor复制扩张

对于一个维度为[3,4]的tensor a来说,扩张他的维度

tf.broadcast_to(a,[2,3,4])·他的维度就会被扩张成[2,3,4]

a = tf.expand_dims(a,axis = 0)# 在前面添加一个维度
a2 = tf.tile(a,[2,1,1])# 在第一个维度复制两次,在第二个维度复制一次,第三个维度复制一次

区别:前者有内存优化,后者没有

八、tensor计算

  1. 常规数据计算:加减乘除,对应位置进行运算
  2. 矩阵数据计算:@,matmul,矩阵相乘
    1 . 如果有一个[b,3,4]和一个[b,4,5]的矩阵,进行运算那么他会看成第一个有b个【3,4】的矩阵,第二个有b个【4,5】的矩阵,然后对应矩阵相乘,于是计算的结果为[b,3,5]
  3. 维度上的计算:reduce_mean/max/min/sum,对指定的axis来计算他们对应的数值
  4. 科学计算:tf.math.log(a),tf.exp(a)这里的log是以e为低的,如果要用log2,log10,应该写成tf.math.log(a)/tf.math.log(10)运用公式来实现,第二个exp表示的是,e的x次方

九、数据装载

对读取进来的图片先使用x = tf.convert_to_tensor(x,dtype = tf.float32),如果是图片还要除以255,读取y = tf.convert_to_tensor(y,dtype=tf.int32)
然后开始装载:
train = tf.data.Dataset.from_tensor_sclices((x,y)).batch(128)
打印加载结果

sample = next(iter(train))
print(sample[0].shape)

十、纪录计算过程

在进行前项传播的时候,需要把前项传播放在with tf.GradientTape() as tape:中,才能使用自动求导过程,在写完前项传播后,我们需要在这一行包括的区域外面,写一个grads = tape.gradient(loss函数,[需要做反向传播的参数]),grads会返回一个list,与我们输入的参数顺序相同。

还要注意,默认情况tape只会对变量求导,即tf.Variable()类型的信息,要想对常量求导,则需要用tape.watch([需要观察求导的常量参数]) 设置参数。

如果常规计算时,将variable类型改变的话,应该使用tf.assign_sub()这类函数进行计算,这个函数类似于-=,tf.assign_add()类似于+=,assgin就是赋值的意思

如果在前向传播过程出出现计算的loss为nan的话,可能是出现了梯度爆炸的问题,这就要求在随机初始化的时候设置一个参数stddev = 0.1以控制参数的方差

import tensorflow as tf 

# 创建4个张量
a = tf.constant(1.)
b = tf.constant(2.)
c = tf.constant(3.)
w = tf.constant(4.)


with tf.GradientTape() as tape:# 构建梯度环境
	tape.watch([w]) # 将w加入梯度跟踪列表
	# 构建计算过程
	y = a * w**2 + b * w + c
# 求导
[dy_dw] = tape.gradient(y, [w])
print("dw",dy_dw)

# 用variable而非watch
w2 = tf.Variable(tf.constant(4.))
with tf.GradientTape() as tape:# 构建梯度环境
	# 构建计算过程
	y = a * w2**2 + b * w2 + c
# 求导
[dy_dw2] = tape.gradient(y, [w2])
print("dw2",dy_dw2)

输出:
dw tf.Tensor(10.0, shape=(), dtype=float32)
dw2 tf.Tensor(10.0, shape=(), dtype=float32)

如果注释掉:tape.watch([w]) ,则打印dw None

十一、示例:三层神经网络的代码训练mnist数据集

import tensorflow as tf
from tensorflow.keras import datasets
import os
# 过滤无关紧要的警告信息
os.environ["TF_CPP_MIN_LOG_LEVEL"] = 2
# 读取数据集
(x,y),_ = datasets.mnist.load_data()
x = tf.convert_to_tensor(x,dtype = tf.float32)/255
y = tf.convert_to_tensor(y,dtype = tf.int32)
train = tf.Dataset.from_tensor_sclices((x,y)).batch(128)
# 初始化网络参数
w1 = tf.Variable(tf.random.truncated_normal([28*28,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
epoch = 10
for i in range(epoch):
	for step,(x,y) in enumerate(train):
		# 转化图片存储方式
		x = tf.reshape(x,[-1,28*28])
		# 前项传播
		with tf.GradientTape() as tape:
			h1 = x@w1 + b1
			h1 = tf.nn.relu(h1)
			h2 = h1@w2 + b2
			h2 = tf.nn.relu(h2)
			out = h2@w3 + b3
			# 转化成one-hot编码
			y_onehot = tf.one_hot(y,depth=10)
			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(step,"loss:",float(loss))

参考:

https://blog.youkuaiyun.com/kiminoamae/article/details/107747208?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-107747208-blog-105554738.topnsimilarv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-107747208-blog-105554738.topnsimilarv1&utm_relevant_index=1

https://blog.youkuaiyun.com/qq_39507748/article/details/105554738

彻底搞懂tensorflow里的张量(tensor) 彻底搞懂tensorflow里的张量(tensor) 1.引言 学习卷积神经网络(CNN)的时候,最重要的就是搞清楚网络各层的神经元输入输出的数据结构(即张量)。如果仅用线性代数所学的矩阵,向量来理解张量,一定会搞得一头雾水。因此很有必要搞清楚张量是什么东西。 首先明确:张量最主要的两个参数: rank(阶,或维数)、shape(形状) 2.什么是张量 下图是张量的直观的示意: 张量是标量、... 阅读详情

相关推荐

TensorFlow学习(二):变量常量类型

更新时间:2017.2.27 tensorflow 1.0出来了,API和以前有了一些不一样,所以这里把把之前的代码迁移到新的上面去。 格式有问题,慢慢调….一.概览还记的上节TensorFlow学习(一):感受一下 的hello word的例子吗?是不是出现了一些新的编程思路和一个函数类等等。我们学任何一门编程语言的时候,都会讲一些量的操作,因为这是基本。这节的主要任务就是熟悉最基本的一些量怎

谢小小XH 6万+

Tensorflow笔记(一)Tensor的数据类型转换

学习Tensorflow的第一阶段的笔记。

#偏执I 的博客 7214

tf tensor与numpy转换,embedding_lookup、embedding_lookup_sparse使用,feature_column使用

1、 tensor与numpy转换 np.asarray([1,3,6,2]) #列表或元祖转array # numpy to tensor import numpy as np data_numpy = np.ones(5) mm = tf.convert_to_tensor(data_numpy) with tf.Session() as sess: print(mm.eval()) # tensor to numpy with tf.Session() as sess: print(

weixin_42357472的博客 2613

Tensor(tf.Tensor)

Tensor类应该是最基本最核心的数据结构了,他表示的是一个操作的输出,但是他并不接收操作输出的值,而是提供了在TensorFlow的Session中计算这些值的方法。 Tensor类主要有两个目的: 1.一个Tensor能够作为一个输入来传递给其他的操作(Operation),由此构造了一个连接不同操作的数据流,使得TensorFLow能够执行一个表示很大,多步骤计算的图。 2.在

jomozz的专栏 5159

5.6 tensorflow2实现奇异值分解(SVD)——python实战(上篇)

带你全面理解奇异值分解,使用tensorflow2从零开始构建。 教会你 奇异值分解的定义与性质 紧异值分解与截断奇异值分解 几何解析 奇异值分解的计算 奇异值分解与矩阵近似F-范数矩阵的最优近似矩阵的外积展开式 感谢你的阅读,专栏文章持续更新,希望感兴趣的伙伴点个赞,关注不迷路!你的支持是我前进的动力! 深耕于机器学习算法、深度学习、数据分析等领域,希望我这微不足道的知识能帮到您。

炫云云 927

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1104

【PyTorch】第一节:张量(Tensor)的定义

PyTorch 中的所有操作都是在张量的基础上进行的,本实验主要讲解了张量定义和相关张量操作以及 GPU 和张量之间的关系,为以后使用 PyTorch 进行深度学习打下坚实的基础。

荷叶田田的博客 3710

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

什么是Tensor

概要 tensor是tensorflow基础的一个概念–张量 tensorflow用到了数据流图,数据流图包括数据(DATA)、流(Flow)、图(Graph) tensorflow里的数据用到的都是tensor,所以谷歌起名为tensorflow。 下面介绍张量几个比较重要的概念: 张量的维度(秩):RANK/ORDER 0 (一个元素) Scalar 标量 1 (1行x列) ...

君子不器 1674

STM32G474 FDCAN滤波器配置与多ID接收实战

本文详细介绍了STM32G474 FDCAN滤波器配置与多ID接收实战,重点解析了掩码过滤和范围过滤两种模式的工作原理及配置步骤。通过实际项目案例展示了如何高效配置多个滤波器实现多ID报文接收,并提供了接收FIFO配置与中断处理的优化策略,帮助开发者提升CAN通信系统的稳定性和实时性。

happy2的博客 875

数值计算之 插值法(4)切比雪夫零点插值

数值计算之 插值法(4)切比雪夫零点插值前言插值点选取第一类切比雪夫多项式拉格朗日插值多项式的余项切比雪夫零点插值后记 前言 上篇插值法讨论了多项式插值的解,以及龙格现象。本篇将介绍一种在抽取节点时有效降低龙格现象的方法——切比雪夫零点插值。 插值点选取 插值多项式阶数较高时,在取值空间均匀取点,容易出现龙格现象。 即区间边缘的插值结果与原函数差异很大,而区间中央的插值结果相对较好。这表明,高阶多项式插值对区间中央的节点拟合好,而对两端节点拟合效果差。 自然而然会想到,在两端多采样一些节点,在中间少采样一

qq_41035283的博客 1万+

【Tensorflow学习笔记 - 2】认识Tensor类

Tensor类的组成 认识一个类主要从它的属性和方法两个方面去了解它的使用方法,属性提供了这个类中包含的信息,方法提供了这个类能做什么的途径。Tensor作为TF底层操作的一个基础元素,熟练掌握是学好TF的关键环节。 注:此部分内容核心思想来自于https://www.tensorflow.org/api_docs/python/tf/Tensor Tensor是什么? 官方文档中说道...

Cannol 341

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7485

TensorFlow - Tensor理解与使用

如何理解TensorFlow中的tensorflyfishtensor 张量 英 [‘tensə; -sɔː] 美 [‘tɛnsɚ]What is a Tensor? Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars an

二分掌柜的 8794

GoDaddy域名解析 到 阿里云域名DNS

一:登录GODaddy,点击“个人中心”,然后点击“管理域名” 二:域名解析 第一种:直接解析到对应的服务器 添加一个,类型默认A,主机填写二级域名前缀(image.主域名),指向填写目标服务器ip即可(注意目标服务器80端口是否开放) 第二种:将主域名dns转到阿里云域名下 三:若要修给为阿里云解析服务器,要做以下修改,点击“更改” 点击更改后出现如下页面,此时需要到阿里云官网云解析DNS下添加域名解析 四:阿里云添加域名解析...

xiaolinzi176的博客 6704

2024年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】

正所谓 金三银四 ,又到了找工作的大好时机了,不知道大家有没有意向找一份更好的工作呢~ 之前写了很多Unity的学习和实例文章,但是面试题部分还没有一个系统的整理。 那本篇文章就来整理一下Unity中一些常见的面试题,说不准就会面试的时候就会遇到! 本篇文章会将Unity所有方面的面试资料都融会贯通,绝对是2022年Unity面试领域最实用的文章啦!

努力前行,总会成为自己心中的那道光 17万+

TensorFlow数据索引与切片:从基础操作到高效数据处理的工程实践

在深度学习和数据科学领域,张量(Tensor)作为核心数据结构,其高效操作是模型性能的关键。理解张量的索引与切片原理,不仅是掌握数据访问的基础,更是实现计算图(Graph)优化和GPU加速的工程实践核心。通过原生、可微分的索引操作,开发者能在数据流入模型前完成筛选、重组等预处理,这些操作作为计算图的一部分,可享受静态图优化与硬件加速,从而避免CPU与GPU间的数据拷贝开销,显著提升流水线效率。在自然语言处理中,根据序列长度提取有效词向量,或在计算机视觉中随机裁剪图像进行数据增强,都依赖于此技术。本文以Ten

weixin_34284188的博客 316

基于特征模仿的YOLOv5中间层知识蒸馏:原理、实现与实验全解析

目标检测中的模型轻量化是一个关键挑战。本文提出一种基于特征模仿(Feature Imitation)的YOLOv5中间层知识蒸馏方法,通过让学生模型学习教师模型的中间层特征表示,显著提升轻量级检测器的性能。我们将详细阐述蒸馏损失函数的设计、特征对齐策略、训练流程,并提供完整可运行的代码实现。同时,推荐多个适合蒸馏训练的数据集,并通过实验验证方法的有效性。

YOLO 186

tensorflow基础操作

tensorflow基础操作

Lu_shen_的博客 1633

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

tensorflow判断两个tensor是否完全相同

来源于解决一个csdn中的问答,问答链接:http://ask.youkuaiyun.com/questions/652382#answer_460706笔者想到的方法就是直接把bool类型转换到int处理,之后方法就很多样了(求和、求最小值等等,总归是利用一些全一序列的性质)。下面给一个例子: a = tf.placeholder(tf.int32,[2,]) b = tf.placeholder(tf.i

silent56_th的博客 8753

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python深度学习基于Tensorflow(7)视觉处理基础

假设我们需要识别一张图像,我们不可能去关注所有的像素,假设目标是一只马,我们关注的是:它有几条腿,几只眼睛,站着还是坐着等等;同时,为了丰富图像的色彩,加入了通道这一概念,通道一般有三个,由三原色组成:RGB 红色,绿色,蓝色;感受野指的是某层某一输出的值依赖于原输入的值的范围,可以得到随着卷积层变多,感受野越大;在神经网络中,还有一个参数叫步幅,默认步幅为1,这个很好理解,在计算卷积的时候,隔一个还是多个进行卷积计算,超出就不管了;分别为1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

bigcrab的博客 1651

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PyTorch Tensor 实战指南:7 类高频操作与 12 条 debug 铁律

Tensor 是 PyTorch 的核心数据载体,远不止是 NumPy 的替代品——它承载计算图构建、自动微分、GPU 调度与内存管理的全部语义。理解其创建机制(如 torch.tensor vs torch.Tensor)、设备迁移规则(to/cuda/empty_cache)、形状变换原理(view/reshape/permute)及梯度控制逻辑(detach/require_grad_/no_grad),是避免 RuntimeError、显存溢出和梯度消失的关键。尤其在工业级训练中,dtype 不匹配

shirlly 827

tensorflow中计算流图的一些性质

目的: 想要给tensor中的slice赋值。以numpy为例,对一个np对象,的第二行赋值 import numpy as np mat = np.zeros((3, 3)) print(mat) """ 输出 [[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]] """ mat[1,:] = [1, 2,

qq_29007291的博客 997

深度学习框架TensorFlow系列之(三)基础概念之框架载体之数据载体张量Tensor

文章目录1 前言2 框架数据载体:张量3 Dense数据载体:张量-Tensor2.1 定义2.2典型案例4 总结5 感悟 1 前言 大抵来说,从事机器算法框架工作的人员基本有两个比较大的流派。一种是算法派,一直以来都是从事算法方面的工作,算法的理论基础与算法调优经验非常充足,对于算法有较深的理解。另外一种是架构工程派,这类同学以前从事搜、广、推以及大数据等方面的工作,工程架构经验非常丰富,有自己的工程设计理念,对于计算性能有着极致的追求与探索。两种流派并无孰优孰略的问题,最终都会殊路同归,不过由于其研

老码农 485
上一篇: scala中reqiure和assert的区别
下一篇: 一文搞懂tf.function
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值