Tensorflow2.0|深度学习

简介: Tensorflow2.0|深度学习

合并和分割

合并是指将多个张量在某个维度上合并为一个张量,比如我们要将某学校所有的考试成绩单进行合并,张量A中记录了该学校1-4班的50名学生的9门科目的成绩,此时对应的shape就是[4,50,9],张量B记录了5-10班的成绩,此时的shape就是[6,50,9],我们合并这两个张量就能够得到该学校全部成绩的张量C为[10,50,9],此时张量合并的用处就得以体现了。


张量的合并可以通过拼接和堆叠来实现,拼接操作并不会产生新的维度,仅在现有的维度上合并,而堆叠会创建新维度。选择使用拼接还是堆叠操作来合并张量,取决于具体的场景是否需要创建新维度。


拼接

我们可以直接使用Tensorflow中的tf.concat(tensors,axis)函数拼接张量:


  • tensors:所有需要合并的张量List。
  • axis:参数指定需要合并的维度索引。


需要注意的是,拼接的时候我们要保证非合并维度的长度必须是一致的。


对于我们最开始举的例子,代码实现方式如下:

import tensorflow as tf
import numpy as np
a = tf.random.normal([4,50,9])
b = tf.random.normal([6,50,9])
c = tf.concat([a,b],axis=0)
# print(c.shape)
# (10, 50, 9)
# 尝试对其他的纬度进行拼接 
a = tf.random.normal([5,50,6])
b = tf.random.normal([5,50,7])
c = tf.concat([a,b],axis=2)
# print(c.shape)
# (5, 50, 13)

堆叠

我们上面使用到的拼接操作是在现有的维度上合并数据,并不会创建新的维度,如果我们在合并数据时,希望创建一个新的维度,则需要使用tf.stack操作。比如我们要将两个班级的考试成绩单进行合并,张量A中记录了第一个班级的50名学生的9门科目的成绩,此时对应的shape就是[50,9],张量B记录了第二个班级的成绩,此时的shape也是[50,9],我们合并这两个张量就能够得到该学校全部成绩的张量C为[2,50,9],此时我们就可以使用堆叠的操作来创建一个新的维度。


我们可以直接使用tf.stack(tensors,axis)进行多个张量的堆叠:


  • tensors:所有需要合并的张量List
  • axis:指定新维度插入的位置,和expand_dims一致。


需要注意的是,在进行堆叠操作的时候要保证所有张量的纬度是一致的。


axis对应值的插入位置如下图所示:

37.png

代码的实现方式如下:

a = tf.random.normal([35,8])
b = tf.random.normal([35,8])
c = tf.stack([a,b],axis=0)
# print(c.shape)
# (2, 35, 8)
d = tf.stack([a,b],axis=-1)
# print(d.shape)
# (35, 8, 2)

分割

既然我们可以进行合并操作,那么同样我们也可以进行逆向的分割操作,将一个张量拆分为多个张量,用我们之前的成绩单数据,整个学校的数据为[10,50,9]现在我们把它分为10个张量,每个张量保存对应班级的成绩单。


我们可以直接使用tf.split(x,num_or_size_splits,axis)进行分割操作:


  • x:待分割张量。
  • num_or_size_splits:切割方案。当num_or_size_splits为单个数值时,如10,表示等长切割为10份;当num_or_size_splits为List时,List的每个元素表示每份的长度,如[2,4,2,2]表示切割为 4 份,每份的长度依次是 2、4、2、2。
  • axis:制定分割的维度索引。


代码实现方式如下:

x = tf.random.normal([10, 35, 8])
y = tf.split(x, 10, axis=0)
print(len(y))
print(y[0].shape)
10
(1, 35, 8)

数据统计


在进行神经网络计算的时候,我们通常需要统计数据的各种属性,如均值、最值、众数等信息,但是对于复杂的张量,我们往往不能通过观察数据来获取有用的信息,下面来学习一下数据统计的方法。


向量范数


向量范数是表征向量“长度”的一种度量方法,他可以推广到张量上,在神经网络中我们通常用来表示张量的权值大小,梯度大小等,常用的向量范数有:

38.png

我们可以使用tf.norm(x,ord)求解张量的范数:


  • x:要求解的张量
  • ord:范数选择(1、2代表L1、L2,np.inf代表∞)


代码实现方式如下:

x = tf.ones([2,2])
# 计算L1范数
tf.norm(x,ord=1)
# 计算L2范数
tf.norm(x,ord=2)
# 计算∞范数
tf.norm(x,ord=np.inf)
<tf.Tensor: shape=(), dtype=float32, numpy=1.0>

其他的数据统计


我们可以使用tensorflow进行简单的数据统计,常用的函数如下:


  • 最大值:tf.reduce_max()
  • 最小值:tf.reduce_min()
  • 均值:tf.reduce_mean()
  • 和:tf.reduce_sum()
  • 最大值的索引:tf.argmax()
  • 最小值的索引:tf.argmin()


x = tf.random.normal([4,10])
# 计算某个维度上的最大值
tf.reduce_max(x,axis=1)
# 计算全局的最大值
tf.reduce_max(x)
# 计算某个纬度的最小值
tf.reduce_min(x,axis=1)
# 计算全局的最小值
tf.reduce_min(x)
# 计算某个维度的均值
tf.reduce_mean(x,axis=1)
# 计算全局的均值
tf.reduce_mean(x)
# 计算某个维度的和
tf.reduce_sum(x,axis=1)
# 计算全局的和
tf.reduce_sum(x)
# 得到最大值的索引
tf.argmax(x)
# 得到最小值的索引
tf.argmin(x)
<tf.Tensor: shape=(10,), dtype=int64, numpy=array([1, 3, 3, 3, 3, 1, 2, 3, 3, 1])>

张量比较

通常我们会涉及到对两个张量进行比较的操作,tensorflow中常用的比较函数如下:

39.png

填充和复制

填充

对于很多图片数据来说,长度宽度总是不同的,这也导致我们很难对不同维度之间的数据进行运算,此时就需要我们将不同长度的数据扩充为相同的长度,使得二者之间可以进行运算,通常的做法是,在需要补充长度的数据开始或结束处填充足够数量的特定数值,这些特定数值一般代表了无效意义,例如0,使得填充后的长度满足系统要求。那么这种操作就叫作填充 (Padding)。


举个例子

我们考虑下面两个句子:


  • I like python.
  • I like python too.


算上标点,我们对其进行数字编码,可以变成如下的形式:


  • [1,2,3,4]
  • [1,2,3,5,4]


对于第一个句子,我们就需要进行一个填充操作,在末尾填充若干个0变成如下的形式:


  • [1,2,3,4,0]


这样我们就能进行运算操作了。


Tensorflow中填充操作可以用tf.pad(x,padding)实现:


  • x:需要填充的张量。
  • padding:嵌套list,比如[[0,3]]表示在第一个维度左边不填充,右边填充3个单元。


代码的实现方式如下:

a = tf.constant([1, 2, 3, 4])
b = tf.constant([1, 2, 3, 5, 4])
a = tf.pad(a, [[0, 1]])
# 将两个句子堆叠合并
tf.stack([a, b], axis=0)
<tf.Tensor: shape=(2, 5), dtype=int32, numpy=
array([[1, 2, 3, 4, 0],
       [1, 2, 3, 5, 4]], dtype=int32)>

复制

之前我们了解过,通过tf.tile()函数可以实现长度为1的维度复制功能,其实我们还可以进行任意维度的复制操作。


代码实现方式如下:

x = tf.random.normal([4, 32, 32, 3])
tf.tile(x, [2, 2, 1, 1])
# shape=(8, 64, 32, 3)

数据限幅

在很多的场景中,我们需要限制元素的范围。


Tensorflow中也提供了数据限幅的方法,我们可以通过tf.maximum(x,a)实现数据的下限幅,此时的数据将会大于a,同样我们可以通过tf.minimum(x,a)实现数据的上限幅,此时的数据将会小于a,tf.clip_by_value(x,a,b)函数实现上下限幅,此时的数据将会在a和b之间。


代码实现方式如下:

x = tf.range(9)
tf.maximum(x,2)
# [2, 2, 2, 3, 4, 5, 6, 7, 8]
tf.minimum(x,7)
# [0, 1, 2, 3, 4, 5, 6, 7, 7]
tf.clip_by_value(x,2,7)
# [2, 2, 2, 3, 4, 5, 6, 7, 7]
<tf.Tensor: shape=(9,), dtype=int32, numpy=array([2, 2, 2, 3, 4, 5, 6, 7, 7], dtype=int32)>
相关文章
|
6天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
29 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
6天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
22 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
6天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
26 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
75 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
22天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
67 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),处理高维状态空间。
54 1
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
62 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