python机器学习pytorch 张量基础教程

yizhihongxing

Python机器学习PyTorch 张量基础教程

本教程是关于使用Python和PyTorch进行机器学习的入门,其中重点关注了PyTorch中的张量操作。本教程适用于初学者和对机器学习感兴趣的人。

安装PyTorch

在开始之前,您需要安装PyTorch。在Linux或macOS系统上,您可以使用以下命令进行安装:

pip install torch torchvision

如果您使用Windows系统,可以尝试使用以下命令安装:

pip3 install https://download.pytorch.org/whl/cu102/torch-1.7.0-cp38-cp38-win_amd64.whl torchvision

张量基础

在PyTorch中,张量是代表多维数组的核心数据类型。类似于NumPy数组,它可以包含数字、布尔值和字符串等类型。

创建张量

在PyTorch中,您可以使用torch.Tensor类来创建张量。

import torch

# 创建一个3x3的浮点型全0张量
x = torch.zeros(3, 3)

# 输出x
print(x)

这将生成一个3x3的全0张量。

tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

您还可以使用其他方法来创建不同类型和形状的张量。

import torch

# 创建一个3x3的长整型全1张量
x = torch.ones(3, 3, dtype=torch.long)

# 输出x
print(x)

这将生成一个3x3的全1张量。

tensor([[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]])

张量运算

PyTorch提供了各种张量运算,包括加法、减法、乘法和除法等。

import torch

# 创建两个张量
x = torch.ones(2, 2)
y = torch.zeros(2, 2)

# 加法
z = x + y
print(z)

# 减法
z = x - y
print(z)

# 乘法
z = x * y
print(z)

# 除法
z = x / y
print(z)

# 矩阵乘法
z = x.mm(y)
print(z)

这将分别输出加法、减法、乘法、除法和矩阵乘法的结果。

tensor([[1., 1.],
        [1., 1.]])
tensor([[1., 1.],
        [1., 1.]])
tensor([[0., 0.],
        [0., 0.]])
tensor([[inf, inf],
        [inf, inf]])
tensor([[0., 0.],
        [0., 0.]])

将张量转换为NumPy数组

您可以使用torch.Tensor.numpy()方法将张量转换为NumPy数组。

import torch
import numpy as np

# 创建一个3x3的浮点型全0张量
x = torch.zeros(3, 3)

# 将张量转换为NumPy数组
y = x.numpy()

# 输出数组
print(y)

# 检查类型
print(type(y))

这将生成一个3x3的全0数组,并将其转换为NumPy数组。

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]], dtype=float32)
<class 'numpy.ndarray'>

将NumPy数组转换为张量

同样,您也可以使用torch.from_numpy()方法将NumPy数组转换为张量。

import torch
import numpy as np

# 创建一个3x3的数组
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 将数组转换为张量
y = torch.from_numpy(x)

# 输出张量
print(y)

# 检查类型
print(type(y))

这将生成一个3x3的数组,并将其转换为张量。

tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]], dtype=torch.int32)
<class 'torch.Tensor'>

示例一:线性回归

下面的示例演示了如何使用PyTorch实现简单的线性回归模型。

import torch

# 训练数据
x_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# 定义模型
class LinearRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

# 实例化模型
model = LinearRegressionModel()

# 定义损失函数和优化器
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(500):
    # 前向传播
    y_pred = model(x_train)

    # 计算损失
    loss = criterion(y_pred, y_train)

    # 反向传播
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # 每100次迭代输出一次结果
    if (epoch+1) % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 500, loss.item()))

# 测试模型
x_test = torch.tensor([[5.0]])
y_test = model(x_test).item()
print('Prediction of x = 5: {:.2f}'.format(y_test))

该模型使用梯度下降算法来学习线性方程y=2x。在训练过程中,我们使用平均方差误差损失函数,并在每个epoch之后输出损失。在500个epoch之后,我们对该模型进行测试并计算出预测的值。

输出:

Epoch [100/500], Loss: 0.0283
Epoch [200/500], Loss: 0.0113
Epoch [300/500], Loss: 0.0045
Epoch [400/500], Loss: 0.0019
Epoch [500/500], Loss: 0.0008
Prediction of x = 5: 10.00

示例二:卷积神经网络

下面的示例演示了如何使用PyTorch实现一个简单的卷积神经网络模型,用于对MNIST数字图像进行分类。

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms

# 定义超参数
input_size = 784
hidden_size = 500
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

# 加载MNIST数据集
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 加载数据集到数据加载器
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 定义卷积神经网络模型
class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(16),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(
            nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.fc = nn.Linear(7*7*32, num_classes)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.fc(out)
        return out

# 实例化模型
model = ConvNet()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播并优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 每100个batch输出一次结果
        if (i+1) % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))

该模型包含两个卷积层和一个全连接层,使用Adam优化器和交叉熵损失函数进行训练。在每个epoch之后,它都将验证集上的准确度进行评估。

输出:

Epoch [1/5], Step [100/600], Loss: 0.3563
Epoch [1/5], Step [200/600], Loss: 0.1136
Epoch [1/5], Step [300/600], Loss: 0.0692
Epoch [1/5], Step [400/600], Loss: 0.0443
Epoch [1/5], Step [500/600], Loss: 0.1076
Epoch [1/5], Step [600/600], Loss: 0.0281
Epoch [2/5], Step [100/600], Loss: 0.0318
Epoch [2/5], Step [200/600], Loss: 0.0369
Epoch [2/5], Step [300/600], Loss: 0.0616
Epoch [2/5], Step [400/600], Loss: 0.0201
Epoch [2/5], Step [500/600], Loss: 0.0647
Epoch [2/5], Step [600/600], Loss: 0.0193
Epoch [3/5], Step [100/600], Loss: 0.0532
Epoch [3/5], Step [200/600], Loss: 0.0304
Epoch [3/5], Step [300/600], Loss: 0.0297
Epoch [3/5], Step [400/600], Loss: 0.0148
Epoch [3/5], Step [500/600], Loss: 0.0796
Epoch [3/5], Step [600/600], Loss: 0.0234
Epoch [4/5], Step [100/600], Loss: 0.0263
Epoch [4/5], Step [200/600], Loss: 0.0269
Epoch [4/5], Step [300/600], Loss: 0.0217
Epoch [4/5], Step [400/600], Loss: 0.0453
Epoch [4/5], Step [500/600], Loss: 0.0930
Epoch [4/5], Step [600/600], Loss: 0.1004
Epoch [5/5], Step [100/600], Loss: 0.0448
Epoch [5/5], Step [200/600], Loss: 0.0425
Epoch [5/5], Step [300/600], Loss: 0.0579
Epoch [5/5], Step [400/600], Loss: 0.0356
Epoch [5/5], Step [500/600], Loss: 0.0068
Epoch [5/5], Step [600/600], Loss: 0.0214
Test Accuracy of the model on the 10000 test images: 98.85 %

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python机器学习pytorch 张量基础教程 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月17日

相关文章

  • VScode中pytorch出现Module ‘torch’ has no ‘xx’ member错误

           因为代码变量太多,使用Sublime text并能很好地跳转,所以使用VsCode 神器。     导入Pytorch模块后出现了   Module ‘torch’ has no cat member,所以在网上找解决办法,这位博主的文章很好用,一路解决。        我的版本python3.7无Anacada,解决办法,打开设置,搜索pyt…

    2023年4月8日
    00
  • pytorch中的损失函数

      深度学习的优化方法直接作用的对象是损失函数。在最优化、统计学、机器学习和深度学习等领域中经常能用到损失函数。损失函数就是用来表示预测与实际数据之间的差距程度。一个最优化问题的目标是将损失函数最小化,针对分类问题,直观的表现就是分类正确的样本越多越好。在回归问题中,直观的表现就是预测值与实际值误差越小越好。   PyTorch中的nn模块提供了多种可直接使…

    PyTorch 2023年4月8日
    00
  • Pytorch 之激活函数

    1. Sigmod 函数    Sigmoid 函数是应用最广泛的非线性激活函数之一,它可以将值转换为 $0$ 和 $1$ 之间,如果原来的输出具有这样的特点:值越大,归为某类的可能性越大,    那么经过 Sigmod 函数处理的输出就可以代表属于某一类别的概率。其数学表达式为: $$y = frac{1}{1 + e^{-x}} = frac{e^{x}…

    2023年4月6日
    00
  • Pytorch 之 backward PyTorch中的backward [转]

    首先看这个自动求导的参数: grad_variables:形状与variable一致,对于y.backward(),grad_variables相当于链式法则dy。grad_variables也可以是tensor或序列。 retain_graph:反向传播需要缓存一些中间结果,反向传播之后,这些缓存就被清空,可通过指定这个参数不清空缓存,用来多次反向传播。 …

    PyTorch 2023年4月8日
    00
  • Pytorch 搭建分类回归神经网络并用GPU进行加速的例子

    PyTorch搭建分类回归神经网络并用GPU进行加速的例子 在本文中,我们将介绍如何使用PyTorch搭建分类回归神经网络,并使用GPU进行加速。本文将包含两个示例说明。 示例一:使用PyTorch搭建分类神经网络 我们可以使用PyTorch搭建分类神经网络。示例代码如下: import torch import torch.nn as nn import …

    PyTorch 2023年5月15日
    00
  • 利用Pytorch实现ResNet34网络

    利用Pytorch实现ResNet网络主要是为了学习Pytorch构建神经网络的基本方法,参考自«深度学习框架Pytorch:入门与实践»一书,作者陈云 1.什么是ResNet网络 ResNet(Deep Residual Network)深度残差网络,是由Kaiming He等人提出的一种新的卷积神经网络结构,其最重要的特点就是网络大部分是由如图一所示的残…

    2023年4月8日
    00
  • Python Pytorch gpu 分析环境配置

    Python PyTorch GPU 分析环境配置 在使用PyTorch进行深度学习分析时,我们通常会使用GPU来加速计算。本文将介绍如何配置Python PyTorch GPU分析环境,并演示两个示例。 示例一:使用conda安装PyTorch GPU版本 # 创建一个名为pytorch_env的新环境 conda create –name pytorc…

    PyTorch 2023年5月15日
    00
  • pyinstall 打包 python代码为可执行文件(pytorch)

    利用pyinstaller(4.2)打包pytorch,开始使用的python版本为3.7.4,在Ubuntu18.04上能打包成功,但在windows10上一直报错numpy.core.multiarray failed to import,尝试了很多方法,最终在import torch之前添加import numpy后打包成功。 一、代码 testTor…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部