Tensorflow2.0基础|深度学习

简介: Tensorflow2.0基础|深度学习
  • 本文基于Tensorflow2.2版本编写

什么是Tensorflow

Tensorflow 是一个面向深度学习算法的科学计算库,内部数据保存在张量(Tensor)对象熵,所有的运算操作(Operation)也都是基于张量对象进行的,我们所接触到的复杂的神经网络算法本质上就是各种张量相乘,想加等一些基本运算操作的组合。


Tensorflow的数据类型

数值类型

Tensorflow的数值类型我们称之为张量(Tensor),根据不同的维度我们可以分成以下几个部分。


  • 标量(Scalar):单个实数,如1、2、3、4,我们可以说标量的维度是0。
  • 向量(Vector):通过[]来包裹的n个实数的集合,如[1,2,3],向量的维度是1。
  • 矩阵(Matrix):n行m列实数的有序集合,如[[1,2],[3,4]],矩阵的维度是2。
  • 张量(Tensor):当数据的维度大于2的时候,我们就可以把它称为张量了。


ps:在tensorflow中,为了表达方便,无论怎样的维度我们都称之为张量。


创建张量

在python中我们可以直接使用“=”的方式来创建数据,但是在Tensorflow中,为了能够使用其内部使用的函数,所以我们需要用Tensorflow中内置的函数来进行张量的创建。


ps:布尔类型的数据也可以直接传入。

import numpy as np
import tensorflow as tf
# 创建标量
a = tf.constant(1.2)
# 创建向量
b = tf.constant([1, 2])
# 创建矩阵
c = tf.constant([[1, 2], [3, 4]])
# 创建3维张量
d = tf.constant([[[1, 2, 3], [3, 4, 3]], [[5, 6, 3], [7, 8, 3]]])
d

字符串类型

tensorflow提供了字符串类型数据的创建方法和一些函数操作。

str1 = tf.constant('Hello TF')
# 字符串小写
tf.strings.lower(str1)
# 字符串的长度
tf.strings.length(str1)
# 字符串的拼接
tf.strings.join()
# 字符串的切分
tf.strings.split()

Tensorflow的数值精度


对于数值类型的张量,我们可以保存为不同字节长度的精度,如浮点数3.14既可以保存为16位长度,也可以保存为32位、64位等,当然位数越长也就意味着精度越高,统一占用的内容空间也就越大。


Tensorflow中常用的精度类型有:tf.int16、tf.int32、tf.int64、tf.float16、tf.float32、tf.float64。


对于深度学习来说,一般使用tf.int32和tf.float32可满足大部分场合的运算精度要求,部分对精度要求较高的算法,如强化学习某些算法,可以选择使用tf.int64和tf.float64精度保存张量。

# 创建指定精度的张量
tf.constant(123456789, dtype=tf.int16)
tf.constant(123456789, dtype=tf.int32)
# 读取精度
a.dtype
# 类型转换
'''
进行类型转换时,需要保证转换操作的合法性,
例如将高精度的张量转换为低精度的张量时,可能发生数据溢出隐患.
转换成bool类型的时候,会将非零数字都视为True
'''
tf.cast(a, tf.int32)

Tensorflow的待优化张量


为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量,TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录:tf.Variable。tf.Variable 类型在普通的张量类型基础上添加了name,trainable等属性来支持计算图的构建。由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数,对于不需要的优化的张量,如神经网络的输入x, 不需要通过tf.Variable封装;相反,对于需要计算梯度并优化的张量,如神经网络层的w和b,需要通过tf.Variable包裹以便 TensorFlow跟踪相关梯度信息。

# 创建TF张量
a = tf.constant([0, 1, 2, 3])
# 转换为Variable类型
aa = tf.Variable(a)
# a = tf.Variable([[1, 2], [3, 4]])
# var中的属性
aa.name, aa.trainable

Tensorflow创建张量

在Tensorflow中我们不仅能够从python列表创建张量,同样也可以从numpy数组中来创建,还可以通过已知的某种分布来进行创建。

# 从列表中创建张量
tf.convert_to_tensor([1, 2])
# 从数组中创建张量
tf.convert_to_tensor(np.array([[1, 2], [3, 4]]))
# 创建全0标量
tf.zeros([])
# 创建全1的标量
tf.ones([])
# 创建全0的向量
tf.zeros([5])
# 创建全1的向量
tf.ones([5])
# 创建全0的矩阵
tf.zeros([2, 3])
# 创建全1的矩阵
tf.ones([2, 3])
# 创建全0的3维张量
tf.zeros([2, 2, 3])
# 创建全1的3维张量
tf.ones([2, 2, 3])
# 创建自定义数值的张量
tf.fill([], -1)
tf.fill([5], -1)
tf.fill([2, 3], -1)
tf.fill([2, 2, 3], -1)
# 创建已知分布的张量
# 创建标准正态分布的张量
tf.random.normal([2, 2])
# 创建一般正态分布的张量
tf.random.normal([2, 2], mean=1, stddev=2)
# 创建采样自[0,1)均匀分布的矩阵
tf.random.uniform([2, 2])
# 创建采样自[0,10]均匀分布的矩阵
tf.random.uniform([2, 2], maxval=10)
# 创建序列
tf.range(10)
# 设定步长创建序列
tf.range(5, 10, delta=2)

张量的应用

# 计算平均MSE(标量)
out = tf.random.uniform([4, 10])
y = tf.constant([2, 3, 2, 0])
y = tf.one_hot(y, depth=10)
print(y)
loss = tf.keras.losses.mse(y, out)
loss = tf.reduce_mean(loss)
print(loss)
# 向量的加减(向量)
'''
这里的做法可以用于神经网络的全连接层中,
给每一个节点都增加了一个向量形式的偏置。
'''
z = tf.random.normal([4, 2])
b = tf.ones([2])
z = z + b
print(z)
# 矩阵的运算(矩阵)
'''
在神经网络的全连接层中,我们除了会涉及到
偏置的计算,还会涉及到权重的计算,下面来
演示一下。
'''
x = tf.random.normal([2, 4])
w = tf.ones([4, 3])
b = tf.zeros([3])
o = x @ w + b
print(o)
# 张量在图像中的应用(张量)
'''
我们日常生活中所见到的图像都是由RGB3个通道的色彩组成的,
再加上图片的尺寸(h行w列的像素点),我们可以把一张图片
表示成[h,w,3]的形式。
'''
# 创建32x32的彩色图片输入,个数为4
x = tf.random.normal([4, 32, 32, 3])
# 使用卷积神经网络
layer = tf.keras.layers.Conv2D(16, kernel_size=3)
# 前向计算
out = layer(x)
out.shape

索引和切片

张量也提供了通过索引和切片进行部分数据读取的方式,并且这两类方法的使用频率是非常高的。

# 索引
# 创建一个4D的张量
x = tf.random.normal([4, 32, 32, 3])
# 读取第1张图片的数据
x[0]
# 读取第1张图片的第2行
x[0][1]
# 读取第1张图片的第2行,第3列。
x[0][1][2]
# 读取第1张图片的第2行,第3列,第1个通道(RGB中的G通道)的数据。
x[0][1][2][1]
# 当维度变的越来越高的时候,[i][j][k]的书写会变的很不方便,我们可以尝试采用[i,j,k]的方法
x[0, 1, 2, 1]
# 切片
'''
切片在每一个维度上的很多使用方法和我们在列表中使用的切片是一样的。
在张量中我们可以同时对多个维度进行操作。
'''
# 读取第2,3张图片
x[1:3]
# 读取某一部分的数据(使用步长)
# shape=(4, 14, 14, 3)
x[:, 0:28:2, 0:28:2, :]
'''
    ...切片方式说明
    [a,...,b]: a 维度对齐到最左边,b 维度对齐到最右边,中间的维度全部读取,
  其他维度按 a/b 的方式读取。
    [a,...]  : a 维度对齐到最左边,a 维度后的所有维度全部读取,a 维度按 a 方式
  读取。这种情况等同于 a 索引/切片方式。
    [...,b]  : b 维度对齐到最右边,b 之前的所有维度全部读取,b 维度按 b 方式读取。
    [...]    : 读取张量所有数据。
'''
# 避免过多冒号的写法
x[...,:2]

维度变换

我们可以通过维度变换的形式将数据进行任意形式的切换,满足不同场合的运算需求。

# 改变视图
# 把向量改变成张量
# 生成向量
x = tf.range(96)
# 把向量变成4D张量,数据的顺序不变
# 使用tf.reshape(x,[])可以对张量进行任意维度合法的转变
x = tf.reshape(x, [2, 4, 4, 3])
# 获取张量的维度数和形状列表
x.ndim, x.shape
# 增加维度
# 我们可以在不改变原数据的情况下通过增加维度的方式对数据的维度进行改变
# 创建矩阵
x = tf.random.uniform([28, 28], maxval=10, dtype=tf.int32)
# 通过tf.expand_dims(x,axis)可以添加一个新的维度
# shape=(28, 28, 1)
x = tf.expand_dims(x, axis=2)  # axis=2表示在宽度后面增加一个维度
# shape=(1, 28, 28, 1)
x = tf.expand_dims(x, axis=0)  # axis=0表示在高度前面增加一个纬度
# 删除维度
# 删除维度可以看作是增加维度的你操作,和增加维度一样,删除维度只能删除长度为1的维度
# 通过tf.squeeze(x,axis)可以删除一个维度
# shape=(28, 28, 1)
x = tf.squeeze(x, axis=0)
# shape=(28, 28)
x = tf.squeeze(x, axis=2)
# 删除所有长度为1的维度
# x = tf.squeeze(x)
# 交换维度
# 通过tf.transpose(x,perm=[])可以进行维度的交换
x = tf.random.normal([2, 32, 32, 3])
tf.transpose(x, perm=[0, 3, 1, 2])
# 复制数据
# 创建向量b
b = tf.constant([1, 2])
# 转换成矩阵
# shape=(1, 2)
b = tf.expand_dims(b, axis=0)
# 行维度上复制一份
# shape=(2, 2)
b = tf.tile(b, multiples=[2, 1])
# 列维度:tf.tile(b, multiples=[1,2])
b

数学运算

'''
数学运算中,对于基本的数学运算既可以用函数也可以直接用运算符来完成
加法:tf.add | +
减法:tf.subtract | -
乘法:tf.multiply | *
除法:tf.divide | /
'''
a = tf.range(5)
b = tf.constant(2)
# 整除运算
a//b
# 取余数运算
a%b
# 乘方运算
tf.pow(a,3)
a**2
# 平方根运算
c = tf.constant([1.,4.,9.])
tf.sqrt(c)
c**(0.5)
# 指数运算
d = tf.constant([1.,2.,3.])
2**x
# 自然指数运算
tf.exp(1.)
# 对数运算
e = tf.exp(3.)
tf.math.log(e)
# 矩阵的相乘
f = tf.random.normal([4,3,28,32]) 
g = tf.random.normal([4,3,32,2])
# 批量形式的矩阵相乘
f@g
# 使用广播机制,先扩展再相乘
h = tf.random.normal([4,28,32]) 
# 扩展为[4,32,16]
i = tf.random.normal([32,16])
tf.matmul(h,i)


相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
21 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
18 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
4天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
20 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
75 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
20天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
65 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
108 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
3月前
|
机器学习/深度学习 算法 TensorFlow
深入探索强化学习与深度学习的融合:使用TensorFlow框架实现深度Q网络算法及高效调试技巧
【8月更文挑战第31天】强化学习是机器学习的重要分支,尤其在深度学习的推动下,能够解决更为复杂的问题。深度Q网络(DQN)结合了深度学习与强化学习的优势,通过神经网络逼近动作价值函数,在多种任务中表现出色。本文探讨了使用TensorFlow实现DQN算法的方法及其调试技巧。DQN通过神经网络学习不同状态下采取动作的预期回报Q(s,a),处理高维状态空间。
52 1
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
61 0
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
65 0
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
62 0

热门文章

最新文章