详细分析Python中Tensor基本知识
目录
前言
后续发
1. 基本知识
Tensor是深度学习中广泛使用的数据结构,是多维数组或矩阵的泛化
在深度学习框架中,如TensorFlow和PyTorch,Tensor被用来表示输入数据、模型参数和输出数据
Tensor可以包含不同数据类型的元素,如整数、浮点数等
常见的数据类型包括float32、float64、int32、int64等
Tensor的形状描述了其维度和每个维度的大小
例如,一个形状为(3, 2)的Tensor表示一个3行2列的矩阵
Tensor的维度指的是它所包含的轴的数量
标量(Scalar)是0维的,向量(Vector)是1维的,矩阵是2维的,以此类推
可以通过直接指定数据创建Tensor,也可以通过操作其他Tensor创建新的Tensor
可以对Tensor进行各种数学运算和逻辑运算,如加法、乘法、求和、平均值、转置等
可以通过索引和切片操作来访问Tensor中的特定元素或子集
在进行元素级运算时,如果两个Tensor的形状不匹配,系统会自动进行广播,使它们的形状相容
Tensor通常用于表示模型的参数和梯度
框架会自动跟踪Tensor的梯度,并用于反向传播算法进行参数更新
注意事项:
合适的初始化方法可以加速模型收敛并提高训练效果
原地操作可以节省内存,但可能会影响梯度计算或破坏计算图结构,因此需要谨慎使用
常见的场景:
- 图像生成和处理:使用Tensor进行图像生成和处理是一个常见的应用
可以使用Tensor表示图像数据,并利用深度学习模型进行图像生成、风格转换、目标检测等任务 - 自然语言处理:在自然语言处理任务中,可以使用Tensor表示文本数据,如单词、句子或文档
可以使用Tensor表示词嵌入(Word Embeddings),并应用于文本分类、情感分析、命名实体识别等任务 - 序列建模:序列数据(如时间序列、音频序列等)也可以表示为Tensor
可以使用循环神经网络(RNN)或长短期记忆网络(LSTM)等模型对序列数据进行建模和预测 - 生成对抗网络(GAN):生成对抗网络是一种用于生成逼真图像的模型
可以使用Tensor表示生成器和判别器的输入和输出,并通过对抗训练来生成逼真的图像
2. Demo
- 加载了MNIST手写数字数据集,并定义了一个简单的神经网络模型(一个具有一个隐藏层的全连接神经网络)
- 定义损失函数(交叉熵损失)和优化器(随机梯度下降),并利用训练数据对模型进行训练
- 在每个训练迭代中,计算模型输出与真实标签之间的损失,然后使用反向传播算法更新模型参数
- 在整个训练集上迭代了5次,完成了模型的训练
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
# 加载手写数字数据集
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
# 定义简单的神经网络模型
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28 * 28, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 28 * 28) # 将输入展平成向量
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 初始化模型、损失函数和优化器
net = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(5): # 迭代5轮
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad() # 梯度清零
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 1000 == 999: # 每1000个batch打印一次损失值
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 1000))
running_loss = 0.0
print('Finished Training')
截图如下:
作者:码农研究僧