Python深度学习-张量运算

news/2024/11/8 0:45:48/

神经网络中的大部分操作都涉及到张量运算(tensor operations)。张量是多维数组,可以看作是向量或矩阵的扩展,因此可以描述和处理更加复杂的数据结构,如图像、音频等。

在神经网络中,张量运算通常涉及以下几种操作:

  1. 加法:对两个张量中的每个元素进行加法操作。

  2. 乘法:对两个张量的相应元素进行乘法操作,常见的有点积和叉积。

  3. 卷积:卷积是神经网络中最常见的操作之一,它将滤波器与输入张量进行卷积操作,生成一个新的张量。卷积操作可以有效提取图像、音频等数据的特征。

  4. 池化:池化操作对输入张量进行降采样操作,通常用于减少数据维度和计算量,同时也有一定的防止过拟合的作用。

  5. 激活函数:激活函数是神经网络中非常重要的一种张量运算,它将输入的张量进行非线性变换,常见的有sigmoid、ReLU等。

以上这些操作都是通过张量运算进行的,它们将不同维度的数据结构进行合并、扩展、压缩等处理,使得神经网络可以有效学习和处理不同类型的数据。

下面我们来举例说明张量在深度学习中的应用。以图像数据为例,一张RGB图像通常是一个三维张量,即具有高度、宽度和颜色通道数三个维度,可以表示为一个形状为 (Height, Width, Channels) 的张量。

如果我们有一批包含100张图像的训练数据,每张图像大小为28x28,通道数为1(黑白图像),那么它们可以表示为一个形状为 (100, 28, 28, 1) 的四维张量,其中100为批大小,即一次处理的样本数量。这样,我们就可以将这个四维张量输入到深度学习模型中进行训练。

在模型中,我们通常会对这个四维张量进行各种操作,如卷积、池化等,生成新的四维张量作为下一层的输入,最终输出一个形状为 (100, 10) 的张量,表示这批图像在不同分类标签上的概率分布。我们可以通过这个张量计算损失函数并反向传播误差,更新模型参数,不断迭代优化模型。

这个例子展示了张量在深度学习中的重要作用,它们可以描述和处理不同维度的数据结构,如图像、文本、音频等,使得深度学习模型可以有效学习和处理这些数据,并在各种任务中取得优秀的表现。

下面我们用Python来举例说明深度学习中常用的张量操作,包括张量广播、张量积和张量变形。

  1. 张量广播

张量广播是一种自动扩张张量维度的机制,用于处理不同形状的张量之间的运算。具体来说,当两个张量在某些维度上形状不一致时,可以通过自动复制其中一个张量来使得它们形状一致,从而进行运算。例如,我们可以用以下代码实现对一个形状为 (4, 3) 的张量在第二个维度上加上一个标量:

import numpy as np# 创建一个形状为 (4, 3) 的张量
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])# 定义一个标量
y = 3# 使用广播进行加法
z = x + yprint(z)

输出结果为:

array([[ 4,  5,  6],[ 7,  8,  9],[10, 11, 12],[13, 14, 15]])

可以看到,标量 y 在第一个维度上被自动扩展成了一个形状为 (4, 1) 的张量,然后和 x 进行了加法运算。

  1. 张量积

张量积是一种将两个张量按照一定方式组合成一个新的张量的操作,可以用于多项式拟合、卷积等任务中。在Python中,可以使用numpy库中的dot函数实现张量积运算。例如,我们可以用以下代码实现一个2x3的矩阵与一个3x4的矩阵的张量积:

import numpy as np# 创建两个矩阵
x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]])# 计算张量积
z = np.dot(x, y)print(z)

输出结果为:

array([[ 74,  80,  86,  92],[173, 188, 203, 218]])

可以看到,输出的结果形状为 (2, 4),表示两个矩阵的张量积结果。

  1. 张量变形

张量变形是一种将一个张量重新组织为一个新形状的操作,可以用于重塑模型输入、输出、参数等张量的形状。在Python中,可以使用numpy库中的reshape函数实现张量变形。例如,我们可以用以下代码将一个形状为 (3, 4, 5) 的张量变形为一个形状为 (4, 15) 的张量:

import numpy as np# 创建一个形状为 (3, 4, 5) 的张量
x = np.zeros((3, 4, 5))# 将张量变形为 (4, 15)
y = np.reshape(x, (4, 15))print(y.shape)

输出结果为:

(4, 15)

可以看到,将一个形状为 (3, 4, 5) 的张量变形为一个形状为 (4, 15) 的张量,可以通过reshape函数实现。


import timeimport numpy as npdef naive_relu(x):assert len(x.shape) == 2x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] == max(x[i, j], 0)return xdef naive_add(x, y):assert len(x.shape) == 2assert len(x.shape) == len(y.shape)x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] += y[i, j]return xx = np.random.random((20, 100))
y = np.random.random((20, 100))t0 = time.time()
for _ in range(1000):z = x + y # 逐元素加法z = np.maximum(z, 0.) # 逐元素relu
print("Took: {0:.6f}s".format(time.time() - t0)) # Took: 0.003999st1 = time.time()
for _ in range(1000):z = naive_add(x, y)z = naive_relu(z)
print("Took: {0:.6f}s".format(time.time() - t1)) # Took: 1.# 张量-广播
x1 = np.random.random((32, 10))
y1 = np.random.random((10,))
y1 = np.expand_dims(y1, axis=0) # 向y添加第一个轴,y形状变为(1, 10)
y1 = np.concatenate([y1] * 32, axis=0) # 将y沿0轴重复32次,y形状变为(32, 10)
print(x1.shape)
print(y1.shape)
z1 = x1 + y1
print(z1.shape)x2 = np.random.random((64, 3, 32, 10))
y2 = np.random.random((32, 10))
z2 = np.maximum(x2, y2)
print(z2.shape) # (64, 3, 32, 10), 较小的张量沿着新轴重复,使其形状与较大张量相同# 张量积
x3 = np.random.random((32,))
y3 = np.random.random((32,))
z3 = np.dot(x3, y3) # np.dot函数实现张量积
z3_kron = np.kron(x3, y3)
print(z3)
print(z3.shape)
print(z3_kron)
print(z3_kron.shape)# 张量变形
x4 = np.array([[0,1],[2,3],[4,5]
])
print(x4.shape)
x4 = x4.reshape((6,1))
print(x4)
x4 = x4.reshape((2,3))
print(x4)
x4 = np.transpose(x4) # 张量变形转置 transpose
print(x4)'''
Took: 0.003009s
Took: 1.186019s
(32, 10)
(32, 10)
(32, 10)
(64, 3, 32, 10)
8.511367569092966
()
[0.25574184 0.37984405 0.49594514 ... 0.22045196 0.20238244 0.02395447]
(1024,)
(3, 2)
[[0][1][2][3][4][5]]
[[0 1 2][3 4 5]]
[[0 3][1 4][2 5]]Process finished with exit code 0'''


http://www.ppmy.cn/news/699026.html

相关文章

如何读取社保卡基本信息?即无需验证密码的信息!

社会保障(个人)卡规范 //更多请阅读 《社会保障(个人)卡规范》 //cls in const unsigned char Coco_MF[2] { 0x3f,0x00 };//MF 主文件const unsigned char Coco_Response[2] { 0x00,0xC0 };//取得响应数据 ISO const unsigned …

用户卡的发展变革

摘要:全球手机用户总数接近30亿,用户卡在其中扮演着举足轻重的角色。作为一类特殊的智能卡,用户卡现已集中了智能卡领域的多项先进技术,推动着技术和标准化的发展,丰富着移动用户的生活。随着多应用、非接触智能卡技术…

IBC密码技术分析研究

一、传统的PKI系统 PKI(公开密钥基础设施,Public Key Infrastructure)是以不对称密匙加密技术为基础,以数据机密性、完整性、身份认证和行为不可抵赖性为安全目的,来实施和提供安全服务的具有普适性的安全基础设施。其内容包括数字证书、…

CPU卡片结构

CPU卡卡片结构 非接触CPU卡芯片,产品支持ISO14443-A协议,CPU指令兼容通用8051指令,内置硬件DES协处理器, 数据存储器为8Kbyte的EEPROM。该芯片符合中国人民银行PBOC2.0电子存折/电子钱包规范,建设事业CPU卡芯片规范。 …

IC卡

本词条由 “科普中国”百科科学词条编写与应用工作项目 审核 。 IC卡 (Integrated Circuit Card,集成电路卡),也称智能卡(Smart card)、智慧卡(Intelligent card)、微电路卡(Microcircuit card)或微芯片卡等。它是将一个 微电子 芯片嵌入符合ISO 7816标准…

社保系列6《账户划入交易》

通过账户划入交易,持卡人可将其在基本医疗保险个人账户上的资金划入卡内基本医疗保险个人账户中。 特点: 1) 终端上联网进行 2) 提交个人密码(PIN)(如持卡人设置) 步骤: 1) …

社保、公积金查询方式

社保、公积金查询方式 社保查询步骤: 1. 登陆网站: 北京市社会保险网上服务平台:http://www.bjld.gov.cn/csibiz/home/ 2. 选择右侧个人用户登录 3. 已注册账号可直接选择登陆,未注册过需要先行注册后登陆。 如…

程序员的密码管理之道

承香墨影 最快捷的技术进阶之路 正文共: 1474字 5图 预计阅读时间: 4分钟 Hi,大家好,我是承香墨影! 在这个互联网服务,渗透到我们生活的方方面面的时代,我想每个人手里都有大量的账号&#xff0…